From f7041fc227c75fdd19ad8560bf031df9753e1185 Mon Sep 17 00:00:00 2001 From: lisimin Date: Mon, 13 Sep 2021 23:33:53 +0800 Subject: [PATCH 001/304] init meta-openeuler Signed-off-by: lisimin --- meta-openeuler/classes/eulertoolchain.bbclass | 52 +++ meta-openeuler/classes/get_dl_dir.bbclass | 11 + .../classes/get_euler_config.bbclash | 15 + meta-openeuler/classes/get_rpmdeps.bbclass | 12 + meta-openeuler/classes/kernel-version.bbclass | 23 ++ meta-openeuler/conf/bblayers.conf.sample | 13 + .../conf/distro/include/tcmode-gcc-bin.inc | 28 ++ meta-openeuler/conf/distro/openeuler.conf | 79 +++++ meta-openeuler/conf/layer.conf | 22 ++ meta-openeuler/conf/local.conf.sample | 300 ++++++++++++++++++ .../conf/machine/qemu-aarch64-common.inc | 29 ++ meta-openeuler/conf/machine/qemu-aarch64.conf | 21 ++ .../conf/machine/qemu-aarch64_be.conf | 24 ++ .../conf/machine/qemu-arm-common.inc | 15 + meta-openeuler/conf/machine/qemu-arm.conf | 10 + meta-openeuler/conf/machine/qemu-arm_be.conf | 18 ++ meta-openeuler/conf/machine/qemu-common.inc | 9 + meta-openeuler/conf/templateconf.cfg | 1 + meta-openeuler/config.xml | 24 ++ .../recipes-core/images/openeuler-image.bb | 51 +++ .../pseudo/pseudo_git.bbappend | 48 +++ 21 files changed, 805 insertions(+) create mode 100644 meta-openeuler/classes/eulertoolchain.bbclass create mode 100644 meta-openeuler/classes/get_dl_dir.bbclass create mode 100644 meta-openeuler/classes/get_euler_config.bbclash create mode 100644 meta-openeuler/classes/get_rpmdeps.bbclass create mode 100644 meta-openeuler/classes/kernel-version.bbclass create mode 100644 meta-openeuler/conf/bblayers.conf.sample create mode 100644 meta-openeuler/conf/distro/include/tcmode-gcc-bin.inc create mode 100644 meta-openeuler/conf/distro/openeuler.conf create mode 100644 meta-openeuler/conf/layer.conf create mode 100644 meta-openeuler/conf/local.conf.sample create mode 100644 meta-openeuler/conf/machine/qemu-aarch64-common.inc create mode 100644 meta-openeuler/conf/machine/qemu-aarch64.conf create mode 100644 meta-openeuler/conf/machine/qemu-aarch64_be.conf create mode 100644 meta-openeuler/conf/machine/qemu-arm-common.inc create mode 100644 meta-openeuler/conf/machine/qemu-arm.conf create mode 100644 meta-openeuler/conf/machine/qemu-arm_be.conf create mode 100644 meta-openeuler/conf/machine/qemu-common.inc create mode 100644 meta-openeuler/conf/templateconf.cfg create mode 100644 meta-openeuler/config.xml create mode 100644 meta-openeuler/recipes-core/images/openeuler-image.bb create mode 100644 meta-openeuler/recipes-devtools/pseudo/pseudo_git.bbappend diff --git a/meta-openeuler/classes/eulertoolchain.bbclass b/meta-openeuler/classes/eulertoolchain.bbclass new file mode 100644 index 00000000000..52355216c9b --- /dev/null +++ b/meta-openeuler/classes/eulertoolchain.bbclass @@ -0,0 +1,52 @@ +def eulertoolchain_raw_prefix(arch): + raw_prefix_dict = { + "arm" : "arm-linux-gnueabi", + "aarch64" : "aarch64-linux-gnu", + } + return raw_prefix_dict[arch] + +def eulertoolchain_euler_prefix(arch): + euler_prefix_dict = { + "arm" : "arm-openeuler-linux", + "aarch64" : "aarch64-openeuler-linux", + } + return euler_prefix_dict[arch] + +def eulertoolchain_prefix_to_arch(prefix): + return prefix.split('-')[0] + +def eulertoolchain_euler_prefix_to_raw(euler_prefix): + arch = eulertoolchain_prefix_to_arch(euler_prefix) + return eulertoolchain_raw_prefix(arch) + +python eulertoolchain_virtclass_handler () { + cls = e.data.getVar("BBEXTENDCURR") + variant = e.data.getVar("BBEXTENDVARIANT") + if cls != "eulertoolchain" or not variant: + return + + e.data.setVar("PN", e.data.getVar("PN", False) + '-' + variant) + e.data.setVar("TARGET_ARCH", variant) + + e.data.setVar("EULER_TOOLCHAIN_SYSNAME", eulertoolchain_raw_prefix(variant)) + e.data.setVar("EULER_TOOLCHAIN_TARGET_PREFIX", eulertoolchain_euler_prefix(variant) + '-') + e.data.setVar("EULER_TOOLCHAIN_TARGET_PREFIX_RAW", eulertoolchain_euler_prefix(variant)) + + e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + + ":{}".format(variant.replace('_', '-'))) +} + +addhandler eulertoolchain_virtclass_handler +eulertoolchain_virtclass_handler[eventmask] = "bb.event.RecipePreFinalise" + +#_HMTOOLCHAIN_SUPPORT_ARCHS := "aarch64 aarch64_be arm armeb" +_HMTOOLCHAIN_SUPPORT_ARCHS := "aarch64 arm" + +def toolchain_bbclassextend(d, cls, variant): + support_archs = d.getVar("_HMTOOLCHAIN_SUPPORT_ARCHS", True) + exts = [] + for arch in support_archs.split(): + exts.append('{}:{}{}'.format(cls, variant, arch)) + return ' '.join(exts) + +BBCLASSEXTEND = "${@toolchain_bbclassextend(d, 'eulertoolchain', '')}" diff --git a/meta-openeuler/classes/get_dl_dir.bbclass b/meta-openeuler/classes/get_dl_dir.bbclass new file mode 100644 index 00000000000..1c43639c3d5 --- /dev/null +++ b/meta-openeuler/classes/get_dl_dir.bbclass @@ -0,0 +1,11 @@ +python set_dldir() { + import subprocess + dl_dir = d.getVar('DL_DIR', True) + oeroot = d.getVar('COREBASE', True) + srctopdir = os.path.abspath(os.path.dirname(oeroot)) + if not dl_dir or dl_dir == "downloads": + d.setVar('DL_DIR', srctopdir) +} + +addhandler set_dldir +set_dldir[eventmask] = "bb.event.RecipePreFinalise" diff --git a/meta-openeuler/classes/get_euler_config.bbclash b/meta-openeuler/classes/get_euler_config.bbclash new file mode 100644 index 00000000000..25bccd9ea23 --- /dev/null +++ b/meta-openeuler/classes/get_euler_config.bbclash @@ -0,0 +1,15 @@ +python set_rpmdeps() { + import subprocess + configfile = d.getVar('EULER_CONFIG_FILE', True) + if not configfile: + oeroot = d.getVar('COREBASE', True) + euler_meta = os.path.join(os.path.abspath(os.path.dirname(oeroot)), "meta-openeuler") + d.setVar('DL_DIR', os.path.abspath(os.path.dirname(oeroot))) + rpmdeps = subprocess.Popen('rpm --eval="%{_rpmconfigdir}"', shell=True, stdout=subprocess.PIPE) + stdout, stderr = rpmdeps.communicate() + d.setVar('RPMDEPS', os.path.join(str(stdout, "utf-8").strip(), "rpmdeps")) + #bb.warn("xxxxxxxxxxxxxxxxxx xxxxRPMDEPS=%s"%d.getVar('RPMDEPS', True)) +} + +addhandler set_rpmdeps +set_rpmdeps[eventmask] = "bb.event.RecipePreFinalise" diff --git a/meta-openeuler/classes/get_rpmdeps.bbclass b/meta-openeuler/classes/get_rpmdeps.bbclass new file mode 100644 index 00000000000..28583665bb2 --- /dev/null +++ b/meta-openeuler/classes/get_rpmdeps.bbclass @@ -0,0 +1,12 @@ +python set_rpmdeps() { + import subprocess + rpmdeps = d.getVar('RPMDEPS', True) + if not rpmdeps: + rpmdeps = subprocess.Popen('rpm --eval="%{_rpmconfigdir}"', shell=True, stdout=subprocess.PIPE) + stdout, stderr = rpmdeps.communicate() + d.setVar('RPMDEPS', os.path.join(str(stdout, "utf-8").strip(), "rpmdeps")) + #bb.warn("xxxxxxxxxxxxxxxxxx xxxxRPMDEPS=%s"%d.getVar('RPMDEPS', True)) +} + +addhandler set_rpmdeps +set_rpmdeps[eventmask] = "bb.event.RecipePreFinalise" diff --git a/meta-openeuler/classes/kernel-version.bbclass b/meta-openeuler/classes/kernel-version.bbclass new file mode 100644 index 00000000000..188aa130ab7 --- /dev/null +++ b/meta-openeuler/classes/kernel-version.bbclass @@ -0,0 +1,23 @@ +def get_kernelversion_headers(p): + import re + + fn = p + '/include/linux/utsrelease.h' + if not os.path.isfile(fn): + # after 2.6.33-rc1 + fn = p + '/include/generated/utsrelease.h' + if not os.path.isfile(fn): + fn = p + '/include/linux/version.h' + + try: + f = open(fn, 'r') + except IOError: + return None + + l = f.readlines() + f.close() + r = re.compile("#define UTS_RELEASE \"(.*)\"") + for s in l: + m = r.match(s) + if m: + return m.group(1).replace("+", "") + return None diff --git a/meta-openeuler/conf/bblayers.conf.sample b/meta-openeuler/conf/bblayers.conf.sample new file mode 100644 index 00000000000..fe99672effa --- /dev/null +++ b/meta-openeuler/conf/bblayers.conf.sample @@ -0,0 +1,13 @@ +# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf +# changes incompatibly +POKY_BBLAYERS_CONF_VERSION = "2" + +BBPATH = "${TOPDIR}" +BBFILES ?= "" + +BBLAYERS ?= " \ + ##OEROOT##/meta \ + ##OEROOT##/meta-poky \ + ##OEROOT##/meta-yocto-bsp \ + ##OEROOT##/../meta-openeuler \ + " diff --git a/meta-openeuler/conf/distro/include/tcmode-gcc-bin.inc b/meta-openeuler/conf/distro/include/tcmode-gcc-bin.inc new file mode 100644 index 00000000000..607d2bddd9e --- /dev/null +++ b/meta-openeuler/conf/distro/include/tcmode-gcc-bin.inc @@ -0,0 +1,28 @@ +PREFERRED_PROVIDER_gmp-native = "gcc-bin-toolchain-cross-${TARGET_ARCH}" +PREFERRED_PROVIDER_libmpc-native = "gcc-bin-toolchain-cross-${TARGET_ARCH}" +PREFERRED_PROVIDER_mpfr-native = "gcc-bin-toolchain-cross-${TARGET_ARCH}" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}binutils = "gcc-bin-toolchain-cross-${TARGET_ARCH}" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc = "gcc-bin-toolchain-cross-${TARGET_ARCH}" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}g++ = "gcc-bin-toolchain-cross-${TARGET_ARCH}" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}compilerlibs = "gcc-bin-toolchain-compilerlibs-${TARGET_ARCH}" +PREFERRED_PROVIDER_gcc-runtime = "gcc-bin-toolchain-compilerlibs-${TARGET_ARCH}" +PREFERRED_PROVIDER_virtual/libc = "glibc" +PREFERRED_PROVIDER_virtual/libc-headers = "linux-libc-headers" +PREFERRED_PROVIDER_libstdc++ = "gcc-bin-toolchain-compilerlibs-${TARGET_ARCH}" +PREFERRED_PROVIDER_libgcc-initial = "gcc-bin-toolchain-compilerlibs-${TARGET_ARCH}" + +# PREFERRED_PROVIDER_libgcc-initial = "gcc-bin-toolchain-libgcc" +# PREFERRED_PROVIDER_libgcc = "gcc-bin-toolchain-libgcc" +# PREFERRED_PROVIDER_compiler-rt = "gcc-bin-toolchain-libgcc" +# PREFERRED_PROVIDER_libunwind-llvm = "gcc-bin-toolchain-libgcc" +# PREFERRED_PROVIDER_libcxx = "gcc-bin-toolchain-runtime" +# PREFERRED_PROVIDER_libcxxabi = "gcc-bin-toolchain-runtime" + +GCCVERSION = "7.3.0" + +PATH:append = ":${COMPONENTS_DIR}/${BUILD_ARCH}/gcc-bin-toolchain-cross-${TARGET_ARCH}/usr/bin" + +#cannot set with linaro gcc,set it null +DEBUG_PREFIX_MAP = "" +#STAGING_DIR_TARGET:arm = "/usr1/openeuler/gcc/sysroot-glibc-linaro-2.25-2018.05-arm-linux-gnueabi" +#STAGING_DIR_TARGET:aarch64 = "/usr1/openeuler/gcc/sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu" diff --git a/meta-openeuler/conf/distro/openeuler.conf b/meta-openeuler/conf/distro/openeuler.conf new file mode 100644 index 00000000000..15f1ad33b24 --- /dev/null +++ b/meta-openeuler/conf/distro/openeuler.conf @@ -0,0 +1,79 @@ +DISTRO = "openeuler" +DISTRO_NAME = "Openeuler (Openeuler Project Reference Distro)" +DISTRO_VERSION = "1.0+snapshot-${METADATA_REVISION}" +DISTRO_CODENAME = "master" +SDK_VENDOR = "-openeulersdk" +SDK_VERSION = "${@d.getVar('DISTRO_VERSION').replace('snapshot-${METADATA_REVISION}', 'snapshot')}" +SDK_VERSION[vardepvalue] = "${SDK_VERSION}" + +MAINTAINER = "lisimin " + +TARGET_VENDOR = "-openeuler" + +LOCALCONF_VERSION = "2" + +# Override these in poky based distros +#OPENEULER_DEFAULT_DISTRO_FEATURES = "largefile opengl ptest multiarch wayland vulkan" +OPENEULER_DEFAULT_DISTRO_FEATURES = "" +#OPENEULER_DEFAULT_EXTRA_RDEPENDS = "packagegroup-core-boot" +#OPENEULER_DEFAULT_EXTRA_RRECOMMENDS = "kernel-module-af-packet" + +DISTRO_FEATURES ?= "${DISTRO_FEATURES_DEFAULT} ${OPENEULER_DEFAULT_DISTRO_FEATURES}" + +PREFERRED_VERSION_linux-yocto ?= "5.13%" +PREFERRED_VERSION_linux-yocto-rt ?= "5.13%" + +SDK_NAME = "${DISTRO}-${TCLIBC}-${SDKMACHINE}-${IMAGE_BASENAME}-${TUNE_PKGARCH}-${MACHINE}" +SDKPATHINSTALL = "/opt/${DISTRO}/${SDK_VERSION}" + +DISTRO_EXTRA_RDEPENDS += "${POKY_DEFAULT_EXTRA_RDEPENDS}" +DISTRO_EXTRA_RRECOMMENDS += "${POKY_DEFAULT_EXTRA_RRECOMMENDS}" + +TCLIBCAPPEND = "" +TCLIBC = "glibc" + +PREMIRRORS ??= "\ +bzr://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ +cvs://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ +git://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ +gitsm://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ +hg://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ +osc://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ +p4://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ +svn://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n" + +#SANITY_TESTED_DISTROS = "" +# add poky sanity bbclass +#INHERIT += "poky-sanity" + +# QA check settings - a little stricter than the OE-Core defaults +# (none currently necessary as we now match OE-Core) +#WARN_TO_ERROR_QA = "X" +#WARN_QA_remove = "${WARN_TO_ERROR_QA}" +#ERROR_QA_append = " ${WARN_TO_ERROR_QA}" + +#require conf/distro/include/poky-world-exclude.inc +#require conf/distro/include/no-static-libs.inc +#require conf/distro/include/yocto-uninative.inc +#require conf/distro/include/security_flags.inc +INHERIT += "uninative" + +INHERIT += "reproducible_build" + +BB_SIGNATURE_HANDLER ?= "OEEquivHash" +BB_HASHSERVE ??= "auto" + +#set binary gcc,not effect?? +#TCMODE = "gcc-bin" +PREFERRED_PROVIDER_virtual/kernel = "linux-openeuler" +#add by lisimin,delete depends +#UNINATIVE_CHECKSUM[x86_64] = "dead" +#UNINATIVE_URL = "unset" +LOCAL_SRC_DIR = "${BPN}" + +INHIBIT_PACKAGE_DEBUG_SPLIT = "1" +DEPENDS:remove += "cmake-native ninja-native" +#DL_DIR = "${LOCAL_FILES}" +DL_DIR = "downloads" +INHERIT += "get_dl_dir get_rpmdeps" +do_fetch[file-checksums] = "" diff --git a/meta-openeuler/conf/layer.conf b/meta-openeuler/conf/layer.conf new file mode 100644 index 00000000000..5278e3d603b --- /dev/null +++ b/meta-openeuler/conf/layer.conf @@ -0,0 +1,22 @@ +# We have a conf and classes directory, add to BBPATH +BBPATH =. "${LAYERDIR}:" + +# We have recipes-* directories, add to BBFILES +BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ + ${LAYERDIR}/recipes-*/*/*.bbappend" + +BBFILE_COLLECTIONS += "openeuler" +BBFILE_PATTERN_openeuler = "^${LAYERDIR}/" +BBFILE_PRIORITY_openeuler = "10" + +LAYERSERIES_COMPAT_openeuler = "honister" + +# This should only be incremented on significant changes that will +# cause compatibility issues with other layers +LAYERVERSION_openeuler = "13" + +LAYERDEPENDS_openeuler = "core" + +REQUIRED_POKY_BBLAYERS_CONF_VERSION = "2" + +EULER_CONFIG_FILE := '${@os.path.normpath("${LAYERDIR}/config.xml")}' diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample new file mode 100644 index 00000000000..e347f0c67fd --- /dev/null +++ b/meta-openeuler/conf/local.conf.sample @@ -0,0 +1,300 @@ +# +# This file is your local configuration file and is where all local user settings +# are placed. The comments in this file give some guide to the options a new user +# to the system might want to change but pretty much any configuration option can +# be set in this file. More adventurous users can look at local.conf.extended +# which contains other examples of configuration which can be placed in this file +# but new users likely won't need any of them initially. +# +# Lines starting with the '#' character are commented out and in some cases the +# default values are provided as comments to show people example syntax. Enabling +# the option is a question of removing the # character and making any change to the +# variable as required. + +# +# Machine Selection +# +# You need to select a specific machine to target the build with. There are a selection +# of emulated machines available which can boot and run in the QEMU emulator: +# +#MACHINE ?= "qemuarm" +#MACHINE ?= "qemuarm64" +#MACHINE ?= "qemumips" +#MACHINE ?= "qemumips64" +#MACHINE ?= "qemuppc" +#MACHINE ?= "qemux86" +#MACHINE ?= "qemux86-64" +# +# There are also the following hardware board target machines included for +# demonstration purposes: +# +#MACHINE ?= "beaglebone-yocto" +#MACHINE ?= "genericx86" +#MACHINE ?= "genericx86-64" +#MACHINE ?= "edgerouter" +# +# This sets the default machine to be qemux86-64 if no other machine is selected: +MACHINE ??= "qemu-aarch64" + +# +# Where to place downloads +# +# During a first build the system will download many different source code tarballs +# from various upstream projects. This can take a while, particularly if your network +# connection is slow. These are all stored in DL_DIR. When wiping and rebuilding you +# can preserve this directory to speed up this part of subsequent builds. This directory +# is safe to share between multiple builds on the same machine too. +# +# The default is a downloads directory under TOPDIR which is the build directory. +# +#DL_DIR ?= "${TOPDIR}/downloads" + +# +# Where to place shared-state files +# +# BitBake has the capability to accelerate builds based on previously built output. +# This is done using "shared state" files which can be thought of as cache objects +# and this option determines where those files are placed. +# +# You can wipe out TMPDIR leaving this directory intact and the build would regenerate +# from these files if no changes were made to the configuration. If changes were made +# to the configuration, only shared state files where the state was still valid would +# be used (done using checksums). +# +# The default is a sstate-cache directory under TOPDIR. +# +#SSTATE_DIR ?= "${TOPDIR}/sstate-cache" + +# +# Where to place the build output +# +# This option specifies where the bulk of the building work should be done and +# where BitBake should place its temporary files and output. Keep in mind that +# this includes the extraction and compilation of many applications and the toolchain +# which can use Gigabytes of hard disk space. +# +# The default is a tmp directory under TOPDIR. +# +#TMPDIR = "${TOPDIR}/tmp" + +# +# Default policy config +# +# The distribution setting controls which policy settings are used as defaults. +# The default value is fine for general Yocto project use, at least initially. +# Ultimately when creating custom policy, people will likely end up subclassing +# these defaults. +# +DISTRO ?= "openeuler" +# As an example of a subclass there is a "bleeding" edge policy configuration +# where many versions are set to the absolute latest code from the upstream +# source control systems. This is just mentioned here as an example, its not +# useful to most new users. +# DISTRO ?= "poky-bleeding" + +# +# Package Management configuration +# +# This variable lists which packaging formats to enable. Multiple package backends +# can be enabled at once and the first item listed in the variable will be used +# to generate the root filesystems. +# Options are: +# - 'package_deb' for debian style deb files +# - 'package_ipk' for ipk files are used by opkg (a debian style embedded package manager) +# - 'package_rpm' for rpm style packages +# E.g.: PACKAGE_CLASSES ?= "package_rpm package_deb package_ipk" +# We default to rpm: +PACKAGE_CLASSES ?= "package_rpm" + +# +# SDK target architecture +# +# This variable specifies the architecture to build SDK items for and means +# you can build the SDK packages for architectures other than the machine you are +# running the build on (i.e. building i686 packages on an x86_64 host). +# Supported values are i686, x86_64, aarch64 +#SDKMACHINE ?= "i686" + +# +# Extra image configuration defaults +# +# The EXTRA_IMAGE_FEATURES variable allows extra packages to be added to the generated +# images. Some of these options are added to certain image types automatically. The +# variable can contain the following options: +# "dbg-pkgs" - add -dbg packages for all installed packages +# (adds symbol information for debugging/profiling) +# "src-pkgs" - add -src packages for all installed packages +# (adds source code for debugging) +# "dev-pkgs" - add -dev packages for all installed packages +# (useful if you want to develop against libs in the image) +# "ptest-pkgs" - add -ptest packages for all ptest-enabled packages +# (useful if you want to run the package test suites) +# "tools-sdk" - add development tools (gcc, make, pkgconfig etc.) +# "tools-debug" - add debugging tools (gdb, strace) +# "eclipse-debug" - add Eclipse remote debugging support +# "tools-profile" - add profiling tools (oprofile, lttng, valgrind) +# "tools-testapps" - add useful testing tools (ts_print, aplay, arecord etc.) +# "debug-tweaks" - make an image suitable for development +# e.g. ssh root access has a blank password +# There are other application targets that can be used here too, see +# meta/classes/image.bbclass and meta/classes/core-image.bbclass for more details. +# We default to enabling the debugging tweaks. +EXTRA_IMAGE_FEATURES ?= "debug-tweaks" + +# +# Additional image features +# +# The following is a list of additional classes to use when building images which +# enable extra features. Some available options which can be included in this variable +# are: +# - 'buildstats' collect build statistics +USER_CLASSES ?= "buildstats" + +# +# Runtime testing of images +# +# The build system can test booting virtual machine images under qemu (an emulator) +# after any root filesystems are created and run tests against those images. It can also +# run tests against any SDK that are built. To enable this uncomment these lines. +# See classes/test{image,sdk}.bbclass for further details. +#IMAGE_CLASSES += "testimage testsdk" +#TESTIMAGE_AUTO:qemuall = "1" + +# +# Interactive shell configuration +# +# Under certain circumstances the system may need input from you and to do this it +# can launch an interactive shell. It needs to do this since the build is +# multithreaded and needs to be able to handle the case where more than one parallel +# process may require the user's attention. The default is iterate over the available +# terminal types to find one that works. +# +# Examples of the occasions this may happen are when resolving patches which cannot +# be applied, to use the devshell or the kernel menuconfig +# +# Supported values are auto, gnome, xfce, rxvt, screen, konsole (KDE 3.x only), none +# Note: currently, Konsole support only works for KDE 3.x due to the way +# newer Konsole versions behave +#OE_TERMINAL = "auto" +# By default disable interactive patch resolution (tasks will just fail instead): +PATCHRESOLVE = "noop" + +# +# Disk Space Monitoring during the build +# +# Monitor the disk space during the build. If there is less that 1GB of space or less +# than 100K inodes in any key build location (TMPDIR, DL_DIR, SSTATE_DIR), gracefully +# shutdown the build. If there is less than 100MB or 1K inodes, perform a hard abort +# of the build. The reason for this is that running completely out of space can corrupt +# files and damages the build in ways which may not be easily recoverable. +# It's necessary to monitor /tmp, if there is no space left the build will fail +# with very exotic errors. +BB_DISKMON_DIRS ??= "\ + STOPTASKS,${TMPDIR},1G,100K \ + STOPTASKS,${DL_DIR},1G,100K \ + STOPTASKS,${SSTATE_DIR},1G,100K \ + STOPTASKS,/tmp,100M,100K \ + ABORT,${TMPDIR},100M,1K \ + ABORT,${DL_DIR},100M,1K \ + ABORT,${SSTATE_DIR},100M,1K \ + ABORT,/tmp,10M,1K" + +# +# Shared-state files from other locations +# +# As mentioned above, shared state files are prebuilt cache data objects which can be +# used to accelerate build time. This variable can be used to configure the system +# to search other mirror locations for these objects before it builds the data itself. +# +# This can be a filesystem directory, or a remote url such as http or ftp. These +# would contain the sstate-cache results from previous builds (possibly from other +# machines). This variable works like fetcher MIRRORS/PREMIRRORS and points to the +# cache locations to check for the shared objects. +# NOTE: if the mirror uses the same structure as SSTATE_DIR, you need to add PATH +# at the end as shown in the examples below. This will be substituted with the +# correct path within the directory structure. +#SSTATE_MIRRORS ?= "\ +#file://.* http://someserver.tld/share/sstate/PATH;downloadfilename=PATH \n \ +#file://.* file:///some/local/dir/sstate/PATH" + +# +# Yocto Project SState Mirror +# +# The Yocto Project has prebuilt artefacts available for its releases, you can enable +# use of these by uncommenting the following line. This will mean the build uses +# the network to check for artefacts at the start of builds, which does slow it down +# equally, it will also speed up the builds by not having to build things if they are +# present in the cache. It assumes you can download something faster than you can build it +# which will depend on your network. +# +#SSTATE_MIRRORS ?= "file://.* http://sstate.yoctoproject.org/2.5/PATH;downloadfilename=PATH" + +# +# Qemu configuration +# +# By default native qemu will build with a builtin VNC server where graphical output can be +# seen. The line below enables the SDL UI frontend too. +#PACKAGECONFIG:append:pn-qemu-system-native = " sdl" +# By default libsdl2-native will be built, if you want to use your host's libSDL instead of +# the minimal libsdl built by libsdl2-native then uncomment the ASSUME_PROVIDED line below. +#ASSUME_PROVIDED += "libsdl2-native" + +# You can also enable the Gtk UI frontend, which takes somewhat longer to build, but adds +# a handy set of menus for controlling the emulator. +#PACKAGECONFIG:append:pn-qemu-system-native = " gtk+" + +# +# Hash Equivalence +# +# Enable support for automatically running a local hash equivalence server and +# instruct bitbake to use a hash equivalence aware signature generator. Hash +# equivalence improves reuse of sstate by detecting when a given sstate +# artifact can be reused as equivalent, even if the current task hash doesn't +# match the one that generated the artifact. +# +# A shared hash equivalent server can be set with ":" format +# +#BB_HASHSERVE = "auto" +#BB_SIGNATURE_HANDLER = "OEEquivHash" + +# +# Memory Resident Bitbake +# +# Bitbake's server component can stay in memory after the UI for the current command +# has completed. This means subsequent commands can run faster since there is no need +# for bitbake to reload cache files and so on. Number is in seconds, after which the +# server will shut down. +# +#BB_SERVER_TIMEOUT = "60" + +# CONF_VERSION is increased each time build/conf/ changes incompatibly and is used to +# track the version of this file when it was generated. This can safely be ignored if +# this doesn't mean anything to you. +CONF_VERSION = "2" +HOSTTOOLS += "patchelf python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja automake-1.13 xz" +HOSTTOOLS:remove += "diffstat lz4c pzstd" +SANITY_REQUIRED_UTILITIES:remove += "diffstat chrpath" +CONNECTIVITY_CHECK_URIS = "" +#PREFERRED_VERSION_linux-yocto = "5.10%" +ASSUME_PROVIDED += "rpm-native dwarfsrcfiles-native depmodwrapper-cross kmod-native bc-native bison-native make-native gperf-native pigz-native pbzip2-native ldconfig-native xz-native makedevs-native alsa-lib-native perl-native qemu-native chrpath-native kern-tools-native gmp-native libsdl2-native mesa-native virglrenderer-native pixman-native texinfo-dummy-native python3-native python3-setuptools-native gettext-native m4-native flex-native unifdef-native rsync-native init-system-helpers automake-native autoconf-native libtool-native opkg-utils-native patch-native pkgconfig-native init-system-helpers update-rc.d-native initscripts run-postinsts" +PATCHTOOL = "patch" +TCMODE = "gcc-bin" +INHERIT:remove += "uninative" +PATCHDEPENDENCY:remove += "patch-replacement-native:do_populate_sysroot" +PREMIRRORS = "\ +bzr://.*/.* file:////usr1/openeuler/src \n \ +cvs://.*/.* file:////usr1/openeuler/src \n \ +git://.*/.* file:////usr1/openeuler/src \n \ +hg://.*/.* file:////usr1/openeuler/src \n \ +osc://.*/.* file:////usr1/openeuler/src \n \ +p4://.*/.* file:////usr1/openeuler/src \n \ +svn://.*/.* file:////usr1/openeuler/src \n \ +ftp://.*/.* file:////usr1/openeuler/src \n \ +http://.*/.* file:////usr1/openeuler/src \n \ +https://.*/.* file:////usr1/openeuler/src \n" + +#not add PR in workpath +#PF = "${PN}-${EXTENDPE}${PV}" +#STAMP = "${STAMPS_DIR}/${MULTIMACH_TARGET_SYS}/${PN}/${EXTENDPE}${PV}" +#WORKDIR = "${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}/${PN}/${EXTENDPE}${PV}" +LOCAL_SYSROOT_DL_DIR = "/usr1/openeuler/gcc/" diff --git a/meta-openeuler/conf/machine/qemu-aarch64-common.inc b/meta-openeuler/conf/machine/qemu-aarch64-common.inc new file mode 100644 index 00000000000..d20a003bfc0 --- /dev/null +++ b/meta-openeuler/conf/machine/qemu-aarch64-common.inc @@ -0,0 +1,29 @@ +# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. +# Description: Config for arm64 machine +# Author: Huawei OS Kernel Lab +# Create: Sat Aug 29 01:15:17 2020 + +MACHINEOVERRIDES =. "march64:" +require conf/machine/qemu-common.inc + +# Different from arm32, here we use armv8a.inc instead +# of conf/machine/include/tune-cortexa53.inc because +# we are not sure our CPU is cortex a53. +require conf/machine/include/arm/arch-armv8a.inc + +# but we are sure in compat32 we should use -mcpu=cortexa9. +# This is may not correct, but to make sure compat32 and arm32 +# give same binary. +# Should not use conf/machine/include/tune-cortexa9.inc directly. +# In case when using compat32, we alert cflags with same way in tune-cortexa9.inc + +TUNE_CCARGS .= "${@bb.utils.contains('TUNE_FEATURES', 'cortexa9', ' -mtune=cortex-a9', '', d)}" +MACHINEOVERRIDES =. "${@bb.utils.contains('TUNE_FEATURES', 'cortexa9', 'armv7a:', '' ,d)}" + +COMPAT32_MACHINEOVERRIDES_DEL =. "march64:" +COMPAT32_MACHINEOVERRIDES_ADD =. "march32:" +COMPAT32_TUNE_FEATURES_APPEND += " cortexa9" +COMPAT32_TUNE_FEATURES_REMOVE += " vfp" + +HMKERNEL_ARCH_march64 = 'aarch64' +HMKERNEL_ARCH_compat32 = 'arm' diff --git a/meta-openeuler/conf/machine/qemu-aarch64.conf b/meta-openeuler/conf/machine/qemu-aarch64.conf new file mode 100644 index 00000000000..6d6bd10baea --- /dev/null +++ b/meta-openeuler/conf/machine/qemu-aarch64.conf @@ -0,0 +1,21 @@ +# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. +# Description: Machine description for little-endian aarch64 +# Author: Huawei OS Kernel Lab +# Create: Sat Aug 29 02:49:36 2020 + +MACHINEOVERRIDES =. "march64le:" +DEFAULTTUNE = "aarch64" +require conf/machine/qemu-aarch64-common.inc + +# arm and arm64 both support -mlittle-endian so no +# need to consider compat32. +TUNE_CCARGS .= " -mlittle-endian" + +COMPAT32_MACHINEOVERRIDES_DEL =. "march64le:aarch64:qemu-aarch64:" +COMPAT32_MACHINEOVERRIDES_ADD =. "march32le:arm:qemu-arm:" +COMPAT32_DEFAULTTUNE = "armv7a" +# For SDK only. It depends on both arm64 and arm32 packages +# so require extra package arch. +PACKAGE_EXTRA_ARCHS_tune-armv7a += " armv7a" +COMPAT32_PACKAGE_EXTRA_ARCHS = "armv7a" +COMPAT32_QA_REMOVE += "arch" diff --git a/meta-openeuler/conf/machine/qemu-aarch64_be.conf b/meta-openeuler/conf/machine/qemu-aarch64_be.conf new file mode 100644 index 00000000000..cdaff7585b8 --- /dev/null +++ b/meta-openeuler/conf/machine/qemu-aarch64_be.conf @@ -0,0 +1,24 @@ +# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. +# Description: Machine description for little-endian aarch64 +# Author: Huawei OS Kernel Lab +# Create: Sat Aug 29 02:49:36 2020 + +MACHINEOVERRIDES =. "march64be:bigendian:" +DEFAULTTUNE = "aarch64_be" +require conf/machine/qemu-aarch64-common.inc + +# See comments in qemu-aarch64.conf. No need +# to consider compat32 for -mbig-endian. +TUNE_CCARGS .= " -mbig-endian" + +COMPAT32_MACHINEOVERRIDES_DEL =. "march64be:" +COMPAT32_MACHINEOVERRIDES_ADD =. "march32be:" +COMPAT32_DEFAULTTUNE = "armv7ab" + +# See conf/machine/qemu-arm_be.conf +PACKAGE_EXTRA_ARCHS_tune-armv7ab += " armv7ab" +COMPAT32_PACKAGE_EXTRA_ARCHS = "armv7ab" + +COMPAT32_QA_REMOVE += "arch" + +COMPAT32_TUNE_FEATURES_APPEND += " rruarm" diff --git a/meta-openeuler/conf/machine/qemu-arm-common.inc b/meta-openeuler/conf/machine/qemu-arm-common.inc new file mode 100644 index 00000000000..99dab0d57c1 --- /dev/null +++ b/meta-openeuler/conf/machine/qemu-arm-common.inc @@ -0,0 +1,15 @@ +# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. +# Description: Conf for arm +# Author: Huawei OS Kernel Lab +# Create: Thu Sep 10 15:06:26 2020 + +MACHINEOVERRIDES =. "march32:" +require conf/machine/qemu-common.inc +require conf/machine/include/tune-cortexa9.inc + +TUNE_FEATURES_append += " cortexa9" +TUNE_FEATURES_remove += " vfp" + +TUNE_CCARGS .= " -mno-unaligned-access" + +HMKERNEL_ARCH_march32 = 'arm' diff --git a/meta-openeuler/conf/machine/qemu-arm.conf b/meta-openeuler/conf/machine/qemu-arm.conf new file mode 100644 index 00000000000..7b7244763c8 --- /dev/null +++ b/meta-openeuler/conf/machine/qemu-arm.conf @@ -0,0 +1,10 @@ +# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. +# Description: Machine description for little-endian aarch64 +# Author: Huawei OS Kernel Lab +# Create: Sat Aug 29 02:49:36 2020 + +MACHINEOVERRIDES =. "march32le:" +DEFAULTTUNE = "armv7a" +require conf/machine/qemu-arm-common.inc + +TUNE_CCARGS .= " -mlittle-endian" diff --git a/meta-openeuler/conf/machine/qemu-arm_be.conf b/meta-openeuler/conf/machine/qemu-arm_be.conf new file mode 100644 index 00000000000..0c79ac08fd4 --- /dev/null +++ b/meta-openeuler/conf/machine/qemu-arm_be.conf @@ -0,0 +1,18 @@ +# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. +# Description: Machine description for little-endian aarch64 +# Author: Huawei OS Kernel Lab +# Create: Sat Aug 29 02:49:36 2020 + +MACHINEOVERRIDES =. "march32be:bigendian:" +DEFAULTTUNE = "armv7ab" +require conf/machine/qemu-arm-common.inc + +# A bug in yocto misses armv7ab in +# PACKAGE_EXTRA_ARCHS_tune-armv7ab (but armv7ab-vfp is there). +PACKAGE_EXTRA_ARCHS_tune-armv7ab += " armv7ab" +TUNE_CCARGS .= " -mbig-endian" + +TUNE_FEATURES_append += ' rruarm' + +ERROR_QA_remove += 'arch' +WARN_QA_remove += 'arch' diff --git a/meta-openeuler/conf/machine/qemu-common.inc b/meta-openeuler/conf/machine/qemu-common.inc new file mode 100644 index 00000000000..25c2ceda48b --- /dev/null +++ b/meta-openeuler/conf/machine/qemu-common.inc @@ -0,0 +1,9 @@ +# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. +# Description: Config for common machine +# Author: Huawei OS Kernel Lab +# Create: Sat Aug 29 01:15:17 2020 + +MACHINEOVERRIDES =. "hongmengmachine:" + +AVAILTUNES += 'rruarm' +TUNE_CCARGS .= "${@bb.utils.contains('TUNE_FEATURES', 'rruarm', ' -mno-unaligned-access -mfpu=vfpv3-d16 -mfloat-abi=soft -freg-struct-return', '', d)}" diff --git a/meta-openeuler/conf/templateconf.cfg b/meta-openeuler/conf/templateconf.cfg new file mode 100644 index 00000000000..7480a55b987 --- /dev/null +++ b/meta-openeuler/conf/templateconf.cfg @@ -0,0 +1 @@ +meta-poky/conf diff --git a/meta-openeuler/config.xml b/meta-openeuler/config.xml new file mode 100644 index 00000000000..84640a6a931 --- /dev/null +++ b/meta-openeuler/config.xml @@ -0,0 +1,24 @@ + + + /usr1/openeuler/gcc/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabi + /usr1/openeuler/gcc/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu + /opt/buildtools/cmake-3.18.3/bin/ + /opt/buildtools/python-3.9.2/bin/ + /opt/buildtools/ninja-1.10.1/bin + /opt/buildtools/gperf-3.1/bin + /opt/buildtools/patchelf-0.12/bin/ + /opt/buildtools/chrpath-0.16/bin/ + /opt/buildtools/gcc-7.3.0/bin/ + /opt/buildtools/compiler_cpu-v200r007c10b007/ + /opt/buildtools/cmake-3.18.3/bin/ + /opt/buildtools/python-3.9.2/bin/ + /opt/buildtools/ninja-1.10.1/bin + /opt/buildtools/gperf-3.1/bin + /opt/buildtools/p7zip-17.03/bin/ + + + + arm64le + arm32le + + diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb new file mode 100644 index 00000000000..88d40c6bbc5 --- /dev/null +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -0,0 +1,51 @@ +SUMMARY = "A small image just capable of allowing a device to boot." + +#IMAGE_INSTALL = "packagegroup-core-boot ${CORE_IMAGE_EXTRA_INSTALL}" +IMAGE_INSTALL = "" + +IMAGE_LINGUAS = " " + +LICENSE = "MIT" + +inherit core-image +IMAGE_TYPES = "cpio" +IMAGE_FSTYPES_DEBUGFS = "cpio" +#tar:lower version has no --sort=name +IMAGE_CMD:tar = "${IMAGE_CMD_TAR} --format=posix --numeric-owner -cf ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.tar -C ${IMAGE_ROOTFS} . || [ $? -eq 1 ]" +#not depends to update-alternatives +do_rootfs[depends] = "" +#not depends to ldconfig-native +#LDCONFIGDEPEND = "" +DEPENDS:remove += "${@' '.join(["%s-qemuwrapper-cross" % m for m in d.getVar("MULTILIB_VARIANTS").split()])} qemuwrapper-cross depmodwrapper-cross cross-localedef-native" +RPMROOTFSDEPENDS = "" +FEATURE_PACKAGES_tools-sdk:remove = " packagegroup-core-sdk packagegroup-core-standalone-sdk-target" +TOOLCHAIN_TARGET_TASK:remove += "${@multilib_pkg_extend(d, 'packagegroup-core-standalone-sdk-target')}" + +#IMAGE_ROOTFS_SIZE ?= "8192" +#IMAGE_ROOTFS_EXTRA_SPACE:append = "${@bb.utils.contains("DISTRO_FEATURES", "systemd", " + 4096", "", d)}" + +#do_package depends to command zstd +python do_package() { + bb.note("do nothing"); +} +#deltask package +#do_rootfs depends to command createrepo_c, so create an empty rootfs for do_image_tar +python do_rootfs() { + bb.note("do nothing"); +} +python do_image() { + bb.note("depends to do_rootfs"); + workdir = d.getVar("WORKDIR") + rootfs = os.path.join(workdir, "rootfs") + if not os.path.exists(rootfs): + os.makedirs(rootfs) +} + +xxdo_image_complete() { + : +} + +IMAGE_INSTALL += " \ +busybox \ +linux-openeuler \ +" diff --git a/meta-openeuler/recipes-devtools/pseudo/pseudo_git.bbappend b/meta-openeuler/recipes-devtools/pseudo/pseudo_git.bbappend new file mode 100644 index 00000000000..2614b4e344a --- /dev/null +++ b/meta-openeuler/recipes-devtools/pseudo/pseudo_git.bbappend @@ -0,0 +1,48 @@ +DEPENDS:remove += "sqlite3 attr" +XSRC_URI = "git://git.yoctoproject.org/pseudo;branch=oe-core \ + file://0001-configure-Prune-PIE-flags.patch \ + file://fallback-passwd \ + file://fallback-group \ + " +FILESPATH:prepend += "${LOCAL_FILES}:" +SRC_URI:remove:class-native = " \ + http://downloads.yoctoproject.org/mirror/sources/pseudo-prebuilt-2.33.tar.xz;subdir=git/prebuilt;name=prebuilt \ + file://older-glibc-symbols.patch" +SRC_URI:class-native = "file://pseudo \ + file://fallback-passwd \ + file://fallback-group \ + " +#BB_STRICT_CHECKSUM = "0" +PV = "1.9.0" +LIC_FILES_CHKSUM = "file://COPYING;md5=243b725d71bb5df4a1e5920b344b86ad" +LIC_FILES_CHKSUM = "file://COPYING;md5=a1d8023a6f953ac6ea4af765ff62d574" +S = "${WORKDIR}/${BPN}" +PSEUDO_EXTRA_OPTS:remove = "--enable-xattr" + +#set --with-sqlite to system host,use system headers +do_compile () { + if [ "${SITEINFO_BITS}" = "64" ]; then + ${S}/configure ${PSEUDO_EXTRA_OPTS} --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS} --with-sqlite-lib=/usr/lib --with-sqlite=/usr --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --without-rpath + else + ${S}/configure ${PSEUDO_EXTRA_OPTS} --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib --with-sqlite-lib=/usr/lib --with-sqlite=/usr --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --without-rpath + fi + oe_runmake ${MAKEOPTS} +} + +#do install使用了chrpath,需新增 +xxdo_install:append:class-native () { + xchrpath ${D}${bindir}/pseudo -r `chrpath ${D}${bindir}/pseudo | cut -d = -f 2 | sed s/XORIGIN/\\$ORIGIN/` + install -d ${D}${sysconfdir} + # The fallback files should never be modified + install -m 444 ${WORKDIR}/fallback-passwd ${D}${sysconfdir}/passwd + install -m 444 ${WORKDIR}/fallback-group ${D}${sysconfdir}/group + + # Two native/nativesdk entries below are the same + # If necessary install for the alternative machine arch. This is only + # necessary in a native build. + maybe_make32 + if $make32; then + mkdir -p ${D}${prefix}/lib/pseudo/lib + cp lib/pseudo/lib/libpseudo.so ${D}${prefix}/lib/pseudo/lib/. + fi +} -- Gitee From 0f45391af4e0e6442c602cd4d4b931361c1494f3 Mon Sep 17 00:00:00 2001 From: lisimin Date: Mon, 13 Sep 2021 23:34:49 +0800 Subject: [PATCH 002/304] add toolchain Signed-off-by: lisimin --- .../gcc/gcc-bin-toolchain-compilerlibs.bb | 123 ++++++++++++++++++ .../gcc/gcc-bin-toolchain-cross.bb | 43 ++++++ .../gcc/gcc-bin-toolchain.inc | 28 ++++ 3 files changed, 194 insertions(+) create mode 100644 meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-compilerlibs.bb create mode 100644 meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb create mode 100644 meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc diff --git a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-compilerlibs.bb b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-compilerlibs.bb new file mode 100644 index 00000000000..adfd0cd6521 --- /dev/null +++ b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-compilerlibs.bb @@ -0,0 +1,123 @@ +# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. +# Description: Extract libgcc and compiler-rt from toolchain +# Author: Huawei OS Kernel Lab +# Create: Mon Sep 07 13:39:28 2020 + +inherit eulertoolchain +require gcc-bin-toolchain.inc + +INHIBIT_DEFAULT_DEPS = "1" +DEPENDS = "virtual/${EULER_TOOLCHAIN_TARGET_PREFIX}gcc \ + virtual/${EULER_TOOLCHAIN_TARGET_PREFIX}g++" +#DEPENDS = "virtual/${TARGET_PREFIX}gcc \ +# virtual/${TARGET_PREFIX}g++" + +PROVIDES = "virtual/${EULER_TOOLCHAIN_TARGET_PREFIX}compilerlibs gcc-runtime libstdc++ libgcc-initial" +#PROVIDES = "gcc-runtime libstdc++ libgcc-initial virtual/${TARGET_PREFIX}compilerlibs" + + +# Insert lib and usr/lib into SYSROOT_DIRS so these 2 dir +# will be found by building of bb depends on this bb. It +# is required because we set BASELIB to lib32, which makes +# yocto stage lib32 and usr/lib32. However, compiler has +# built-in path to find libgcc, which is /lib or /usr/lib. +#LIBDIR_COMPAT_EXTRA = "${@ '' if not is_compat(d) else '/lib /usr/lib'}" +#SYSROOT_DIRS += "${LIBDIR_COMPAT_EXTRA}" + +do_install () { +#exit 0 + bbnote "Installing libgcc/libclang from Compiler CPU binary toolchain" + install -m 0755 -d ${D}${libdir_native}/${EULER_TOOLCHAIN_GCC_PATH_INNER} + + finddirs='' + test -d ${B}/${EULER_TOOLCHAIN_SYSNAME}/lib && finddirs="$finddirs ${B}/${EULER_TOOLCHAIN_SYSNAME}/lib" + test -d ${B}/${EULER_TOOLCHAIN_SYSNAME}/lib64 && finddirs="$finddirs ${B}/${EULER_TOOLCHAIN_SYSNAME}/lib64" + test -d ${B}/lib/${EULER_TOOLCHAIN_GCC_PATH} && finddirs="$finddirs ${B}/lib/${EULER_TOOLCHAIN_GCC_PATH}" + test -d ${B}/lib64/${EULER_TOOLCHAIN_GCC_PATH} && finddirs="$finddirs ${B}/lib64/${EULER_TOOLCHAIN_GCC_PATH}" + + find $finddirs \ + -name '*.o' \ + -o -name 'libgcc*.a' \ + -o -name 'libc++*.a' \ + -o -name 'libstdc++*.a' \ + -o -name 'libclang_rt*.a' \ + -o -name 'libunwind*.a*' \ + -o -name 'libgcc*.so*' \ + -o -name 'libc++*.so*' \ + -o -name 'libstdc++*.so*' \ + -o -name 'libclang_rt*.so*' \ + -o -name 'libunwind*.so*' | + xargs sh -c 'cp -P --preserve=mode,timestamps,links -v $@ ${D}${libdir_native}/${EULER_TOOLCHAIN_GCC_PATH_INNER}; \ + chmod 644 $1' sh + + # Remove executable permission for crt*.o to avoid being stripped + for f in ${D}${libdir_native}/${EULER_TOOLCHAIN_GCC_PATH_INNER}/*.o + do + chmod 644 $f + done + for f in ${D}${libdir_native}/${EULER_TOOLCHAIN_GCC_PATH_INNER}/*.so* + do + chmod 644 $f + done + + mkdir -p ${D}${base_libdir} + mkdir -p ${D}${libdir} + for f in ${D}${libdir_native}/${EULER_TOOLCHAIN_GCC_PATH_INNER}/*.so* + do + destdir=${libdir} + if echo $f | grep 'libgcc\|libclang_rt\|libunwind_s' + then + destdir=${base_libdir} + fi + + bn=$(basename $f) + mv $f ${D}$destdir + rel=$(realpath --relative-to=$(dirname $f) ${D}$destdir) + ln -s $rel/$bn $(dirname $f) + done + rm -r ${D}${libdir_native}/${EULER_TOOLCHAIN_SYSNAME} +} + +# Package will be called as libgcc-s1. Don't know why. +# This makes ldconfig triggered. We need to remove +# ldconfig from our DISTRO_FEATURES. +FILES_${PN} = " \ + ${base_libdir}/*.so \ + ${base_libdir}/*.so.*[0-9] \ + ${libdir}/*.so \ + ${libdir}/*.so.*[0-9] \ +" + +FILES_${PN}-dev = " \ + ${libdir_native}/${EULER_TOOLCHAIN_GCC_PATH_INNER}/*.so.* \ + ${libdir_native}/${EULER_TOOLCHAIN_GCC_PATH_INNER}/*.so \ + ${libdir_native}/${EULER_TOOLCHAIN_GCC_PATH_INNER}/*.py \ + ${base_libdir}/*.py \ + ${libdir}/*.py \ +" +FILES_${PN}-staticdev = " \ + ${libdir_native}/${EULER_TOOLCHAIN_GCC_PATH_INNER}/*.o \ + ${libdir_native}/${EULER_TOOLCHAIN_GCC_PATH_INNER}/*.a \ +" + +INSANE_SKIP = "file-rdeps ldflags arch" +# POPULATESYSROOTDEPS contains cross toolchain, which +# is different from real toolchain this compilerlib belongs to, +# in case when we are aarch64 and needs arm compilerlib for compat +# building. See staging.bbclass. +POPULATESYSROOTDEPS_class-target = "" +INHIBIT_SYSROOT_STRIP = "1" +INHIBIT_PACKAGE_DEBUG_SPLIT = "1" +INHIBIT_PACKAGE_STRIP = "1" + +ERROR_QA:remove += "dev-elf dev-so" +WARN_QA:remove += "libdir" + +INSANE_SKIP += "installed-vs-shipped" +do_package_qa[noexec] = "1" + +SYSROOT_DIRS:append =" \ + ${sublibdir} \ + ${subincludedir} \ +" +SYSROOT_DIRS_NATIVE:append = "${subbindir}" diff --git a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb new file mode 100644 index 00000000000..17e420bb2d4 --- /dev/null +++ b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb @@ -0,0 +1,43 @@ +inherit cross +inherit eulertoolchain + +require gcc-bin-toolchain.inc + +INHIBIT_DEFAULT_DEPS = "1" + +PROVIDES = "\ + virtual/${EULER_TOOLCHAIN_TARGET_PREFIX}binutils \ + virtual/${EULER_TOOLCHAIN_TARGET_PREFIX}gcc \ + virtual/${EULER_TOOLCHAIN_TARGET_PREFIX}g++ \ +" + +# Inherit cross but keep bindir/libdir/...: +bindir = "${exec_prefix}/bin/" +libdir = "${exec_prefix}/lib/" +libexecdir = "${exec_prefix}/libexec/" + +do_install:class-cross() { + install -m 0755 -d ${D}/${prefix} + cp -pPR ${B}/* ${D}/${prefix} + for f in ${D}/${prefix}/bin/${EULER_TOOLCHAIN_SYSNAME}-*; do + bin=$(basename ${f}) + lnk=$(basename ${f} | sed "s/^${EULER_TOOLCHAIN_SYSNAME}-/${EULER_TOOLCHAIN_TARGET_PREFIX}/g") + ln -svf ${bin} ${D}/${prefix}/bin/${lnk} + done + ln -svf ${EULER_TOOLCHAIN_SYSNAME} ${D}${libdir}/gcc/${EULER_TOOLCHAIN_TARGET_PREFIX_RAW} +} + +SYSROOT_DIRS += "${prefix}/${EULER_TOOLCHAIN_SYSNAME} ${exec_prefix} /usr" + +do_gcc_stash_builddir () { + : +} +addtask do_gcc_stash_builddir + +#depends by libgcc +do_packagedata () { + : +} +addtask do_packagedata + +INSANE_SKIP += "already-stripped" diff --git a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc new file mode 100644 index 00000000000..dae85767afd --- /dev/null +++ b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc @@ -0,0 +1,28 @@ +TOOLCHAIN_GCC_VERSION = "7.3.1" +LICENSE = "CLOSED" +SECTION = "toolchain" + +EULER_TOOLCHAIN_GCC_PATH_INNER = "${EULER_TOOLCHAIN_SYSNAME}/${TOOLCHAIN_GCC_VERSION}" +EULER_TOOLCHAIN_GCC_PATH = "/gcc/${EULER_TOOLCHAIN_GCC_PATH_INNER}" + +#BUILD_TOOLS = "/usr1/openeuler/gcc/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu" +python () { + import os + import platform + import subprocess + host = platform.machine() + tune = d.getVar('TARGET_ARCH', True) + config_xml = d.getVar('EULER_CONFIG_FILE', True) + cmd = 'grep "name=\\\"sdk\\\"" %s | grep "tune=\\\"%s\\\"" | grep "hostmachine=\\\"%s\\\"" | awk -F"[<>]" \'{print $3}\'' % (config_xml, tune, host) + compiler_path = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) + stdout, stderr = compiler_path.communicate() + + local_toolchain = str(stdout, "utf-8").strip() + if not os.path.exists(local_toolchain): + return 1 + if os.path.exists(local_toolchain): + d.setVar("S", local_toolchain) + d.setVarFlag("do_fetch", "noexec", "1") + d.setVarFlag("do_unpack", "noexec", "1") + d.setVarFlag("do_patch", "noexec", "1") +} -- Gitee From 10aa9672f952e1b9bc69a7f894f55b6b1a268837 Mon Sep 17 00:00:00 2001 From: lisimin Date: Mon, 13 Sep 2021 23:35:16 +0800 Subject: [PATCH 003/304] add glibc Signed-off-by: lisimin --- .../recipes-core/glibc/glibc_2.25.bb | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 meta-openeuler/recipes-core/glibc/glibc_2.25.bb diff --git a/meta-openeuler/recipes-core/glibc/glibc_2.25.bb b/meta-openeuler/recipes-core/glibc/glibc_2.25.bb new file mode 100644 index 00000000000..514b8d91426 --- /dev/null +++ b/meta-openeuler/recipes-core/glibc/glibc_2.25.bb @@ -0,0 +1,69 @@ +SUMMARY = "Dummy Linux kernel" +DESCRIPTION = "Dummy Linux kernel, to be selected as the preferred \ +provider for virtual/kernel to satisfy dependencies for situations \ +where you wish to build the kernel externally from the build system." +SECTION = "kernel" + +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +#PACKAGES = "${PN}-dbg catchsegv sln nscd ldconfig ldd tzcode glibc-thread-db ${PN}-pic libcidn libmemusage malloc-debug libnss-db libsegfault ${PN}-pcprofile libsotruss ${PN} ${PN}-utils glibc-extra-nss ${PN}-dev ${PN}-staticdev ${PN}-doc ${PN}-src" + +#DEPENDS = "virtual/${TARGET_PREFIX}gcc libgcc-initial linux-libc-headers" +PROVIDES += " \ + virtual/libc \ + virtual/libiconv \ +" +PROVIDES += "virtual/libc virtual/libiconv virtual/libintl" +#RPROVIDES:${PN}-dev += "libc-dev" + + +INHIBIT_DEFAULT_DEPS = "1" + +PR = "r1" + +SRC_URI = "file://sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu" +#FILESPATH:prepend += "${LOCAL_FILES}:" +DL_DIR = "${LOCAL_SYSROOT_DL_DIR}" +S = "${WORKDIR}/sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu" +PSEUDO_DISABLED = "1" +PRIVATE_LIBS:${PN}-dev:append = "libdl.so.2 libresolv.so.2 libm.so.6 librt.so.1 libnsl.so.1 libnss_files.so.2 " + +do_configure() { + : +} + +do_compile () { + : +} + +do_install() { + install -m 0755 -d ${D}/ + cp -pPR ${B}/* ${D}/ + #for f in ${D}${bindir}/${EULER_TOOLCHAIN_SYSNAME}-*; do + echo "EULER_TOOLCHAIN_SYSNAME:$EULER_TOOLCHAIN_SYSNAME" + echo "TARGET_PREFIX:$TARGET_PREFIX" + EULER_TOOLCHAIN_SYSNAME="aarch64-linux-gnu" + EULER_TOOLCHAIN_TARGET_PREFIX="aarch64-openeuler-linux-" + echo "D:${D}" + rm -rf ${D}/etc/rpc + rm -rf ${D}/lib/debug + rm -f ${D}/lib/libgcc_s.so* + rm -r ${D}/usr/share/i18n + rm -r ${D}//usr/lib/gconv + rm -r ${D}/usr/lib/audit/ + rm -r ${D}/lib/*.spec + rm -r ${D}/lib/ld-2.25.so +} + +#depends by glibc-locale +do_stash_locale() { + : +} +addtask do_stash_locale +deltask do_package +deltask do_package_write_rpm +#depends by libgcc +do_packagedata () { + : +} -- Gitee From 8e42d885ad94cdf51709ede8ca4cbd77cad1b07e Mon Sep 17 00:00:00 2001 From: lisimin Date: Mon, 13 Sep 2021 23:35:28 +0800 Subject: [PATCH 004/304] add euler kernel Signed-off-by: lisimin --- .../linux/files/kernel-defconfig | 3641 +++++++++++++++++ .../recipes-kernel/linux/linux-openeuler.bb | 209 + 2 files changed, 3850 insertions(+) create mode 100644 meta-openeuler/recipes-kernel/linux/files/kernel-defconfig create mode 100644 meta-openeuler/recipes-kernel/linux/linux-openeuler.bb diff --git a/meta-openeuler/recipes-kernel/linux/files/kernel-defconfig b/meta-openeuler/recipes-kernel/linux/files/kernel-defconfig new file mode 100644 index 00000000000..b6d5d90483f --- /dev/null +++ b/meta-openeuler/recipes-kernel/linux/files/kernel-defconfig @@ -0,0 +1,3641 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/arm64 5.10.0 Kernel Configuration +# +CONFIG_CC_VERSION_TEXT="aarch64-linux-gnu-gcc (Linaro GCC 7.3-2018.05) 7.3.1 20180425 [linaro-7.3-2018.05 revision d29120a424ecfbc167ef90065c0eeb7f91977701]" +CONFIG_CC_IS_GCC=y +CONFIG_GCC_VERSION=70301 +CONFIG_LD_VERSION=228020000 +CONFIG_CLANG_VERSION=0 +CONFIG_LLD_VERSION=0 +CONFIG_CC_CAN_LINK=y +CONFIG_CC_CAN_LINK_STATIC=y +CONFIG_CC_HAS_ASM_GOTO=y +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_TABLE_SORT=y +CONFIG_THREAD_INFO_IN_TASK=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +# CONFIG_COMPILE_TEST is not set +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_BUILD_SALT="" +CONFIG_DEFAULT_INIT="" +CONFIG_DEFAULT_HOSTNAME="(none)" +# CONFIG_SWAP is not set +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_WATCH_QUEUE is not set +CONFIG_CROSS_MEMORY_ATTACH=y +# CONFIG_USELIB is not set +CONFIG_AUDIT=y +CONFIG_HAVE_ARCH_AUDITSYSCALL=y +CONFIG_AUDITSYSCALL=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_GENERIC_IRQ_IPI=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_HANDLE_DOMAIN_IRQ=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +# CONFIG_GENERIC_IRQ_DEBUGFS is not set +# end of IRQ subsystem + +CONFIG_GENERIC_IRQ_MULTI_HANDLER=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_ARCH_HAS_TICK_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +# CONFIG_NO_HZ_IDLE is not set +CONFIG_NO_HZ_FULL=y +CONFIG_CONTEXT_TRACKING=y +# CONFIG_CONTEXT_TRACKING_FORCE is not set +# CONFIG_NO_HZ is not set +CONFIG_HIGH_RES_TIMERS=y +# end of Timers subsystem + +# CONFIG_PREEMPT_NONE is not set +# CONFIG_PREEMPT_VOLUNTARY is not set +CONFIG_PREEMPT=y +CONFIG_PREEMPT_COUNT=y +CONFIG_PREEMPTION=y + +# +# CPU/Task time and stats accounting +# +CONFIG_VIRT_CPU_ACCOUNTING=y +CONFIG_VIRT_CPU_ACCOUNTING_GEN=y +# CONFIG_IRQ_TIME_ACCOUNTING is not set +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_TASK_XACCT=y +CONFIG_TASK_IO_ACCOUNTING=y +# CONFIG_PSI is not set +# end of CPU/Task time and stats accounting + +CONFIG_CPU_ISOLATION=y + +# +# RCU Subsystem +# +CONFIG_TREE_RCU=y +CONFIG_PREEMPT_RCU=y +CONFIG_RCU_EXPERT=y +CONFIG_SRCU=y +CONFIG_TREE_SRCU=y +CONFIG_TASKS_RCU_GENERIC=y +CONFIG_TASKS_RCU=y +CONFIG_TASKS_RUDE_RCU=y +CONFIG_RCU_STALL_COMMON=y +CONFIG_RCU_NEED_SEGCBLIST=y +CONFIG_RCU_FANOUT=64 +CONFIG_RCU_FANOUT_LEAF=16 +# CONFIG_RCU_FAST_NO_HZ is not set +# CONFIG_RCU_BOOST is not set +CONFIG_RCU_NOCB_CPU=y +# CONFIG_TASKS_TRACE_RCU_READ_MB is not set +# end of RCU Subsystem + +# CONFIG_IKCONFIG is not set +# CONFIG_IKHEADERS is not set +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=12 +CONFIG_GENERIC_SCHED_CLOCK=y + +# +# Scheduler features +# +# end of Scheduler features + +CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y +CONFIG_CC_HAS_INT128=y +CONFIG_ARCH_SUPPORTS_INT128=y +CONFIG_CGROUPS=y +# CONFIG_MEMCG is not set +# CONFIG_BLK_CGROUP is not set +CONFIG_CGROUP_SCHED=y +CONFIG_FAIR_GROUP_SCHED=y +# CONFIG_CFS_BANDWIDTH is not set +# CONFIG_RT_GROUP_SCHED is not set +# CONFIG_CGROUP_PIDS is not set +# CONFIG_CGROUP_RDMA is not set +# CONFIG_CGROUP_FREEZER is not set +# CONFIG_CGROUP_HUGETLB is not set +# CONFIG_CPUSETS is not set +# CONFIG_CGROUP_DEVICE is not set +# CONFIG_CGROUP_CPUACCT is not set +# CONFIG_CGROUP_DEBUG is not set +# CONFIG_CGROUP_FILES is not set +# CONFIG_NAMESPACES is not set +# CONFIG_CHECKPOINT_RESTORE is not set +# CONFIG_SCHED_AUTOGROUP is not set +# CONFIG_SYSFS_DEPRECATED is not set +# CONFIG_RELAY is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_RD_GZIP=y +# CONFIG_RD_BZIP2 is not set +CONFIG_RD_LZMA=y +# CONFIG_RD_XZ is not set +# CONFIG_RD_LZO is not set +# CONFIG_RD_LZ4 is not set +# CONFIG_RD_ZSTD is not set +CONFIG_INITRAMFS_FILE_METADATA="" +# CONFIG_BOOT_CONFIG is not set +# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y +CONFIG_HAVE_UID16=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_BPF=y +CONFIG_EXPERT=y +CONFIG_UID16=y +CONFIG_MULTIUSER=y +# CONFIG_SGETMASK_SYSCALL is not set +# CONFIG_SYSFS_SYSCALL is not set +CONFIG_FHANDLE=y +CONFIG_POSIX_TIMERS=y +CONFIG_PRINTK=y +CONFIG_PRINTK_NMI=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +CONFIG_HAVE_FUTEX_CMPXCHG=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +# CONFIG_TIMERFD is not set +# CONFIG_EVENTFD is not set +CONFIG_SHMEM=y +CONFIG_AIO=y +# CONFIG_IO_URING is not set +# CONFIG_ADVISE_SYSCALLS is not set +CONFIG_MEMBARRIER=y +CONFIG_KALLSYMS=y +CONFIG_KALLSYMS_ALL=y +CONFIG_KALLSYMS_BASE_RELATIVE=y +# CONFIG_BPF_SYSCALL is not set +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y +# CONFIG_USERFAULTFD is not set +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +# CONFIG_KCMP is not set +# CONFIG_RSEQ is not set +CONFIG_EMBEDDED=y +CONFIG_HAVE_PERF_EVENTS=y +# CONFIG_PC104 is not set + +# +# Kernel Performance Events And Counters +# +# CONFIG_PERF_EVENTS is not set +# end of Kernel Performance Events And Counters + +CONFIG_VM_EVENT_COUNTERS=y +# CONFIG_SLUB_DEBUG is not set +# CONFIG_COMPAT_BRK is not set +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +# CONFIG_SLAB_MERGE_DEFAULT is not set +CONFIG_SLAB_FREELIST_RANDOM=y +CONFIG_SLAB_FREELIST_HARDENED=y +CONFIG_SHUFFLE_PAGE_ALLOCATOR=y +CONFIG_SLUB_CPU_PARTIAL=y +CONFIG_SYSTEM_DATA_VERIFICATION=y +CONFIG_PROFILING=y +CONFIG_TRACEPOINTS=y +# end of General setup + +CONFIG_ARM64=y +CONFIG_64BIT=y +CONFIG_MMU=y +CONFIG_ARM64_PAGE_SHIFT=12 +CONFIG_ARM64_CONT_PTE_SHIFT=4 +CONFIG_ARM64_CONT_PMD_SHIFT=4 +CONFIG_ARCH_MMAP_RND_BITS_MIN=18 +CONFIG_ARCH_MMAP_RND_BITS_MAX=24 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CSUM=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ZONE_DMA=y +CONFIG_ZONE_DMA32=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y +CONFIG_SMP=y +CONFIG_KERNEL_MODE_NEON=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_PGTABLE_LEVELS=3 +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_ARCH_PROC_KCORE_TEXT=y +CONFIG_ARCH_HAS_CPU_RELAX=y + +# +# Platform selection +# +# CONFIG_ARCH_ACTIONS is not set +# CONFIG_ARCH_AGILEX is not set +# CONFIG_ARCH_SUNXI is not set +# CONFIG_ARCH_ALPINE is not set +# CONFIG_ARCH_BCM2835 is not set +# CONFIG_ARCH_BCM_IPROC is not set +# CONFIG_ARCH_BERLIN is not set +# CONFIG_ARCH_BITMAIN is not set +# CONFIG_ARCH_BRCMSTB is not set +# CONFIG_ARCH_EXYNOS is not set +# CONFIG_ARCH_SPARX5 is not set +# CONFIG_ARCH_K3 is not set +# CONFIG_ARCH_LAYERSCAPE is not set +# CONFIG_ARCH_LG1K is not set +CONFIG_ARCH_HISI=y +# CONFIG_ARCH_KEEMBAY is not set +# CONFIG_ARCH_MEDIATEK is not set +# CONFIG_ARCH_MESON is not set +# CONFIG_ARCH_MVEBU is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_PHYTIUM is not set +# CONFIG_ARCH_QCOM is not set +# CONFIG_ARCH_REALTEK is not set +# CONFIG_ARCH_RENESAS is not set +# CONFIG_ARCH_ROCKCHIP is not set +# CONFIG_ARCH_S32 is not set +# CONFIG_ARCH_SEATTLE is not set +# CONFIG_ARCH_STRATIX10 is not set +# CONFIG_ARCH_SYNQUACER is not set +# CONFIG_ARCH_TEGRA is not set +# CONFIG_ARCH_SPRD is not set +# CONFIG_ARCH_THUNDER is not set +# CONFIG_ARCH_THUNDER2 is not set +# CONFIG_ARCH_UNIPHIER is not set +# CONFIG_ARCH_VEXPRESS is not set +# CONFIG_ARCH_VISCONTI is not set +# CONFIG_ARCH_XGENE is not set +# CONFIG_ARCH_ZX is not set +# CONFIG_ARCH_ZYNQMP is not set +# end of Platform selection + +CONFIG_HAVE_LIVEPATCH_WO_FTRACE=y + +# +# Enable Livepatch +# +CONFIG_LIVEPATCH=y +CONFIG_LIVEPATCH_WO_FTRACE=y +CONFIG_LIVEPATCH_STOP_MACHINE_CONSISTENCY=y +# CONFIG_LIVEPATCH_STACK is not set +CONFIG_LIVEPATCH_RESTRICT_KPROBE=y +# end of Enable Livepatch + +# +# Kernel Features +# + +# +# ARM errata workarounds via the alternatives framework +# +CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y +CONFIG_ARM64_ERRATUM_826319=y +CONFIG_ARM64_ERRATUM_827319=y +CONFIG_ARM64_ERRATUM_824069=y +CONFIG_ARM64_ERRATUM_819472=y +CONFIG_ARM64_ERRATUM_832075=y +CONFIG_ARM64_ERRATUM_845719=y +# CONFIG_ARM64_ERRATUM_843419 is not set +CONFIG_ARM64_ERRATUM_1024718=y +CONFIG_ARM64_ERRATUM_1418040=y +CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y +CONFIG_ARM64_ERRATUM_1165522=y +CONFIG_ARM64_ERRATUM_1319367=y +CONFIG_ARM64_ERRATUM_1530923=y +CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y +CONFIG_ARM64_ERRATUM_1286807=y +CONFIG_ARM64_ERRATUM_1463225=y +CONFIG_ARM64_ERRATUM_1542419=y +CONFIG_ARM64_ERRATUM_1508412=y +# CONFIG_CAVIUM_ERRATUM_22375 is not set +# CONFIG_CAVIUM_ERRATUM_23154 is not set +# CONFIG_CAVIUM_ERRATUM_27456 is not set +# CONFIG_CAVIUM_ERRATUM_30115 is not set +# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set +# CONFIG_FUJITSU_ERRATUM_010001 is not set +CONFIG_HISILICON_ERRATUM_161600802=y +# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set +# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set +CONFIG_SOCIONEXT_SYNQUACER_PREITS=y +CONFIG_HISILICON_ERRATUM_HIP08_RU_PREFETCH=y +# CONFIG_HISILICON_HIP08_RU_PREFETCH_DEFAULT_OFF is not set +# end of ARM errata workarounds via the alternatives framework + +CONFIG_ARM64_4K_PAGES=y +# CONFIG_ARM64_16K_PAGES is not set +# CONFIG_ARM64_64K_PAGES is not set +CONFIG_ARM64_VA_BITS_39=y +# CONFIG_ARM64_VA_BITS_48 is not set +CONFIG_ARM64_VA_BITS=39 +CONFIG_ARM64_PA_BITS_48=y +CONFIG_ARM64_PA_BITS=48 +# CONFIG_CPU_BIG_ENDIAN is not set +CONFIG_CPU_LITTLE_ENDIAN=y +# CONFIG_SCHED_MC is not set +# CONFIG_SCHED_SMT is not set +CONFIG_NR_CPUS=64 +# CONFIG_HOTPLUG_CPU is not set +# CONFIG_NUMA is not set +CONFIG_HZ_100=y +# CONFIG_HZ_250 is not set +# CONFIG_HZ_300 is not set +# CONFIG_HZ_1000 is not set +CONFIG_HZ=100 +CONFIG_SCHED_HRTICK=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_DEFAULT=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_FLATMEM_ENABLE=y +CONFIG_HAVE_ARCH_PFN_VALID=y +CONFIG_SYS_SUPPORTS_HUGETLBFS=y +CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +# CONFIG_PARAVIRT is not set +# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set +# CONFIG_KEXEC_FILE is not set +# CONFIG_CRASH_DUMP is not set +# CONFIG_XEN is not set +CONFIG_FORCE_MAX_ZONEORDER=11 +# CONFIG_UNMAP_KERNEL_AT_EL0 is not set +# CONFIG_RODATA_FULL_DEFAULT_ENABLED is not set +# CONFIG_ARM64_PMEM_RESERVE is not set +# CONFIG_ARM64_SW_TTBR0_PAN is not set +# CONFIG_ARM64_TAGGED_ADDR_ABI is not set +# CONFIG_ARM64_ILP32 is not set +CONFIG_AARCH32_EL0=y +CONFIG_KUSER_HELPERS=y +# CONFIG_ARMV8_DEPRECATED is not set + +# +# ARMv8.1 architectural features +# +# CONFIG_ARM64_HW_AFDBM is not set +# CONFIG_ARM64_PAN is not set +CONFIG_AS_HAS_LSE_ATOMICS=y +# CONFIG_ARM64_USE_LSE_ATOMICS is not set +# CONFIG_ARM64_VHE is not set +# end of ARMv8.1 architectural features + +# +# ARMv8.2 architectural features +# +CONFIG_ARM64_UAO=y +CONFIG_ARM64_PMEM=y +# CONFIG_ARM64_RAS_EXTN is not set +# CONFIG_ARM64_CNP is not set +# end of ARMv8.2 architectural features + +# +# ARMv8.3 architectural features +# +# CONFIG_ARM64_PTR_AUTH is not set +CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y +CONFIG_AS_HAS_PAC=y +# end of ARMv8.3 architectural features + +# +# ARMv8.4 architectural features +# +# CONFIG_ARM64_AMU_EXTN is not set +# end of ARMv8.4 architectural features + +# +# ARMv8.5 architectural features +# +# CONFIG_ARM64_BTI is not set +CONFIG_ARM64_E0PD=y +# CONFIG_ARCH_RANDOM is not set +# end of ARMv8.5 architectural features + +# +# ARMv8.6 architectural features +# +CONFIG_ARM64_TWED=y +# end of ARMv8.6 architectural features + +# CONFIG_ARM64_SVE is not set +CONFIG_ARM64_MODULE_PLTS=y +# CONFIG_ARM64_PSEUDO_NMI is not set +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_RANDOMIZE_MODULE_REGION_FULL=y +# end of Kernel Features + +# +# Boot options +# +CONFIG_CMDLINE="" +CONFIG_EFI_STUB=y +CONFIG_EFI=y +CONFIG_DMI=y +# end of Boot options + +CONFIG_COMPAT=y +CONFIG_SYSVIPC_COMPAT=y +CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y + +# +# Power management options +# +# CONFIG_SUSPEND is not set +# CONFIG_PM is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y +# end of Power management options + +# +# CPU Power Management +# + +# +# CPU Idle +# +# CONFIG_CPU_IDLE is not set +# end of CPU Idle + +# +# CPU Frequency scaling +# +# CONFIG_CPU_FREQ is not set +# end of CPU Frequency scaling +# end of CPU Power Management + +# +# Firmware Drivers +# +# CONFIG_ARM_SDE_INTERFACE is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +# CONFIG_FW_CFG_SYSFS is not set +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +CONFIG_EFI_ESRT=y +CONFIG_EFI_PARAMS_FROM_FDT=y +CONFIG_EFI_RUNTIME_WRAPPERS=y +CONFIG_EFI_GENERIC_STUB=y +# CONFIG_EFI_ARMSTUB_DTB_LOADER is not set +# CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER is not set +# CONFIG_EFI_BOOTLOADER_CONTROL is not set +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +# CONFIG_RESET_ATTACK_MITIGATION is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +# end of EFI (Extensible Firmware Interface) Support + +CONFIG_EFI_EARLYCON=y +CONFIG_ARM_PSCI_FW=y +CONFIG_HAVE_ARM_SMCCC=y +CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y +# CONFIG_ARM_SMCCC_SOC_ID is not set + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + +CONFIG_ARCH_SUPPORTS_ACPI=y +# CONFIG_ACPI is not set +# CONFIG_VIRTUALIZATION is not set +# CONFIG_ARM64_CRYPTO is not set + +# +# General architecture-dependent options +# +CONFIG_CRASH_CORE=y +CONFIG_SET_FS=y +CONFIG_KPROBES=y +CONFIG_JUMP_LABEL=y +# CONFIG_STATIC_KEYS_SELFTEST is not set +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_KRETPROBES=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y +CONFIG_HAVE_NMI=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_ARCH_HAS_FORTIFY_SOURCE=y +CONFIG_ARCH_HAS_KEEPINITRD=y +CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_ARCH_HAS_SET_DIRECT_MAP=y +CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_HAVE_ASM_MODVERSIONS=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_TABLE_FREE=y +CONFIG_MMU_GATHER_RCU_TABLE_FREE=y +CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y +CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y +CONFIG_HAVE_CMPXCHG_LOCAL=y +CONFIG_HAVE_CMPXCHG_DOUBLE=y +CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y +CONFIG_HAVE_ARCH_SECCOMP=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_SECCOMP=y +CONFIG_SECCOMP_FILTER=y +# CONFIG_SECCOMP_CACHE_DEBUG is not set +CONFIG_HAVE_ARCH_STACKLEAK=y +CONFIG_HAVE_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y +CONFIG_HAVE_MOVE_PMD=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y +CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_ARCH_MMAP_RND_BITS=18 +CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 +CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_COMPAT_OLD_SIGACTION=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_HAVE_ARCH_VMAP_STACK=y +CONFIG_VMAP_STACK=y +CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_STRICT_MODULE_RWX=y +CONFIG_HAVE_ARCH_COMPILER_H=y +CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_USE_MEMREMAP_PROT=y +# CONFIG_LOCK_EVENT_COUNTS is not set +CONFIG_ARCH_HAS_RELR=y +CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set +CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y +# end of GCOV-based kernel profiling + +CONFIG_HAVE_GCC_PLUGINS=y +# end of General architecture-dependent options + +CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=0 +CONFIG_MODULE_SIG_FORMAT=y +CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_MODVERSIONS=y +CONFIG_ASM_MODVERSIONS=y +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_MODULE_SIG=y +# CONFIG_MODULE_SIG_FORCE is not set +# CONFIG_MODULE_SIG_ALL is not set +# CONFIG_MODULE_SIG_SHA1 is not set +# CONFIG_MODULE_SIG_SHA224 is not set +CONFIG_MODULE_SIG_SHA256=y +# CONFIG_MODULE_SIG_SHA384 is not set +# CONFIG_MODULE_SIG_SHA512 is not set +CONFIG_MODULE_SIG_HASH="sha256" +# CONFIG_MODULE_COMPRESS is not set +# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_TRIM_UNUSED_KSYMS is not set +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_BLOCK=y +CONFIG_BLK_SCSI_REQUEST=y +CONFIG_BLK_DEV_BSG=y +# CONFIG_BLK_DEV_BSGLIB is not set +# CONFIG_BLK_DEV_INTEGRITY is not set +# CONFIG_BLK_DEV_ZONED is not set +# CONFIG_BLK_CMDLINE_PARSER is not set +# CONFIG_BLK_WBT is not set +CONFIG_BLK_DEBUG_FS=y +# CONFIG_BLK_SED_OPAL is not set +# CONFIG_BLK_INLINE_ENCRYPTION is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_EFI_PARTITION=y +# end of Partition Types + +CONFIG_BLOCK_COMPAT=y +CONFIG_BLK_MQ_PCI=y + +# +# IO Schedulers +# +CONFIG_MQ_IOSCHED_DEADLINE=m +# CONFIG_MQ_IOSCHED_KYBER is not set +CONFIG_IOSCHED_BFQ=y +# end of IO Schedulers + +CONFIG_ASN1=y +CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_ARCH_USE_QUEUED_RWLOCKS=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y +CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_ARCH_BINFMT_ELF_STATE=y +CONFIG_ARCH_HAVE_ELF_PROT=y +CONFIG_ARCH_USE_GNU_PROPERTY=y +CONFIG_ELFCORE=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y +CONFIG_BINFMT_SCRIPT=y +# CONFIG_BINFMT_MISC is not set +CONFIG_COREDUMP=y +# end of Executable file formats + +# +# Memory Management options +# +CONFIG_SELECT_MEMORY_MODEL=y +# CONFIG_FLATMEM_MANUAL is not set +CONFIG_SPARSEMEM_MANUAL=y +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +# CONFIG_SPARSEMEM_VMEMMAP is not set +CONFIG_HAVE_FAST_GUP=y +CONFIG_HOLES_IN_ZONE=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +# CONFIG_MEMORY_HOTPLUG is not set +CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_COMPACTION=y +# CONFIG_PAGE_REPORTING is not set +CONFIG_MIGRATION=y +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_BOUNCE=y +CONFIG_KSM=y +CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 +CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y +# CONFIG_MEMORY_FAILURE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +# CONFIG_CLEANCACHE is not set +# CONFIG_ETMEM_SCAN is not set +# CONFIG_ETMEM_SWAP is not set +# CONFIG_CMA is not set +# CONFIG_ZPOOL is not set +# CONFIG_ZBUD is not set +# CONFIG_ZSMALLOC is not set +CONFIG_GENERIC_EARLY_IOREMAP=y +# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set +# CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_PTE_DEVMAP=y +# CONFIG_PERCPU_STATS is not set +# CONFIG_GUP_BENCHMARK is not set +CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_PIN_MEMORY is not set +# end of Memory Management options + +CONFIG_NET=y +CONFIG_NET_INGRESS=y +CONFIG_SKB_EXTENSIONS=y + +# +# Networking options +# +CONFIG_PACKET=m +# CONFIG_PACKET_DIAG is not set +CONFIG_UNIX=m +CONFIG_UNIX_SCM=y +# CONFIG_UNIX_DIAG is not set +# CONFIG_TLS is not set +CONFIG_XFRM=y +CONFIG_XFRM_ALGO=m +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_INTERFACE is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +CONFIG_NET_KEY=m +# CONFIG_NET_KEY_MIGRATE is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +# CONFIG_IP_FIB_TRIE_STATS is not set +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE_DEMUX is not set +CONFIG_NET_IP_TUNNEL=m +# CONFIG_IP_MROUTE is not set +CONFIG_SYN_COOKIES=y +# CONFIG_NET_IPVTI is not set +CONFIG_NET_UDP_TUNNEL=m +# CONFIG_NET_FOU is not set +# CONFIG_NET_FOU_IP_TUNNELS is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +CONFIG_INET_TUNNEL=m +# CONFIG_INET_DIAG is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +CONFIG_IPV6=m +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +# CONFIG_INET6_AH is not set +# CONFIG_INET6_ESP is not set +# CONFIG_INET6_IPCOMP is not set +# CONFIG_IPV6_MIP6 is not set +# CONFIG_IPV6_ILA is not set +# CONFIG_IPV6_VTI is not set +CONFIG_IPV6_SIT=m +# CONFIG_IPV6_SIT_6RD is not set +CONFIG_IPV6_NDISC_NODETYPE=y +# CONFIG_IPV6_TUNNEL is not set +# CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6_SEG6_LWTUNNEL is not set +# CONFIG_IPV6_SEG6_HMAC is not set +# CONFIG_IPV6_RPL_LWTUNNEL is not set +CONFIG_NETLABEL=y +# CONFIG_MPTCP is not set +CONFIG_NETWORK_SECMARK=y +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +CONFIG_NETFILTER=y +CONFIG_NETFILTER_ADVANCED=y + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_INGRESS=y +# CONFIG_NETFILTER_NETLINK_ACCT is not set +# CONFIG_NETFILTER_NETLINK_QUEUE is not set +# CONFIG_NETFILTER_NETLINK_LOG is not set +# CONFIG_NETFILTER_NETLINK_OSF is not set +# CONFIG_NF_CONNTRACK is not set +# CONFIG_NF_LOG_NETDEV is not set +# CONFIG_NF_TABLES is not set +CONFIG_NETFILTER_XTABLES=m + +# +# Xtables combined modules +# +# CONFIG_NETFILTER_XT_MARK is not set + +# +# Xtables targets +# +# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set +# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set +# CONFIG_NETFILTER_XT_TARGET_HMARK is not set +# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set +# CONFIG_NETFILTER_XT_TARGET_LOG is not set +# CONFIG_NETFILTER_XT_TARGET_MARK is not set +# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set +# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set +# CONFIG_NETFILTER_XT_TARGET_TEE is not set +# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set +# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set + +# +# Xtables matches +# +# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set +# CONFIG_NETFILTER_XT_MATCH_BPF is not set +# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set +# CONFIG_NETFILTER_XT_MATCH_CPU is not set +# CONFIG_NETFILTER_XT_MATCH_DCCP is not set +# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_DSCP is not set +# CONFIG_NETFILTER_XT_MATCH_ECN is not set +# CONFIG_NETFILTER_XT_MATCH_ESP is not set +# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_HL is not set +# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set +# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set +# CONFIG_NETFILTER_XT_MATCH_L2TP is not set +# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set +# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_MAC is not set +# CONFIG_NETFILTER_XT_MATCH_MARK is not set +# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set +# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set +# CONFIG_NETFILTER_XT_MATCH_OSF is not set +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set +# CONFIG_NETFILTER_XT_MATCH_POLICY is not set +# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set +# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set +# CONFIG_NETFILTER_XT_MATCH_REALM is not set +# CONFIG_NETFILTER_XT_MATCH_RECENT is not set +# CONFIG_NETFILTER_XT_MATCH_SCTP is not set +# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set +# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set +# CONFIG_NETFILTER_XT_MATCH_STRING is not set +# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set +# CONFIG_NETFILTER_XT_MATCH_TIME is not set +# CONFIG_NETFILTER_XT_MATCH_U32 is not set +# end of Core Netfilter Configuration + +# CONFIG_IP_SET is not set +# CONFIG_IP_VS is not set + +# +# IP: Netfilter Configuration +# +# CONFIG_NF_SOCKET_IPV4 is not set +# CONFIG_NF_TPROXY_IPV4 is not set +# CONFIG_NF_DUP_IPV4 is not set +# CONFIG_NF_LOG_ARP is not set +# CONFIG_NF_LOG_IPV4 is not set +CONFIG_NF_REJECT_IPV4=m +CONFIG_IP_NF_IPTABLES=m +# CONFIG_IP_NF_MATCH_AH is not set +# CONFIG_IP_NF_MATCH_ECN is not set +# CONFIG_IP_NF_MATCH_TTL is not set +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +# CONFIG_IP_NF_MANGLE is not set +# CONFIG_IP_NF_RAW is not set +# CONFIG_IP_NF_SECURITY is not set +# CONFIG_IP_NF_ARPTABLES is not set +# end of IP: Netfilter Configuration + +# +# IPv6: Netfilter Configuration +# +# CONFIG_NF_SOCKET_IPV6 is not set +# CONFIG_NF_TPROXY_IPV6 is not set +# CONFIG_NF_DUP_IPV6 is not set +# CONFIG_NF_REJECT_IPV6 is not set +# CONFIG_NF_LOG_IPV6 is not set +# CONFIG_IP6_NF_IPTABLES is not set +# end of IPv6: Netfilter Configuration + +# CONFIG_BPFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_RDS is not set +CONFIG_TIPC=m +CONFIG_TIPC_MEDIA_UDP=y +# CONFIG_TIPC_CRYPTO is not set +# CONFIG_TIPC_DIAG is not set +# CONFIG_ATM is not set +# CONFIG_L2TP is not set +CONFIG_STP=m +CONFIG_GARP=m +# CONFIG_BRIDGE is not set +CONFIG_HAVE_NET_DSA=y +# CONFIG_NET_DSA is not set +CONFIG_VLAN_8021Q=m +CONFIG_VLAN_8021Q_GVRP=y +# CONFIG_VLAN_8021Q_MVRP is not set +# CONFIG_DECNET is not set +CONFIG_LLC=m +# CONFIG_LLC2 is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_PHONET is not set +# CONFIG_6LOWPAN is not set +# CONFIG_IEEE802154 is not set +# CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set +# CONFIG_DNS_RESOLVER is not set +# CONFIG_BATMAN_ADV is not set +# CONFIG_OPENVSWITCH is not set +# CONFIG_VSOCKETS is not set +# CONFIG_NETLINK_DIAG is not set +# CONFIG_MPLS is not set +# CONFIG_NET_NSH is not set +# CONFIG_HSR is not set +# CONFIG_NET_SWITCHDEV is not set +# CONFIG_NET_L3_MASTER_DEV is not set +# CONFIG_QRTR is not set +# CONFIG_NET_NCSI is not set +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_XPS=y +# CONFIG_CGROUP_NET_PRIO is not set +# CONFIG_CGROUP_NET_CLASSID is not set +CONFIG_NET_RX_BUSY_POLL=y +CONFIG_BQL=y +# CONFIG_BPF_JIT is not set +CONFIG_NET_FLOW_LIMIT=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_DROP_MONITOR is not set +# end of Network testing +# end of Networking options + +# CONFIG_HAMRADIO is not set +CONFIG_CAN=m +CONFIG_CAN_RAW=m +CONFIG_CAN_BCM=m +CONFIG_CAN_GW=m +# CONFIG_CAN_J1939 is not set +# CONFIG_CAN_ISOTP is not set + +# +# CAN Device Drivers +# +# CONFIG_CAN_VCAN is not set +# CONFIG_CAN_VXCAN is not set +# CONFIG_CAN_SLCAN is not set +CONFIG_CAN_DEV=m +CONFIG_CAN_CALC_BITTIMING=y +# CONFIG_CAN_FLEXCAN is not set +# CONFIG_CAN_GRCAN is not set +# CONFIG_CAN_KVASER_PCIEFD is not set +# CONFIG_CAN_XILINXCAN is not set +# CONFIG_CAN_C_CAN is not set +# CONFIG_CAN_CC770 is not set +# CONFIG_CAN_IFI_CANFD is not set +# CONFIG_CAN_M_CAN is not set +# CONFIG_CAN_PEAK_PCIEFD is not set +# CONFIG_CAN_SJA1000 is not set +# CONFIG_CAN_SOFTING is not set + +# +# CAN SPI interfaces +# +# CONFIG_CAN_HI311X is not set +# CONFIG_CAN_MCP251X is not set +# CONFIG_CAN_MCP251XFD is not set +# end of CAN SPI interfaces + +# +# CAN USB interfaces +# +# CONFIG_CAN_8DEV_USB is not set +# CONFIG_CAN_EMS_USB is not set +# CONFIG_CAN_ESD_USB2 is not set +# CONFIG_CAN_GS_USB is not set +# CONFIG_CAN_KVASER_USB is not set +# CONFIG_CAN_MCBA_USB is not set +# CONFIG_CAN_PEAK_USB is not set +# CONFIG_CAN_UCAN is not set +# end of CAN USB interfaces + +# CONFIG_CAN_DEBUG_DEVICES is not set +# end of CAN Device Drivers + +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set +# CONFIG_AF_KCM is not set +CONFIG_FIB_RULES=y +# CONFIG_WIRELESS is not set +# CONFIG_WIMAX is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set +# CONFIG_CAIF is not set +# CONFIG_CEPH_LIB is not set +# CONFIG_NFC is not set +# CONFIG_PSAMPLE is not set +# CONFIG_NET_IFE is not set +# CONFIG_LWTUNNEL is not set +CONFIG_DST_CACHE=y +CONFIG_GRO_CELLS=y +# CONFIG_FAILOVER is not set +# CONFIG_ETHTOOL_NETLINK is not set +CONFIG_HAVE_EBPF_JIT=y + +# +# Device Drivers +# +CONFIG_ARM_AMBA=y +CONFIG_HAVE_PCI=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_DOMAINS_GENERIC=y +CONFIG_PCI_SYSCALL=y +CONFIG_PCIEPORTBUS=y +CONFIG_HOTPLUG_PCI_PCIE=y +CONFIG_PCIEAER=y +# CONFIG_PCIEAER_INJECT is not set +# CONFIG_PCIE_ECRC is not set +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set +# CONFIG_PCIE_DPC is not set +# CONFIG_PCIE_PTM is not set +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PCI_QUIRKS=y +# CONFIG_PCI_DEBUG is not set +# CONFIG_PCI_STUB is not set +# CONFIG_PCI_IOV is not set +# CONFIG_PCI_PRI is not set +# CONFIG_PCI_PASID is not set +CONFIG_PCI_LABEL=y +# CONFIG_PCIE_BUS_TUNE_OFF is not set +CONFIG_PCIE_BUS_DEFAULT=y +# CONFIG_PCIE_BUS_SAFE is not set +# CONFIG_PCIE_BUS_PERFORMANCE is not set +# CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_HOTPLUG_PCI=y +# CONFIG_HOTPLUG_PCI_CPCI is not set +# CONFIG_HOTPLUG_PCI_SHPC is not set + +# +# PCI controller drivers +# +# CONFIG_PCI_FTPCI100 is not set +# CONFIG_PCI_HOST_GENERIC is not set +# CONFIG_PCIE_XILINX is not set +# CONFIG_PCI_XGENE is not set +# CONFIG_PCIE_ALTERA is not set +# CONFIG_PCI_HOST_THUNDER_PEM is not set +# CONFIG_PCI_HOST_THUNDER_ECAM is not set + +# +# DesignWare PCI Core Support +# +# CONFIG_PCIE_DW_PLAT_HOST is not set +# CONFIG_PCI_HISI is not set +# CONFIG_PCIE_KIRIN is not set +# CONFIG_PCIE_HISI_STB is not set +# CONFIG_PCI_MESON is not set +# CONFIG_PCIE_AL is not set +# end of DesignWare PCI Core Support + +# +# Mobiveil PCIe Core Support +# +# CONFIG_PCIE_LAYERSCAPE_GEN4 is not set +# end of Mobiveil PCIe Core Support + +# +# Cadence PCIe controllers support +# +# CONFIG_PCIE_CADENCE_PLAT_HOST is not set +# CONFIG_PCI_J721E_HOST is not set +# end of Cadence PCIe controllers support +# end of PCI controller drivers + +# +# PCI Endpoint +# +# CONFIG_PCI_ENDPOINT is not set +# end of PCI Endpoint + +# +# PCI switch controller drivers +# +# CONFIG_PCI_SW_SWITCHTEC is not set +# end of PCI switch controller drivers + +# CONFIG_PCCARD is not set +# CONFIG_RAPIDIO is not set + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER=y +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_STANDALONE=y +# CONFIG_PREVENT_FIRMWARE_BUILD is not set + +# +# Firmware loader +# +CONFIG_FW_LOADER=m +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_FW_LOADER_USER_HELPER is not set +# CONFIG_FW_LOADER_COMPRESS is not set +# end of Firmware loader + +CONFIG_ALLOW_DEV_COREDUMP=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set +# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_REGMAP=y +CONFIG_REGMAP_MMIO=y +CONFIG_GENERIC_ARCH_TOPOLOGY=y +# end of Generic Driver Options + +# +# Bus devices +# +# CONFIG_BRCMSTB_GISB_ARB is not set +# CONFIG_MOXTET is not set +# CONFIG_HISILICON_LPC is not set +# CONFIG_VEXPRESS_CONFIG is not set +# CONFIG_MHI_BUS is not set +# end of Bus devices + +# CONFIG_CONNECTOR is not set +# CONFIG_GNSS is not set +CONFIG_MTD=m +# CONFIG_MTD_TESTS is not set + +# +# Partition parsers +# +# CONFIG_MTD_AR7_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=m +CONFIG_MTD_OF_PARTS=m +# CONFIG_MTD_AFS_PARTS is not set +# CONFIG_MTD_REDBOOT_PARTS is not set +# end of Partition parsers + +# +# User Modules And Translation Layers +# +CONFIG_MTD_BLKDEVS=m +CONFIG_MTD_BLOCK=m +# CONFIG_MTD_BLOCK_RO is not set +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_SM_FTL is not set +# CONFIG_MTD_OOPS is not set +# CONFIG_MTD_PARTITIONED_MASTER is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=m +CONFIG_MTD_CFI_ADV_OPTIONS=y +# CONFIG_MTD_CFI_NOSWAP is not set +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set +CONFIG_MTD_CFI_LE_BYTE_SWAP=y +CONFIG_MTD_CFI_GEOMETRY=y +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +CONFIG_MTD_MAP_BANK_WIDTH_16=y +CONFIG_MTD_MAP_BANK_WIDTH_32=y +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_OTP is not set +# CONFIG_MTD_CFI_INTELEXT is not set +CONFIG_MTD_CFI_AMDSTD=m +# CONFIG_MTD_CFI_STAA is not set +CONFIG_MTD_CFI_UTIL=m +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# end of RAM/ROM/Flash chip drivers + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=m +# CONFIG_MTD_PHYSMAP_COMPAT is not set +# CONFIG_MTD_PHYSMAP_OF is not set +# CONFIG_MTD_PHYSMAP_GPIO_ADDR is not set +# CONFIG_MTD_PCI is not set +# CONFIG_MTD_INTEL_VR_NOR is not set +# CONFIG_MTD_PLATRAM is not set +# end of Mapping drivers for chip access + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_DATAFLASH is not set +# CONFIG_MTD_MCHP23K256 is not set +# CONFIG_MTD_SST25L is not set +# CONFIG_MTD_SLRAM is not set +CONFIG_MTD_PHRAM=m +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOCG3 is not set +# end of Self-contained MTD device drivers + +# +# NAND +# +CONFIG_MTD_NAND_CORE=m +# CONFIG_MTD_ONENAND is not set +CONFIG_MTD_NAND_ECC_SW_HAMMING=m +# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set +CONFIG_MTD_RAW_NAND=m +# CONFIG_MTD_NAND_ECC_SW_BCH is not set + +# +# Raw/parallel NAND flash controllers +# +# CONFIG_MTD_NAND_DENALI_PCI is not set +# CONFIG_MTD_NAND_DENALI_DT is not set +# CONFIG_MTD_NAND_CAFE is not set +# CONFIG_MTD_NAND_BRCMNAND is not set +# CONFIG_MTD_NAND_HISI504 is not set +# CONFIG_MTD_NAND_MXIC is not set +# CONFIG_MTD_NAND_GPIO is not set +# CONFIG_MTD_NAND_PLATFORM is not set +# CONFIG_MTD_NAND_CADENCE is not set +# CONFIG_MTD_NAND_ARASAN is not set + +# +# Misc +# +# CONFIG_MTD_NAND_NANDSIM is not set +# CONFIG_MTD_NAND_RICOH is not set +# CONFIG_MTD_NAND_DISKONCHIP is not set +# CONFIG_MTD_SPI_NAND is not set + +# +# ECC engine support +# +CONFIG_MTD_NAND_ECC=y +# end of ECC engine support +# end of NAND + +# +# LPDDR & LPDDR2 PCM memory drivers +# +# CONFIG_MTD_LPDDR is not set +# end of LPDDR & LPDDR2 PCM memory drivers + +# CONFIG_MTD_SPI_NOR is not set +CONFIG_MTD_UBI=m +CONFIG_MTD_UBI_WL_THRESHOLD=4096 +CONFIG_MTD_UBI_BEB_LIMIT=20 +# CONFIG_MTD_UBI_FASTMAP is not set +# CONFIG_MTD_UBI_GLUEBI is not set +# CONFIG_MTD_UBI_BLOCK is not set +# CONFIG_MTD_HYPERBUS is not set +CONFIG_DTC=y +CONFIG_OF=y +# CONFIG_OF_UNITTEST is not set +CONFIG_OF_FLATTREE=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_KOBJ=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_IRQ=y +CONFIG_OF_NET=y +CONFIG_OF_RESERVED_MEM=y +# CONFIG_OF_OVERLAY is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_NULL_BLK is not set +# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set +# CONFIG_BLK_DEV_UMEM is not set +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_DRBD is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_SKD is not set +# CONFIG_BLK_DEV_SX8 is not set +CONFIG_BLK_DEV_RAM=m +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=65536 +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_BLK_DEV_RBD is not set +# CONFIG_BLK_DEV_RSXX is not set + +# +# NVME Support +# +# CONFIG_BLK_DEV_NVME is not set +# CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# end of NVME Support + +# +# Misc devices +# +# CONFIG_AD525X_DPOT is not set +# CONFIG_DUMMY_IRQ is not set +# CONFIG_PHANTOM is not set +# CONFIG_TIFM_CORE is not set +# CONFIG_ICS932S401 is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_HP_ILO is not set +# CONFIG_APDS9802ALS is not set +# CONFIG_ISL29003 is not set +# CONFIG_ISL29020 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_SENSORS_BH1770 is not set +# CONFIG_SENSORS_APDS990X is not set +# CONFIG_HMC6352 is not set +# CONFIG_DS1682 is not set +# CONFIG_LATTICE_ECP3_CONFIG is not set +# CONFIG_SRAM is not set +# CONFIG_PCI_ENDPOINT_TEST is not set +# CONFIG_XILINX_SDFEC is not set +# CONFIG_PVPANIC is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_AT24 is not set +# CONFIG_EEPROM_AT25 is not set +# CONFIG_EEPROM_LEGACY is not set +# CONFIG_EEPROM_MAX6875 is not set +# CONFIG_EEPROM_93CX6 is not set +# CONFIG_EEPROM_93XX46 is not set +# CONFIG_EEPROM_IDT_89HPESX is not set +# CONFIG_EEPROM_EE1004 is not set +# end of EEPROM support + +# CONFIG_CB710_CORE is not set + +# +# Texas Instruments shared transport line discipline +# +# CONFIG_TI_ST is not set +# end of Texas Instruments shared transport line discipline + +# +# Altera FPGA firmware download module (requires I2C) +# +# CONFIG_ALTERA_STAPL is not set +# CONFIG_GENWQE is not set +# CONFIG_ECHO is not set +# CONFIG_MISC_ALCOR_PCI is not set +# CONFIG_MISC_RTSX_PCI is not set +# CONFIG_MISC_RTSX_USB is not set +# CONFIG_HABANA_AI is not set +# end of Misc devices + +# +# SCSI device support +# +CONFIG_SCSI_MOD=m +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=m +CONFIG_SCSI_DMA=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +# CONFIG_CHR_DEV_ST is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# end of SCSI Transports + +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_ISCSI_TCP is not set +# CONFIG_ISCSI_BOOT_SYSFS is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set +# CONFIG_SCSI_CXGB4_ISCSI is not set +# CONFIG_SCSI_BNX2_ISCSI is not set +# CONFIG_BE2ISCSI is not set +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_HPSA is not set +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_3W_SAS is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_HISI_SAS is not set +# CONFIG_SCSI_MVSAS is not set +# CONFIG_SCSI_MVUMI is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_ARCMSR is not set +# CONFIG_SCSI_ESAS2R is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_LEGACY is not set +# CONFIG_MEGARAID_SAS is not set +# CONFIG_SCSI_MPT3SAS is not set +# CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_SMARTPQI is not set +# CONFIG_SCSI_UFSHCD is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_MYRB is not set +# CONFIG_SCSI_MYRS is not set +# CONFIG_SCSI_SNIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_FDOMAIN_PCI is not set +# CONFIG_SCSI_GDTH is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_STEX is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLA_ISCSI is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_AM53C974 is not set +# CONFIG_SCSI_WD719X is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_PMCRAID is not set +# CONFIG_SCSI_PM8001 is not set +# CONFIG_SCSI_DH is not set +# end of SCSI device support + +CONFIG_HAVE_PATA_PLATFORM=y +CONFIG_ATA=m +CONFIG_ATA_VERBOSE_ERROR=y +# CONFIG_ATA_FORCE is not set + +# +# Controllers with non-SFF native interface +# +# CONFIG_SATA_AHCI is not set +# CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_CEVA is not set +# CONFIG_AHCI_QORIQ is not set +# CONFIG_SATA_INIC162X is not set +# CONFIG_SATA_ACARD_AHCI is not set +# CONFIG_SATA_SIL24 is not set +CONFIG_ATA_SFF=y + +# +# SFF controllers with custom DMA interface +# +# CONFIG_PDC_ADMA is not set +# CONFIG_SATA_QSTOR is not set +# CONFIG_SATA_SX4 is not set +CONFIG_ATA_BMDMA=y + +# +# SATA SFF controllers with BMDMA +# +# CONFIG_ATA_PIIX is not set +# CONFIG_SATA_MV is not set +# CONFIG_SATA_NV is not set +# CONFIG_SATA_PROMISE is not set +# CONFIG_SATA_SIL is not set +# CONFIG_SATA_SIS is not set +# CONFIG_SATA_SVW is not set +# CONFIG_SATA_ULI is not set +# CONFIG_SATA_VIA is not set +# CONFIG_SATA_VITESSE is not set +# CONFIG_SATA_ZHAOXIN is not set + +# +# PATA SFF controllers with BMDMA +# +# CONFIG_PATA_ALI is not set +# CONFIG_PATA_AMD is not set +# CONFIG_PATA_ARTOP is not set +# CONFIG_PATA_ATIIXP is not set +# CONFIG_PATA_ATP867X is not set +# CONFIG_PATA_CMD64X is not set +# CONFIG_PATA_CYPRESS is not set +# CONFIG_PATA_EFAR is not set +# CONFIG_PATA_HPT366 is not set +# CONFIG_PATA_HPT37X is not set +# CONFIG_PATA_HPT3X2N is not set +# CONFIG_PATA_HPT3X3 is not set +# CONFIG_PATA_IT8213 is not set +# CONFIG_PATA_IT821X is not set +# CONFIG_PATA_JMICRON is not set +# CONFIG_PATA_MARVELL is not set +# CONFIG_PATA_NETCELL is not set +# CONFIG_PATA_NINJA32 is not set +# CONFIG_PATA_NS87415 is not set +# CONFIG_PATA_OLDPIIX is not set +# CONFIG_PATA_OPTIDMA is not set +# CONFIG_PATA_PDC2027X is not set +# CONFIG_PATA_PDC_OLD is not set +# CONFIG_PATA_RADISYS is not set +# CONFIG_PATA_RDC is not set +# CONFIG_PATA_SCH is not set +# CONFIG_PATA_SERVERWORKS is not set +# CONFIG_PATA_SIL680 is not set +# CONFIG_PATA_SIS is not set +# CONFIG_PATA_TOSHIBA is not set +# CONFIG_PATA_TRIFLEX is not set +# CONFIG_PATA_VIA is not set +# CONFIG_PATA_WINBOND is not set + +# +# PIO-only SFF controllers +# +# CONFIG_PATA_CMD640_PCI is not set +# CONFIG_PATA_MPIIX is not set +# CONFIG_PATA_NS87410 is not set +# CONFIG_PATA_OPTI is not set +# CONFIG_PATA_PLATFORM is not set +# CONFIG_PATA_RZ1000 is not set + +# +# Generic fallback / legacy drivers +# +# CONFIG_ATA_GENERIC is not set +# CONFIG_PATA_LEGACY is not set +CONFIG_MD=y +# CONFIG_BLK_DEV_MD is not set +# CONFIG_BCACHE is not set +# CONFIG_BLK_DEV_DM is not set +# CONFIG_TARGET_CORE is not set +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_FIREWIRE is not set +# CONFIG_FIREWIRE_NOSY is not set +# end of IEEE 1394 (FireWire) support + +CONFIG_NETDEVICES=y +CONFIG_MII=m +CONFIG_NET_CORE=y +CONFIG_BONDING=m +# CONFIG_DUMMY is not set +# CONFIG_WIREGUARD is not set +# CONFIG_EQUALIZER is not set +# CONFIG_NET_FC is not set +# CONFIG_NET_TEAM is not set +# CONFIG_MACVLAN is not set +# CONFIG_IPVLAN is not set +# CONFIG_VXLAN is not set +# CONFIG_GENEVE is not set +# CONFIG_BAREUDP is not set +# CONFIG_GTP is not set +# CONFIG_MACSEC is not set +# CONFIG_NETCONSOLE is not set +CONFIG_TUN=m +# CONFIG_TUN_VNET_CROSS_LE is not set +# CONFIG_VETH is not set +# CONFIG_NLMON is not set +# CONFIG_ARCNET is not set + +# +# Distributed Switch Architecture drivers +# +# end of Distributed Switch Architecture drivers + +CONFIG_ETHERNET=y +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_NET_VENDOR_ADAPTEC is not set +# CONFIG_NET_VENDOR_AGERE is not set +# CONFIG_NET_VENDOR_ALACRITECH is not set +# CONFIG_NET_VENDOR_ALTEON is not set +# CONFIG_ALTERA_TSE is not set +# CONFIG_NET_VENDOR_AMAZON is not set +# CONFIG_NET_VENDOR_AMD is not set +# CONFIG_NET_VENDOR_AQUANTIA is not set +# CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ATHEROS is not set +# CONFIG_NET_VENDOR_AURORA is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_BROCADE is not set +CONFIG_NET_VENDOR_CADENCE=y +# CONFIG_MACB is not set +# CONFIG_NET_VENDOR_CAVIUM is not set +# CONFIG_NET_VENDOR_CHELSIO is not set +# CONFIG_NET_VENDOR_CISCO is not set +# CONFIG_NET_VENDOR_CORTINA is not set +# CONFIG_DNET is not set +# CONFIG_NET_VENDOR_DEC is not set +# CONFIG_NET_VENDOR_DLINK is not set +# CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_GOOGLE is not set +# CONFIG_NET_VENDOR_HISILICON is not set +# CONFIG_NET_VENDOR_HUAWEI is not set +# CONFIG_NET_VENDOR_INTEL is not set +CONFIG_NET_VENDOR_NETSWIFT=y +# CONFIG_JME is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MELLANOX is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_MICROCHIP is not set +# CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_MYRI is not set +# CONFIG_FEALNX is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_NETERION is not set +# CONFIG_NET_VENDOR_NETRONOME is not set +# CONFIG_NET_VENDOR_NI is not set +# CONFIG_NET_VENDOR_NVIDIA is not set +# CONFIG_NET_VENDOR_OKI is not set +# CONFIG_ETHOC is not set +# CONFIG_NET_VENDOR_PACKET_ENGINES is not set +# CONFIG_NET_VENDOR_PENSANDO is not set +# CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_QUALCOMM is not set +# CONFIG_NET_VENDOR_RDC is not set +# CONFIG_NET_VENDOR_REALTEK is not set +# CONFIG_NET_VENDOR_RENESAS is not set +# CONFIG_NET_VENDOR_ROCKER is not set +# CONFIG_NET_VENDOR_SAMSUNG is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set +# CONFIG_NET_VENDOR_SILAN is not set +# CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SMSC is not set +# CONFIG_NET_VENDOR_SOCIONEXT is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_SUN is not set +# CONFIG_NET_VENDOR_SYNOPSYS is not set +# CONFIG_NET_VENDOR_TEHUTI is not set +# CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VIA is not set +# CONFIG_NET_VENDOR_WIZNET is not set +# CONFIG_NET_VENDOR_XILINX is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +CONFIG_PHYLIB=m +CONFIG_SWPHY=y +CONFIG_FIXED_PHY=m + +# +# MII PHY device drivers +# +# CONFIG_AMD_PHY is not set +# CONFIG_ADIN_PHY is not set +# CONFIG_AQUANTIA_PHY is not set +# CONFIG_AX88796B_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_BCM54140_PHY is not set +# CONFIG_BCM7XXX_PHY is not set +# CONFIG_BCM84881_PHY is not set +# CONFIG_BCM87XX_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_CORTINA_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_INTEL_XWAY_PHY is not set +# CONFIG_LSI_ET1011C_PHY is not set +# CONFIG_MARVELL_PHY is not set +# CONFIG_MARVELL_10G_PHY is not set +# CONFIG_MICREL_PHY is not set +# CONFIG_MICROCHIP_PHY is not set +# CONFIG_MICROCHIP_T1_PHY is not set +# CONFIG_MICROSEMI_PHY is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_QSEMI_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_RENESAS_PHY is not set +# CONFIG_ROCKCHIP_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_TERANETICS_PHY is not set +# CONFIG_DP83822_PHY is not set +# CONFIG_DP83TC811_PHY is not set +# CONFIG_DP83848_PHY is not set +# CONFIG_DP83867_PHY is not set +# CONFIG_DP83869_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_XILINX_GMII2RGMII is not set +# CONFIG_MICREL_KS8995MA is not set +CONFIG_MDIO_DEVICE=m +CONFIG_MDIO_BUS=m +CONFIG_OF_MDIO=m +CONFIG_MDIO_DEVRES=m +# CONFIG_MDIO_BITBANG is not set +# CONFIG_MDIO_BCM_UNIMAC is not set +# CONFIG_MDIO_HISI_FEMAC is not set +# CONFIG_MDIO_MVUSB is not set +# CONFIG_MDIO_MSCC_MIIM is not set +# CONFIG_MDIO_OCTEON is not set +# CONFIG_MDIO_IPQ4019 is not set +# CONFIG_MDIO_IPQ8064 is not set +# CONFIG_MDIO_THUNDER is not set + +# +# MDIO Multiplexers +# +# CONFIG_MDIO_BUS_MUX_GPIO is not set +# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set +# CONFIG_MDIO_BUS_MUX_MMIOREG is not set + +# +# PCS device drivers +# +# CONFIG_PCS_XPCS is not set +# end of PCS device drivers + +# CONFIG_PPP is not set +# CONFIG_SLIP is not set + +# +# Host-side USB support is needed for USB Network Adapter support +# +CONFIG_USB_NET_DRIVERS=m +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=m +# CONFIG_USB_NET_AX8817X is not set +# CONFIG_USB_NET_AX88179_178A is not set +CONFIG_USB_NET_CDCETHER=m +# CONFIG_USB_NET_CDC_EEM is not set +# CONFIG_USB_NET_CDC_NCM is not set +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +# CONFIG_USB_NET_NET1080 is not set +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +CONFIG_USB_NET_RNDIS_HOST=m +# CONFIG_USB_NET_CDC_SUBSET is not set +# CONFIG_USB_NET_ZAURUS is not set +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +# CONFIG_WLAN is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +# +# CONFIG_WAN is not set +# CONFIG_VMXNET3 is not set +# CONFIG_NETDEVSIM is not set +# CONFIG_NET_FAILOVER is not set +# CONFIG_ISDN is not set +# CONFIG_NVM is not set + +# +# Input device support +# +# CONFIG_INPUT is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set +# end of Hardware I/O ports +# end of Input device support + +# +# Character devices +# +CONFIG_TTY=y +# CONFIG_VT is not set +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +# CONFIG_LDISC_AUTOLOAD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_EARLYCON=y +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y +# CONFIG_SERIAL_8250_16550A_VARIANTS is not set +# CONFIG_SERIAL_8250_FINTEK is not set +CONFIG_SERIAL_8250_CONSOLE=y +# CONFIG_SERIAL_8250_PCI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_ASPEED_VUART is not set +CONFIG_SERIAL_8250_DWLIB=y +CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_DW=y +# CONFIG_SERIAL_8250_RT288X is not set +# CONFIG_SERIAL_OF_PLATFORM is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_AMBA_PL010 is not set +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y +# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_MAX310X is not set +# CONFIG_SERIAL_UARTLITE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_JSM is not set +# CONFIG_SERIAL_SIFIVE is not set +# CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_SC16IS7XX is not set +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_IFX6X60 is not set +# CONFIG_SERIAL_XILINX_PS_UART is not set +# CONFIG_SERIAL_ARC is not set +# CONFIG_SERIAL_RP2 is not set +# CONFIG_SERIAL_FSL_LPUART is not set +# CONFIG_SERIAL_FSL_LINFLEXUART is not set +# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set +# CONFIG_SERIAL_SPRD is not set +# end of Serial drivers + +CONFIG_SERIAL_MCTRL_GPIO=y +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_N_GSM is not set +# CONFIG_NOZOMI is not set +# CONFIG_NULL_TTY is not set +# CONFIG_TRACE_SINK is not set +# CONFIG_HVC_DCC is not set +# CONFIG_SERIAL_DEV_BUS is not set +# CONFIG_TTY_PRINTK is not set +# CONFIG_VIRTIO_CONSOLE is not set +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=m +# CONFIG_HW_RANDOM_TIMERIOMEM is not set +# CONFIG_HW_RANDOM_BA431 is not set +# CONFIG_HW_RANDOM_HISI is not set +# CONFIG_HW_RANDOM_CAVIUM is not set +# CONFIG_HW_RANDOM_CCTRNG is not set +# CONFIG_HW_RANDOM_XIPHERA is not set +# CONFIG_APPLICOM is not set +CONFIG_DEVMEM=y +# CONFIG_RAW_DRIVER is not set +CONFIG_DEVPORT=y +CONFIG_TCG_TPM=y +# CONFIG_TCG_TIS is not set +# CONFIG_TCG_TIS_SPI is not set +# CONFIG_TCG_TIS_I2C_ATMEL is not set +# CONFIG_TCG_TIS_I2C_INFINEON is not set +# CONFIG_TCG_TIS_I2C_NUVOTON is not set +# CONFIG_TCG_ATMEL is not set +# CONFIG_TCG_VTPM_PROXY is not set +# CONFIG_TCG_TIS_ST33ZP24_I2C is not set +# CONFIG_TCG_TIS_ST33ZP24_SPI is not set +# CONFIG_XILLYBUS is not set +# end of Character devices + +# CONFIG_RANDOM_TRUST_BOOTLOADER is not set + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_COMPAT=y +CONFIG_I2C_CHARDEV=m +# CONFIG_I2C_MUX is not set +CONFIG_I2C_HELPER_AUTO=y + +# +# I2C Hardware Bus support +# + +# +# PC SMBus host controller drivers +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +# CONFIG_I2C_HIX5HD2 is not set +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_ISCH is not set +# CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_NFORCE2 is not set +# CONFIG_I2C_NVIDIA_GPU is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set +# CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_VIA is not set +# CONFIG_I2C_VIAPRO is not set + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +# CONFIG_I2C_CADENCE is not set +# CONFIG_I2C_CBUS_GPIO is not set +# CONFIG_I2C_DESIGNWARE_PLATFORM is not set +# CONFIG_I2C_DESIGNWARE_PCI is not set +# CONFIG_I2C_EMEV2 is not set +# CONFIG_I2C_GPIO is not set +# CONFIG_I2C_HISI is not set +# CONFIG_I2C_NOMADIK is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PCA_PLATFORM is not set +# CONFIG_I2C_RK3X is not set +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_THUNDERX is not set +# CONFIG_I2C_XILINX is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_ROBOTFUZZ_OSIF is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Other I2C/SMBus bus drivers +# +# end of I2C Hardware Bus support + +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_SLAVE is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# end of I2C support + +# CONFIG_I3C is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y +# CONFIG_SPI_MEM is not set + +# +# SPI Master Controller Drivers +# +# CONFIG_SPI_ALTERA is not set +# CONFIG_SPI_AXI_SPI_ENGINE is not set +# CONFIG_SPI_BITBANG is not set +# CONFIG_SPI_CADENCE is not set +# CONFIG_SPI_CADENCE_QUADSPI is not set +# CONFIG_SPI_DESIGNWARE is not set +# CONFIG_SPI_NXP_FLEXSPI is not set +# CONFIG_SPI_GPIO is not set +# CONFIG_SPI_FSL_SPI is not set +# CONFIG_SPI_OC_TINY is not set +# CONFIG_SPI_PL022 is not set +# CONFIG_SPI_PXA2XX is not set +# CONFIG_SPI_ROCKCHIP is not set +# CONFIG_SPI_SC18IS602 is not set +# CONFIG_SPI_SIFIVE is not set +# CONFIG_SPI_MXIC is not set +# CONFIG_SPI_THUNDERX is not set +# CONFIG_SPI_XCOMM is not set +# CONFIG_SPI_XILINX is not set +# CONFIG_SPI_ZYNQMP_GQSPI is not set +# CONFIG_SPI_AMD is not set + +# +# SPI Multiplexer support +# +# CONFIG_SPI_MUX is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_SPIDEV is not set +# CONFIG_SPI_LOOPBACK_TEST is not set +# CONFIG_SPI_TLE62X0 is not set +# CONFIG_SPI_SLAVE is not set +# CONFIG_SPMI is not set +# CONFIG_HSI is not set +# CONFIG_PPS is not set + +# +# PTP clock support +# +# CONFIG_PTP_1588_CLOCK is not set + +# +# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. +# +# end of PTP clock support + +CONFIG_PINCTRL=y +# CONFIG_DEBUG_PINCTRL is not set +# CONFIG_PINCTRL_MCP23S08 is not set +# CONFIG_PINCTRL_SINGLE is not set +# CONFIG_PINCTRL_STMFX is not set +# CONFIG_PINCTRL_OCELOT is not set + +# +# Renesas pinctrl drivers +# +# end of Renesas pinctrl drivers + +CONFIG_GPIOLIB=y +CONFIG_GPIOLIB_FASTPATH_LIMIT=512 +CONFIG_OF_GPIO=y +# CONFIG_DEBUG_GPIO is not set +# CONFIG_GPIO_SYSFS is not set +CONFIG_GPIO_CDEV=y +# CONFIG_GPIO_CDEV_V1 is not set +CONFIG_GPIO_GENERIC=m + +# +# Memory mapped GPIO drivers +# +# CONFIG_GPIO_74XX_MMIO is not set +# CONFIG_GPIO_ALTERA is not set +# CONFIG_GPIO_CADENCE is not set +# CONFIG_GPIO_DWAPB is not set +# CONFIG_GPIO_FTGPIO010 is not set +CONFIG_GPIO_GENERIC_PLATFORM=m +# CONFIG_GPIO_GRGPIO is not set +# CONFIG_GPIO_HLWD is not set +# CONFIG_GPIO_LOGICVC is not set +# CONFIG_GPIO_MB86S7X is not set +# CONFIG_GPIO_PL061 is not set +# CONFIG_GPIO_SAMA5D2_PIOBU is not set +# CONFIG_GPIO_SIFIVE is not set +# CONFIG_GPIO_SYSCON is not set +# CONFIG_GPIO_XGENE is not set +# CONFIG_GPIO_XILINX is not set +# CONFIG_GPIO_AMD_FCH is not set +# end of Memory mapped GPIO drivers + +# +# I2C GPIO expanders +# +# CONFIG_GPIO_ADP5588 is not set +# CONFIG_GPIO_ADNP is not set +# CONFIG_GPIO_GW_PLD is not set +# CONFIG_GPIO_MAX7300 is not set +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_GPIO_PCA9570 is not set +# CONFIG_GPIO_PCF857X is not set +# CONFIG_GPIO_TPIC2810 is not set +# end of I2C GPIO expanders + +# +# MFD GPIO expanders +# +# end of MFD GPIO expanders + +# +# PCI GPIO expanders +# +# CONFIG_GPIO_BT8XX is not set +# CONFIG_GPIO_PCI_IDIO_16 is not set +# CONFIG_GPIO_PCIE_IDIO_24 is not set +# CONFIG_GPIO_RDC321X is not set +# end of PCI GPIO expanders + +# +# SPI GPIO expanders +# +# CONFIG_GPIO_74X164 is not set +# CONFIG_GPIO_MAX3191X is not set +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MC33880 is not set +# CONFIG_GPIO_PISOSR is not set +# CONFIG_GPIO_XRA1403 is not set +# end of SPI GPIO expanders + +# +# USB GPIO expanders +# +# end of USB GPIO expanders + +# CONFIG_GPIO_AGGREGATOR is not set +# CONFIG_GPIO_MOCKUP is not set +# CONFIG_W1 is not set +CONFIG_POWER_RESET=y +# CONFIG_POWER_RESET_BRCMSTB is not set +# CONFIG_POWER_RESET_GPIO is not set +# CONFIG_POWER_RESET_GPIO_RESTART is not set +# CONFIG_POWER_RESET_HISI is not set +# CONFIG_POWER_RESET_LTC2952 is not set +# CONFIG_POWER_RESET_RESTART is not set +# CONFIG_POWER_RESET_XGENE is not set +# CONFIG_POWER_RESET_SYSCON is not set +# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set +# CONFIG_SYSCON_REBOOT_MODE is not set +# CONFIG_NVMEM_REBOOT_MODE is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +# CONFIG_PDA_POWER is not set +# CONFIG_TEST_POWER is not set +# CONFIG_CHARGER_ADP5061 is not set +# CONFIG_BATTERY_CW2015 is not set +# CONFIG_BATTERY_DS2780 is not set +# CONFIG_BATTERY_DS2781 is not set +# CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SBS is not set +# CONFIG_CHARGER_SBS is not set +# CONFIG_BATTERY_BQ27XXX is not set +# CONFIG_BATTERY_MAX17040 is not set +# CONFIG_BATTERY_MAX17042 is not set +# CONFIG_CHARGER_MAX8903 is not set +# CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_GPIO is not set +# CONFIG_CHARGER_LT3651 is not set +# CONFIG_CHARGER_DETECTOR_MAX14656 is not set +# CONFIG_CHARGER_BQ2415X is not set +# CONFIG_CHARGER_BQ24257 is not set +# CONFIG_CHARGER_BQ24735 is not set +# CONFIG_CHARGER_BQ2515X is not set +# CONFIG_CHARGER_BQ25890 is not set +# CONFIG_CHARGER_BQ25980 is not set +# CONFIG_CHARGER_SMB347 is not set +# CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_CHARGER_RT9455 is not set +# CONFIG_CHARGER_BD99954 is not set +# CONFIG_HWMON is not set +# CONFIG_THERMAL is not set +# CONFIG_WATCHDOG is not set +CONFIG_SSB_POSSIBLE=y +# CONFIG_SSB is not set +CONFIG_BCMA_POSSIBLE=y +# CONFIG_BCMA is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_ACT8945A is not set +# CONFIG_MFD_ATMEL_FLEXCOM is not set +# CONFIG_MFD_ATMEL_HLCDC is not set +# CONFIG_MFD_BCM590XX is not set +# CONFIG_MFD_BD9571MWV is not set +# CONFIG_MFD_AXP20X_I2C is not set +# CONFIG_MFD_MADERA is not set +# CONFIG_MFD_DA9052_SPI is not set +# CONFIG_MFD_DA9062 is not set +# CONFIG_MFD_DA9063 is not set +# CONFIG_MFD_DA9150 is not set +# CONFIG_MFD_DLN2 is not set +# CONFIG_MFD_GATEWORKS_GSC is not set +# CONFIG_MFD_MC13XXX_SPI is not set +# CONFIG_MFD_MC13XXX_I2C is not set +# CONFIG_MFD_MP2629 is not set +# CONFIG_MFD_HI6421_PMIC is not set +# CONFIG_MFD_HI655X_PMIC is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_LPC_ICH is not set +# CONFIG_LPC_SCH is not set +# CONFIG_MFD_IQS62X is not set +# CONFIG_MFD_JANZ_CMODIO is not set +# CONFIG_MFD_KEMPLD is not set +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_MAX14577 is not set +# CONFIG_MFD_MAX77650 is not set +# CONFIG_MFD_MAX77686 is not set +# CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6397 is not set +# CONFIG_MFD_MENF21BMC is not set +# CONFIG_EZX_PCAP is not set +# CONFIG_MFD_CPCAP is not set +# CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_RETU is not set +# CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RK808 is not set +# CONFIG_MFD_RN5T618 is not set +# CONFIG_MFD_SI476X_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SKY81452 is not set +# CONFIG_ABX500_CORE is not set +# CONFIG_MFD_STMPE is not set +CONFIG_MFD_SYSCON=y +# CONFIG_MFD_TI_AM335X_TSCADC is not set +# CONFIG_MFD_LP3943 is not set +# CONFIG_MFD_TI_LMU is not set +# CONFIG_TPS6105X is not set +# CONFIG_TPS65010 is not set +# CONFIG_TPS6507X is not set +# CONFIG_MFD_TPS65086 is not set +# CONFIG_MFD_TPS65217 is not set +# CONFIG_MFD_TI_LP873X is not set +# CONFIG_MFD_TI_LP87565 is not set +# CONFIG_MFD_TPS65218 is not set +# CONFIG_MFD_TPS65912_I2C is not set +# CONFIG_MFD_TPS65912_SPI is not set +# CONFIG_MFD_WL1273_CORE is not set +# CONFIG_MFD_LM3533 is not set +# CONFIG_MFD_TQMX86 is not set +# CONFIG_MFD_VX855 is not set +# CONFIG_MFD_ARIZONA_I2C is not set +# CONFIG_MFD_ARIZONA_SPI is not set +# CONFIG_MFD_WM831X_SPI is not set +# CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_STMFX is not set +# CONFIG_MFD_INTEL_M10_BMC is not set +# end of Multifunction device drivers + +# CONFIG_REGULATOR is not set +# CONFIG_MEDIA_CEC_SUPPORT is not set +# CONFIG_MEDIA_SUPPORT is not set + +# +# Graphics support +# +# CONFIG_VGA_ARB is not set +# CONFIG_DRM is not set + +# +# ARM devices +# +# end of ARM devices + +# +# Frame buffer Devices +# +# CONFIG_FB is not set +# end of Frame buffer Devices + +# +# Backlight & LCD device support +# +# CONFIG_LCD_CLASS_DEVICE is not set +# CONFIG_BACKLIGHT_CLASS_DEVICE is not set +# end of Backlight & LCD device support +# end of Graphics support + +# CONFIG_SOUND is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=m +# CONFIG_USB_ULPI_BUS is not set +# CONFIG_USB_CONN_GPIO is not set +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=m +# CONFIG_USB_PCI is not set +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y + +# +# Miscellaneous USB options +# +CONFIG_USB_DEFAULT_PERSIST=y +# CONFIG_USB_FEW_INIT_RETRIES is not set +CONFIG_USB_DYNAMIC_MINORS=y +# CONFIG_USB_OTG_PRODUCTLIST is not set +# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set +CONFIG_USB_AUTOSUSPEND_DELAY=2 +# CONFIG_USB_MON is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_XHCI_HCD is not set +# CONFIG_USB_EHCI_HCD is not set +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_FOTG210_HCD is not set +# CONFIG_USB_MAX3421_HCD is not set +# CONFIG_USB_OHCI_HCD is not set +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HCD_TEST_MODE is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_REALTEK is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +# CONFIG_USB_STORAGE_ENE_UB6250 is not set +# CONFIG_USB_UAS is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USBIP_CORE is not set +# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_DWC3 is not set +# CONFIG_USB_DWC2 is not set +# CONFIG_USB_ISP1760 is not set + +# +# USB port drivers +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_APPLE_MFI_FASTCHARGE is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_EHSET_TEST_FIXTURE is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_YUREX is not set +# CONFIG_USB_EZUSB_FX2 is not set +# CONFIG_USB_HUB_USB251XB is not set +# CONFIG_USB_HSIC_USB3503 is not set +# CONFIG_USB_HSIC_USB4604 is not set +# CONFIG_USB_LINK_LAYER_TEST is not set +# CONFIG_USB_CHAOSKEY is not set + +# +# USB Physical Layer drivers +# +# CONFIG_NOP_USB_XCEIV is not set +# CONFIG_USB_GPIO_VBUS is not set +# CONFIG_USB_ISP1301 is not set +# CONFIG_USB_ULPI is not set +# end of USB Physical Layer drivers + +# CONFIG_USB_GADGET is not set +# CONFIG_TYPEC is not set +# CONFIG_USB_ROLE_SWITCH is not set +# CONFIG_MMC is not set +# CONFIG_MEMSTICK is not set +# CONFIG_NEW_LEDS is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_INFINIBAND is not set +CONFIG_EDAC_SUPPORT=y +# CONFIG_EDAC is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +# CONFIG_RTC_HCTOSYS is not set +# CONFIG_RTC_SYSTOHC is not set +# CONFIG_RTC_DEBUG is not set +# CONFIG_RTC_NVMEM is not set + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_ABB5ZES3 is not set +# CONFIG_RTC_DRV_ABEOZ9 is not set +# CONFIG_RTC_DRV_ABX80X is not set +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_HYM8563 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_ISL12022 is not set +# CONFIG_RTC_DRV_ISL12026 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8523 is not set +# CONFIG_RTC_DRV_PCF85063 is not set +# CONFIG_RTC_DRV_PCF85363 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_BQ32K is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_RX8010 is not set +# CONFIG_RTC_DRV_RX8581 is not set +# CONFIG_RTC_DRV_RX8025 is not set +# CONFIG_RTC_DRV_EM3027 is not set +# CONFIG_RTC_DRV_RV3028 is not set +# CONFIG_RTC_DRV_RV3032 is not set +# CONFIG_RTC_DRV_RV8803 is not set +# CONFIG_RTC_DRV_SD3078 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T93 is not set +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1302 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1343 is not set +# CONFIG_RTC_DRV_DS1347 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6916 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RX4581 is not set +# CONFIG_RTC_DRV_RX6110 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_PCF2123 is not set +# CONFIG_RTC_DRV_MCP795 is not set +CONFIG_RTC_I2C_AND_SPI=m + +# +# SPI and I2C RTC drivers +# +# CONFIG_RTC_DRV_DS3232 is not set +# CONFIG_RTC_DRV_PCF2127 is not set +# CONFIG_RTC_DRV_RV3029C2 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1685_FAMILY is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_DS2404 is not set +# CONFIG_RTC_DRV_EFI is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_MSM6242 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_RP5C01 is not set +# CONFIG_RTC_DRV_V3020 is not set +# CONFIG_RTC_DRV_ZYNQMP is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_PL030 is not set +# CONFIG_RTC_DRV_PL031 is not set +# CONFIG_RTC_DRV_CADENCE is not set +# CONFIG_RTC_DRV_FTRTC010 is not set +# CONFIG_RTC_DRV_R7301 is not set + +# +# HID Sensor RTC drivers +# +# CONFIG_DMADEVICES is not set + +# +# DMABUF options +# +# CONFIG_SYNC_FILE is not set +# CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_HEAPS is not set +# end of DMABUF options + +# CONFIG_AUXDISPLAY is not set +CONFIG_UIO=m +# CONFIG_UIO_CIF is not set +# CONFIG_UIO_PDRV_GENIRQ is not set +# CONFIG_UIO_DMEM_GENIRQ is not set +# CONFIG_UIO_AEC is not set +# CONFIG_UIO_SERCOS3 is not set +# CONFIG_UIO_PCI_GENERIC is not set +# CONFIG_UIO_NETX is not set +# CONFIG_UIO_PRUSS is not set +# CONFIG_UIO_MF624 is not set +# CONFIG_VFIO is not set +# CONFIG_VIRT_DRIVERS is not set +# CONFIG_VIRTIO_MENU is not set +# CONFIG_VDPA is not set +# CONFIG_VHOST_MENU is not set + +# +# Microsoft Hyper-V guest support +# +# end of Microsoft Hyper-V guest support + +# CONFIG_GREYBUS is not set +# CONFIG_STAGING is not set +# CONFIG_GOLDFISH is not set +# CONFIG_CHROME_PLATFORMS is not set +# CONFIG_MELLANOX_PLATFORM is not set +CONFIG_HAVE_CLK=y +CONFIG_CLKDEV_LOOKUP=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y +# CONFIG_COMMON_CLK_MAX9485 is not set +# CONFIG_COMMON_CLK_SI5341 is not set +# CONFIG_COMMON_CLK_SI5351 is not set +# CONFIG_COMMON_CLK_SI514 is not set +# CONFIG_COMMON_CLK_SI544 is not set +# CONFIG_COMMON_CLK_SI570 is not set +# CONFIG_COMMON_CLK_CDCE706 is not set +# CONFIG_COMMON_CLK_CDCE925 is not set +# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_CLK_QORIQ is not set +# CONFIG_COMMON_CLK_XGENE is not set +# CONFIG_COMMON_CLK_VC5 is not set +# CONFIG_COMMON_CLK_FIXED_MMIO is not set +# CONFIG_COMMON_CLK_HI3516CV300 is not set +# CONFIG_COMMON_CLK_HI3519 is not set +# CONFIG_COMMON_CLK_HI3660 is not set +# CONFIG_COMMON_CLK_HI3670 is not set +# CONFIG_COMMON_CLK_HI3798CV200 is not set +# CONFIG_COMMON_CLK_HI6220 is not set +# CONFIG_RESET_HISI is not set +# CONFIG_HWSPINLOCK is not set + +# +# Clock Source drivers +# +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_CLKSRC_MMIO=y +CONFIG_ARM_ARCH_TIMER=y +CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y +CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y +CONFIG_FSL_ERRATUM_A008585=y +CONFIG_HISILICON_ERRATUM_161010101=y +CONFIG_ARM64_ERRATUM_858921=y +CONFIG_ARM_TIMER_SP804=y +# CONFIG_MICROCHIP_PIT64B is not set +# end of Clock Source drivers + +# CONFIG_MAILBOX is not set +# CONFIG_IOMMU_SUPPORT is not set + +# +# Remoteproc drivers +# +# CONFIG_REMOTEPROC is not set +# end of Remoteproc drivers + +# +# Rpmsg drivers +# +# CONFIG_RPMSG_VIRTIO is not set +# end of Rpmsg drivers + +# CONFIG_SOUNDWIRE is not set + +# +# SOC (System On Chip) specific Drivers +# + +# +# Amlogic SoC drivers +# +# end of Amlogic SoC drivers + +# +# Aspeed SoC drivers +# +# end of Aspeed SoC drivers + +# +# Broadcom SoC drivers +# +# CONFIG_SOC_BRCMSTB is not set +# end of Broadcom SoC drivers + +# +# NXP/Freescale QorIQ SoC drivers +# +# CONFIG_QUICC_ENGINE is not set +# end of NXP/Freescale QorIQ SoC drivers + +# +# i.MX SoC drivers +# +# end of i.MX SoC drivers + +# +# Qualcomm SoC drivers +# +# end of Qualcomm SoC drivers + +# CONFIG_SOC_TI is not set + +# +# Xilinx SoC drivers +# +# CONFIG_XILINX_VCU is not set +# end of Xilinx SoC drivers +# end of SOC (System On Chip) specific Drivers + +# CONFIG_PM_DEVFREQ is not set +# CONFIG_EXTCON is not set +# CONFIG_MEMORY is not set +# CONFIG_IIO is not set +# CONFIG_NTB is not set +# CONFIG_VME_BUS is not set +# CONFIG_PWM is not set + +# +# IRQ chip support +# +CONFIG_IRQCHIP=y +CONFIG_ARM_GIC=y +CONFIG_ARM_GIC_MAX_NR=1 +CONFIG_ARM_GIC_V2M=y +CONFIG_ARM_GIC_V3=y +CONFIG_ARM_GIC_V3_ITS=y +CONFIG_ARM_GIC_V3_ITS_PCI=y +# CONFIG_AL_FIC is not set +CONFIG_HISILICON_IRQ_MBIGEN=y +CONFIG_PARTITION_PERCPU=y +# end of IRQ chip support + +# CONFIG_IPACK_BUS is not set +# CONFIG_RESET_CONTROLLER is not set + +# +# PHY Subsystem +# +CONFIG_GENERIC_PHY=y +# CONFIG_PHY_XGENE is not set +# CONFIG_BCM_KONA_USB2_PHY is not set +# CONFIG_PHY_CADENCE_TORRENT is not set +# CONFIG_PHY_CADENCE_DPHY is not set +# CONFIG_PHY_CADENCE_SALVO is not set +# CONFIG_PHY_FSL_IMX8MQ_USB is not set +# CONFIG_PHY_MIXEL_MIPI_DPHY is not set +# CONFIG_PHY_HI6220_USB is not set +# CONFIG_PHY_HI3660_USB is not set +# CONFIG_PHY_HISTB_COMBPHY is not set +# CONFIG_PHY_HISI_INNO_USB2 is not set +# CONFIG_PHY_PXA_28NM_HSIC is not set +# CONFIG_PHY_PXA_28NM_USB2 is not set +# CONFIG_PHY_MAPPHONE_MDM6600 is not set +# CONFIG_PHY_OCELOT_SERDES is not set +# end of PHY Subsystem + +# CONFIG_POWERCAP is not set +# CONFIG_MCB is not set +CONFIG_RAS=y +# CONFIG_USB4 is not set + +# +# Android +# +# CONFIG_ANDROID is not set +# end of Android + +# CONFIG_LIBNVDIMM is not set +# CONFIG_PMEM_LEGACY is not set +CONFIG_DAX=y +# CONFIG_NVMEM is not set + +# +# HW tracing support +# +# CONFIG_STM is not set +# CONFIG_INTEL_TH is not set +# end of HW tracing support + +# CONFIG_FPGA is not set +# CONFIG_FSI is not set +# CONFIG_TEE is not set +# CONFIG_SIOX is not set +# CONFIG_SLIMBUS is not set +# CONFIG_INTERCONNECT is not set +# CONFIG_COUNTER is not set +# end of Device Drivers + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +# CONFIG_VALIDATE_FS_PARSER is not set +CONFIG_FS_IOMAP=y +CONFIG_EXT2_FS=m +CONFIG_EXT2_FS_XATTR=y +# CONFIG_EXT2_FS_POSIX_ACL is not set +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=m +# CONFIG_EXT3_FS_POSIX_ACL is not set +CONFIG_EXT3_FS_SECURITY=y +CONFIG_EXT4_FS=y +# CONFIG_EXT4_FS_POSIX_ACL is not set +CONFIG_EXT4_FS_SECURITY=y +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD2=y +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_BTRFS_FS is not set +# CONFIG_NILFS2_FS is not set +# CONFIG_F2FS_FS is not set +CONFIG_FS_DAX=y +CONFIG_FS_POSIX_ACL=y +CONFIG_EXPORTFS=y +# CONFIG_EXPORTFS_BLOCK_OPS is not set +CONFIG_FILE_LOCKING=y +# CONFIG_MANDATORY_FILE_LOCKING is not set +# CONFIG_FS_ENCRYPTION is not set +# CONFIG_FS_VERITY is not set +CONFIG_FSNOTIFY=y +CONFIG_DNOTIFY=y +CONFIG_INOTIFY_USER=y +CONFIG_FANOTIFY=y +# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS4_FS is not set +CONFIG_AUTOFS_FS=m +# CONFIG_FUSE_FS is not set +# CONFIG_OVERLAY_FS is not set + +# +# Caches +# +# CONFIG_FSCACHE is not set +# end of Caches + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set +# end of CD-ROM/DVD Filesystems + +# +# DOS/FAT/EXFAT/NT Filesystems +# +CONFIG_FAT_FS=m +# CONFIG_MSDOS_FS is not set +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_FAT_DEFAULT_UTF8 is not set +# CONFIG_EXFAT_FS is not set +# CONFIG_NTFS_FS is not set +# end of DOS/FAT/EXFAT/NT Filesystems + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +# CONFIG_PROC_CHILDREN is not set +CONFIG_KERNFS=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TMPFS_XATTR=y +# CONFIG_TMPFS_INODE64 is not set +CONFIG_HUGETLBFS=y +CONFIG_HUGETLB_PAGE=y +CONFIG_MEMFD_CREATE=y +CONFIG_ARCH_HAS_GIGANTIC_PAGE=y +# CONFIG_CONFIGFS_FS is not set +# CONFIG_EFIVAR_FS is not set +# end of Pseudo filesystems + +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_ORANGEFS_FS is not set +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_ECRYPT_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +CONFIG_JFFS2_FS=m +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set +CONFIG_JFFS2_SUMMARY=y +CONFIG_JFFS2_FS_XATTR=y +CONFIG_JFFS2_FS_POSIX_ACL=y +CONFIG_JFFS2_FS_SECURITY=y +CONFIG_JFFS2_COMPRESSION_OPTIONS=y +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_LZO=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +# CONFIG_JFFS2_CMODE_NONE is not set +CONFIG_JFFS2_CMODE_PRIORITY=y +# CONFIG_JFFS2_CMODE_SIZE is not set +# CONFIG_JFFS2_CMODE_FAVOURLZO is not set +# CONFIG_UBIFS_FS is not set +# CONFIG_CRAMFS is not set +CONFIG_SQUASHFS=m +CONFIG_SQUASHFS_FILE_CACHE=y +# CONFIG_SQUASHFS_FILE_DIRECT is not set +CONFIG_SQUASHFS_DECOMP_SINGLE=y +# CONFIG_SQUASHFS_DECOMP_MULTI is not set +# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set +CONFIG_SQUASHFS_XATTR=y +CONFIG_SQUASHFS_ZLIB=y +# CONFIG_SQUASHFS_LZ4 is not set +# CONFIG_SQUASHFS_LZO is not set +CONFIG_SQUASHFS_XZ=y +# CONFIG_SQUASHFS_ZSTD is not set +# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX6FS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_PSTORE is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +# CONFIG_EROFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +# CONFIG_NFS_FS is not set +# CONFIG_NFSD is not set +# CONFIG_CEPH_FS is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS2 is not set +# CONFIG_CIFS_ALLOW_INSECURE_LEGACY is not set +# CONFIG_CIFS_UPCALL is not set +# CONFIG_CIFS_XATTR is not set +CONFIG_CIFS_DEBUG=y +# CONFIG_CIFS_DEBUG2 is not set +# CONFIG_CIFS_DEBUG_DUMP_KEYS is not set +# CONFIG_CIFS_DFS_UPCALL is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +# CONFIG_EULER_FS is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=m +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=m +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set +CONFIG_NLS_UTF8=m +# CONFIG_UNICODE is not set +# end of File systems + +# +# Security options +# +CONFIG_KEYS=y +CONFIG_KEYS_REQUEST_CACHE=y +# CONFIG_PERSISTENT_KEYRINGS is not set +# CONFIG_TRUSTED_KEYS is not set +# CONFIG_ENCRYPTED_KEYS is not set +# CONFIG_KEY_DH_OPERATIONS is not set +CONFIG_SECURITY_DMESG_RESTRICT=y +CONFIG_SECURITY=y +CONFIG_SECURITYFS=y +CONFIG_SECURITY_NETWORK=y +# CONFIG_SECURITY_NETWORK_XFRM is not set +# CONFIG_SECURITY_PATH is not set +CONFIG_LSM_MMAP_MIN_ADDR=32768 +CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y +CONFIG_HARDENED_USERCOPY=y +CONFIG_HARDENED_USERCOPY_FALLBACK=y +# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set +# CONFIG_FORTIFY_SOURCE is not set +# CONFIG_STATIC_USERMODEHELPER is not set +CONFIG_SECURITY_SELINUX=y +CONFIG_SECURITY_SELINUX_BOOTPARAM=y +# CONFIG_SECURITY_SELINUX_DISABLE is not set +CONFIG_SECURITY_SELINUX_DEVELOP=y +CONFIG_SECURITY_SELINUX_AVC_STATS=y +CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0 +CONFIG_SECURITY_SELINUX_SIDTAB_HASH_BITS=9 +CONFIG_SECURITY_SELINUX_SID2STR_CACHE_SIZE=256 +CONFIG_SECURITY_SMACK=y +# CONFIG_SECURITY_SMACK_BRINGUP is not set +# CONFIG_SECURITY_SMACK_NETFILTER is not set +# CONFIG_SECURITY_SMACK_APPEND_SIGNALS is not set +# CONFIG_SECURITY_TOMOYO is not set +# CONFIG_SECURITY_APPARMOR is not set +# CONFIG_SECURITY_LOADPIN is not set +CONFIG_SECURITY_YAMA=y +# CONFIG_SECURITY_SAFESETID is not set +# CONFIG_SECURITY_LOCKDOWN_LSM is not set +CONFIG_INTEGRITY=y +# CONFIG_INTEGRITY_SIGNATURE is not set +CONFIG_INTEGRITY_AUDIT=y +# CONFIG_IMA is not set +# CONFIG_EVM is not set +# CONFIG_DEFAULT_SECURITY_SELINUX is not set +# CONFIG_DEFAULT_SECURITY_SMACK is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" + +# +# Kernel hardening options +# + +# +# Memory initialization +# +CONFIG_INIT_STACK_NONE=y +# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set +# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set +# end of Memory initialization +# end of Kernel hardening options + +CONFIG_SECURITY_BOOT_INIT=y +# end of Security options + +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=m +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_SKCIPHER=m +CONFIG_CRYPTO_SKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_AKCIPHER2=y +CONFIG_CRYPTO_AKCIPHER=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_ACOMP2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_USER is not set +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +CONFIG_CRYPTO_GF128MUL=m +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_NULL2=y +# CONFIG_CRYPTO_PCRYPT is not set +# CONFIG_CRYPTO_CRYPTD is not set +# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_TEST is not set + +# +# Public-key cryptography +# +CONFIG_CRYPTO_RSA=y +# CONFIG_CRYPTO_DH is not set +# CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set +# CONFIG_CRYPTO_ECRDSA is not set +# CONFIG_CRYPTO_SM2 is not set +# CONFIG_CRYPTO_CURVE25519 is not set + +# +# Authenticated Encryption with Associated Data +# +CONFIG_CRYPTO_CCM=m +CONFIG_CRYPTO_GCM=m +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set + +# +# Block modes +# +# CONFIG_CRYPTO_CBC is not set +# CONFIG_CRYPTO_CFB is not set +CONFIG_CRYPTO_CTR=m +# CONFIG_CRYPTO_CTS is not set +CONFIG_CRYPTO_ECB=m +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_OFB is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_XTS is not set +# CONFIG_CRYPTO_KEYWRAP is not set +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_ESSIV is not set + +# +# Hash modes +# +CONFIG_CRYPTO_CMAC=m +CONFIG_CRYPTO_HMAC=y +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_VMAC is not set + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_XXHASH is not set +# CONFIG_CRYPTO_BLAKE2B is not set +# CONFIG_CRYPTO_BLAKE2S is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +CONFIG_CRYPTO_GHASH=m +# CONFIG_CRYPTO_POLY1305 is not set +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_MICHAEL_MIC=m +# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_RMD160 is not set +# CONFIG_CRYPTO_RMD256 is not set +# CONFIG_CRYPTO_RMD320 is not set +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=m +# CONFIG_CRYPTO_SHA3 is not set +# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_STREEBOG is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_WP512 is not set + +# +# Ciphers +# +CONFIG_CRYPTO_AES=m +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ANUBIS is not set +CONFIG_CRYPTO_ARC4=m +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_SALSA20 is not set +# CONFIG_CRYPTO_CHACHA20 is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4 is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TWOFISH is not set + +# +# Compression +# +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_LZO is not set +# CONFIG_CRYPTO_842 is not set +# CONFIG_CRYPTO_LZ4 is not set +# CONFIG_CRYPTO_LZ4HC is not set +# CONFIG_CRYPTO_ZSTD is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_DRBG_MENU=m +CONFIG_CRYPTO_DRBG_HMAC=y +# CONFIG_CRYPTO_DRBG_HASH is not set +# CONFIG_CRYPTO_DRBG_CTR is not set +CONFIG_CRYPTO_DRBG=m +CONFIG_CRYPTO_JITTERENTROPY=y +CONFIG_CRYPTO_USER_API=m +# CONFIG_CRYPTO_USER_API_HASH is not set +# CONFIG_CRYPTO_USER_API_SKCIPHER is not set +# CONFIG_CRYPTO_USER_API_RNG is not set +CONFIG_CRYPTO_USER_API_AEAD=m +CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y +CONFIG_CRYPTO_HASH_INFO=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_AES=m +CONFIG_CRYPTO_LIB_ARC4=m +# CONFIG_CRYPTO_LIB_BLAKE2S is not set +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_DES=m +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_HW is not set +CONFIG_ASYMMETRIC_KEY_TYPE=y +CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y +CONFIG_X509_CERTIFICATE_PARSER=y +# CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set +CONFIG_PKCS7_MESSAGE_PARSER=y +# CONFIG_PKCS7_TEST_KEY is not set +# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set +# CONFIG_PGP_LIBRARY is not set +# CONFIG_PGP_KEY_PARSER is not set +# CONFIG_PGP_PRELOAD is not set + +# +# Certificates for signature checking +# +CONFIG_MODULE_SIG_KEY="" +CONFIG_SYSTEM_TRUSTED_KEYRING=y +CONFIG_SYSTEM_TRUSTED_KEYS="" +CONFIG_SYSTEM_EXTRA_CERTIFICATE=y +CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=4096 +# CONFIG_SECONDARY_TRUSTED_KEYRING is not set +# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set +# CONFIG_PGP_PRELOAD_PUBLIC_KEYS is not set +# end of Certificates for signature checking + +CONFIG_BINARY_PRINTF=y + +# +# Library routines +# +# CONFIG_PACKING is not set +CONFIG_BITREVERSE=y +CONFIG_HAVE_ARCH_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_NET_UTILS=y +# CONFIG_CORDIC is not set +# CONFIG_PRIME_NUMBERS is not set +CONFIG_RATIONAL=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y +CONFIG_ARCH_HAS_FAST_MULTIPLIER=y +CONFIG_ARCH_USE_SYM_ANNOTATIONS=y +# CONFIG_INDIRECT_PIO is not set +CONFIG_CRC_CCITT=m +CONFIG_CRC16=y +# CONFIG_CRC_T10DIF is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set +# CONFIG_CRC64 is not set +# CONFIG_CRC4 is not set +# CONFIG_CRC7 is not set +CONFIG_LIBCRC32C=m +# CONFIG_CRC8 is not set +CONFIG_XXHASH=y +CONFIG_AUDIT_GENERIC=y +CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y +CONFIG_AUDIT_COMPAT_GENERIC=y +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m +CONFIG_LZO_COMPRESS=m +CONFIG_LZO_DECOMPRESS=m +CONFIG_XZ_DEC=y +# CONFIG_XZ_DEC_X86 is not set +# CONFIG_XZ_DEC_POWERPC is not set +# CONFIG_XZ_DEC_IA64 is not set +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +# CONFIG_XZ_DEC_SPARC is not set +CONFIG_XZ_DEC_BCJ=y +# CONFIG_XZ_DEC_TEST is not set +CONFIG_DECOMPRESS_GZIP=y +CONFIG_DECOMPRESS_LZMA=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAS_DMA=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_DMA_DECLARE_COHERENT=y +CONFIG_ARCH_HAS_SETUP_DMA_OPS=y +CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y +CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y +CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y +CONFIG_SWIOTLB=y +CONFIG_DMA_NONCOHERENT_MMAP=y +CONFIG_DMA_COHERENT_POOL=y +CONFIG_DMA_REMAP=y +CONFIG_DMA_DIRECT_REMAP=y +# CONFIG_DMA_API_DEBUG is not set +CONFIG_SGL_ALLOC=y +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_GLOB=y +# CONFIG_GLOB_SELFTEST is not set +CONFIG_NLATTR=y +CONFIG_CLZ_TAB=y +# CONFIG_IRQ_POLL is not set +CONFIG_MPILIB=y +CONFIG_LIBFDT=y +CONFIG_OID_REGISTRY=y +CONFIG_UCS2_STRING=y +CONFIG_HAVE_GENERIC_VDSO=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_VDSO_TIME_NS=y +CONFIG_FONT_SUPPORT=y +CONFIG_FONT_8x16=y +CONFIG_FONT_AUTOSELECT=y +CONFIG_SG_POOL=y +CONFIG_ARCH_HAS_PMEM_API=y +CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y +CONFIG_ARCH_STACKWALK=y +CONFIG_SBITMAP=y +# CONFIG_STRING_SELFTEST is not set +# end of Library routines + +# +# Kernel hacking +# + +# +# printk and dmesg options +# +CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 +CONFIG_CONSOLE_LOGLEVEL_QUIET=4 +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_DYNAMIC_DEBUG is not set +# CONFIG_DYNAMIC_DEBUG_CORE is not set +# CONFIG_SYMBOLIC_ERRNAME is not set +CONFIG_DEBUG_BUGVERBOSE=y +# end of printk and dmesg options + +# +# Compile-time checks and compiler options +# +CONFIG_DEBUG_INFO=y +# CONFIG_DEBUG_INFO_REDUCED is not set +# CONFIG_DEBUG_INFO_COMPRESSED is not set +# CONFIG_DEBUG_INFO_SPLIT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_BTF is not set +# CONFIG_GDB_SCRIPTS is not set +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=2048 +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_READABLE_ASM is not set +# CONFIG_HEADERS_INSTALL is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_SECTION_MISMATCH_WARN_ONLY=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set +CONFIG_ARCH_WANT_FRAME_POINTERS=y +CONFIG_FRAME_POINTER=y +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +# end of Compile-time checks and compiler options + +# +# Generic Kernel Debugging Instruments +# +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 +# CONFIG_MAGIC_SYSRQ_SERIAL is not set +CONFIG_DEBUG_FS=y +CONFIG_DEBUG_FS_ALLOW_ALL=y +# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set +# CONFIG_DEBUG_FS_ALLOW_NONE is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y +# CONFIG_UBSAN is not set +# end of Generic Kernel Debugging Instruments + +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + +# +# Memory Debugging +# +# CONFIG_PAGE_EXTENSION is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_POISONING is not set +# CONFIG_DEBUG_PAGE_REF is not set +# CONFIG_DEBUG_RODATA_TEST is not set +CONFIG_ARCH_HAS_DEBUG_WX=y +# CONFIG_DEBUG_WX is not set +CONFIG_GENERIC_PTDUMP=y +# CONFIG_PTDUMP_DEBUGFS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SLUB_STATS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +CONFIG_DEBUG_KMEMLEAK=y +CONFIG_DEBUG_KMEMLEAK_MEM_POOL_SIZE=2000 +# CONFIG_DEBUG_KMEMLEAK_TEST is not set +CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y +# CONFIG_DEBUG_KMEMLEAK_AUTO_SCAN is not set +CONFIG_DEBUG_STACK_USAGE=y +CONFIG_SCHED_STACK_END_CHECK=y +CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_VM_PGTABLE is not set +CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y +# CONFIG_DEBUG_VIRTUAL is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_HAVE_ARCH_KASAN=y +CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y +CONFIG_CC_HAS_KASAN_GENERIC=y +# end of Memory Debugging + +# CONFIG_DEBUG_SHIRQ is not set + +# +# Debug Oops, Lockups and Hangs +# +CONFIG_PANIC_ON_OOPS=y +CONFIG_PANIC_ON_OOPS_VALUE=1 +CONFIG_PANIC_TIMEOUT=0 +CONFIG_LOCKUP_DETECTOR=y +CONFIG_SOFTLOCKUP_DETECTOR=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 + +# +# ARM64 NMI watchdog configuration +# +# end of ARM64 NMI watchdog configuration + +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 +CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y +CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=1 +# CONFIG_WQ_WATCHDOG is not set +# CONFIG_TEST_LOCKUP is not set +# end of Debug Oops, Lockups and Hangs + +# +# Scheduler Debugging +# +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHED_INFO=y +# CONFIG_SCHEDSTATS is not set +# end of Scheduler Debugging + +# CONFIG_DEBUG_TIMEKEEPING is not set +# CONFIG_DEBUG_PREEMPT is not set + +# +# Lock Debugging (spinlocks, mutexes, etc...) +# +CONFIG_LOCK_DEBUGGING_SUPPORT=y +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +CONFIG_DEBUG_ATOMIC_SLEEP=y +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_LOCK_TORTURE_TEST is not set +# CONFIG_WW_MUTEX_SELFTEST is not set +# CONFIG_SCF_TORTURE_TEST is not set +# CONFIG_CSD_LOCK_WAIT_DEBUG is not set +# end of Lock Debugging (spinlocks, mutexes, etc...) + +CONFIG_STACKTRACE=y +# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_HAVE_DEBUG_BUGVERBOSE=y + +# +# Debug kernel data structures +# +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_PLIST is not set +CONFIG_DEBUG_SG=y +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# end of Debug kernel data structures + +# CONFIG_DEBUG_CREDENTIALS is not set + +# +# RCU Debugging +# +# CONFIG_RCU_SCALE_TEST is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_REF_SCALE_TEST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=65 +# CONFIG_RCU_TRACE is not set +# CONFIG_RCU_EQS_DEBUG is not set +# CONFIG_RCU_STRICT_GRACE_PERIOD is not set +# end of RCU Debugging + +# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set +# CONFIG_LATENCYTOP is not set +CONFIG_NOP_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_TRACER_MAX_TRACE=y +CONFIG_TRACE_CLOCK=y +CONFIG_RING_BUFFER=y +CONFIG_EVENT_TRACING=y +CONFIG_CONTEXT_SWITCH_TRACER=y +CONFIG_TRACING=y +CONFIG_GENERIC_TRACER=y +CONFIG_TRACING_SUPPORT=y +CONFIG_FTRACE=y +# CONFIG_BOOTTIME_TRACING is not set +CONFIG_FUNCTION_TRACER=y +# CONFIG_FUNCTION_GRAPH_TRACER is not set +CONFIG_DYNAMIC_FTRACE=y +# CONFIG_FUNCTION_PROFILER is not set +# CONFIG_STACK_TRACER is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_PREEMPT_TRACER is not set +CONFIG_SCHED_TRACER=y +# CONFIG_HWLAT_TRACER is not set +# CONFIG_FTRACE_SYSCALLS is not set +CONFIG_TRACER_SNAPSHOT=y +# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set +CONFIG_BRANCH_PROFILE_NONE=y +# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set +# CONFIG_PROFILE_ALL_BRANCHES is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +CONFIG_KPROBE_EVENTS=y +# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set +CONFIG_DYNAMIC_EVENTS=y +CONFIG_PROBE_EVENTS=y +CONFIG_FTRACE_MCOUNT_RECORD=y +# CONFIG_SYNTH_EVENTS is not set +# CONFIG_HIST_TRIGGERS is not set +# CONFIG_TRACE_EVENT_INJECT is not set +# CONFIG_TRACEPOINT_BENCHMARK is not set +# CONFIG_RING_BUFFER_BENCHMARK is not set +# CONFIG_TRACE_EVAL_MAP_FILE is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_STARTUP_TEST is not set +# CONFIG_PREEMPTIRQ_DELAY_TEST is not set +# CONFIG_KPROBE_EVENT_GEN_TEST is not set +# CONFIG_SAMPLES is not set +CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y +CONFIG_STRICT_DEVMEM=y +CONFIG_IO_STRICT_DEVMEM=y + +# +# arm64 Debugging +# +# CONFIG_PID_IN_CONTEXTIDR is not set +# CONFIG_DEBUG_EFI is not set +# CONFIG_ARM64_RELOC_TEST is not set +# CONFIG_CORESIGHT is not set +# end of arm64 Debugging + +# +# Kernel Testing and Coverage +# +# CONFIG_KUNIT is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +CONFIG_FUNCTION_ERROR_INJECTION=y +# CONFIG_FAULT_INJECTION is not set +CONFIG_ARCH_HAS_KCOV=y +CONFIG_CC_HAS_SANCOV_TRACE_PC=y +# CONFIG_KCOV is not set +# CONFIG_RUNTIME_TESTING_MENU is not set +# CONFIG_MEMTEST is not set +# end of Kernel Testing and Coverage +# end of Kernel hacking diff --git a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb new file mode 100644 index 00000000000..f22b3571eca --- /dev/null +++ b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb @@ -0,0 +1,209 @@ +SUMMARY = "Dummy Linux kernel" +DESCRIPTION = "Dummy Linux kernel, to be selected as the preferred \ +provider for virtual/kernel to satisfy dependencies for situations \ +where you wish to build the kernel externally from the build system." +SECTION = "kernel" + +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +PROVIDES += "virtual/kernel" + +#inherit deploy linux-dummy +inherit kernel-arch +inherit kernel-version kernel-module-split +export EXTRA_CFLAGS = "${CFLAGS}" +export EXTRA_LDFLAGS = "${LDFLAGS}" + +EXTRA_OEMAKE = "CC='${CC}' LD='${CCLD}' V=1 ARCH=${ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y HOSTCC='${BUILD_CC}' HOSTCPP='${BUILD_CPP}'" +EXTRA_OEMAKE = "CC='${CC}' V=1 ARCH=${ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y HOSTCC='${BUILD_CC}' HOSTCPP='${BUILD_CPP}'" + +PACKAGES_DYNAMIC += "^kernel-module-.*" +PACKAGES_DYNAMIC += "^kernel-image-.*" +PACKAGES_DYNAMIC += "^kernel-firmware-.*" + +KERNEL_CLASSES ?= " kernel-uimage " +inherit ${KERNEL_CLASSES} + +KERNEL_VERSION = "${@get_kernelversion_headers('${B}')}" +KERNEL_IMAGETYPE_FOR_MAKE = "Image" +KERNEL_PACKAGE_NAME ??= "kernel" +KERNEL_IMAGETYPE ?= "Image" +# kernel-base becomes kernel-${KERNEL_VERSION} +# kernel-image becomes kernel-image-${KERNEL_VERSION} +PACKAGES = "${PN} ${KERNEL_PACKAGE_NAME} ${KERNEL_PACKAGE_NAME}-base ${KERNEL_PACKAGE_NAME}-vmlinux ${KERNEL_PACKAGE_NAME}-image ${KERNEL_PACKAGE_NAME}-dev ${KERNEL_PACKAGE_NAME}-modules" +FILES:${PN} = "" +FILES:${KERNEL_PACKAGE_NAME}-base = "${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.order ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.builtin ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.builtin.modinfo" +FILES:${KERNEL_PACKAGE_NAME}-image = "/boot/Image-${KERNEL_VERSION} /boot/vmlinux-${KERNEL_VERSION}" +FILES:${KERNEL_PACKAGE_NAME}-dev = "/boot/System.map* /boot/Module.symvers* /boot/config* ${KERNEL_SRC_PATH} ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/build" +FILES:${KERNEL_PACKAGE_NAME}-vmlinux = "/boot/vmlinux-${KERNEL_VERSION_NAME}" +FILES:${KERNEL_PACKAGE_NAME}-modules = "" +RDEPENDS:${KERNEL_PACKAGE_NAME} = "${KERNEL_PACKAGE_NAME}-base (= ${EXTENDPKGV})" +# Allow machines to override this dependency if kernel image files are +# not wanted in images as standard +RDEPENDS:${KERNEL_PACKAGE_NAME}-base ?= "${KERNEL_PACKAGE_NAME}-image (= ${EXTENDPKGV})" +PKG:${KERNEL_PACKAGE_NAME}-image = "${KERNEL_PACKAGE_NAME}-image-${@legitimize_package_name(d.getVar('KERNEL_VERSION'))}" +RDEPENDS:${KERNEL_PACKAGE_NAME}-image += "${@oe.utils.conditional('KERNEL_IMAGETYPE', 'vmlinux', '${KERNEL_PACKAGE_NAME}-vmlinux (= ${EXTENDPKGV})', '', d)}" +PKG:${KERNEL_PACKAGE_NAME}-base = "${KERNEL_PACKAGE_NAME}-${@legitimize_package_name(d.getVar('KERNEL_VERSION'))}" +RPROVIDES:${KERNEL_PACKAGE_NAME}-base += "${KERNEL_PACKAGE_NAME}-${KERNEL_VERSION}" +ALLOW_EMPTY:${KERNEL_PACKAGE_NAME} = "1" +ALLOW_EMPTY:${KERNEL_PACKAGE_NAME}-base = "1" +ALLOW_EMPTY:${KERNEL_PACKAGE_NAME}-image = "1" +ALLOW_EMPTY:${KERNEL_PACKAGE_NAME}-modules = "1" +DESCRIPTION:${KERNEL_PACKAGE_NAME}-modules = "Kernel modules meta package" + +#PACKAGESPLITFUNCS:prepend = "split_kernel_packages " +inherit kernel-artifact-names +inherit kernel-devicetree +#INHIBIT_DEFAULT_DEPS = "1" + +COMPATIBLE_HOST = ".*-linux" + +PR = "r1" + +SRC_URI = "file://kernel-5.10 \ + file://kernel-defconfig \ + " +S = "${WORKDIR}/kernel-5.10" +B = "${WORKDIR}/build" + +KERNEL_CONFIG_COMMAND ?= "oe_runmake_call -C ${S} CC="${KERNEL_CC}" LD="${KERNEL_LD}" O=${B} olddefconfig || oe_runmake -C ${S} O=${B} CC="${KERNEL_CC}" LD="${KERNEL_LD}" oldnoconfig" +KCONFIG_CONFIG_COMMAND:append = " LD='${KERNEL_LD}' HOSTLDFLAGS='${BUILD_LDFLAGS}'" + +KERNEL_RELEASE ?= "${KERNEL_VERSION}" +# The directory where built kernel lies in the kernel tree +KERNEL_OUTPUT_DIR ?= "arch/${ARCH}/boot" +KERNEL_IMAGEDEST ?= "boot" + +python do_symlink_kernsrc () { + s = d.getVar("S") + if s[-1] == '/': + # drop trailing slash, so that os.symlink(kernsrc, s) doesn't use s as directory name and fail + s=s[:-1] + kernsrc = d.getVar("STAGING_KERNEL_DIR") + if s != kernsrc: + bb.utils.mkdirhier(kernsrc) + bb.utils.remove(kernsrc, recurse=True) + if d.getVar("EXTERNALSRC"): + # With EXTERNALSRC S will not be wiped so we can symlink to it + os.symlink(s, kernsrc) + else: + import shutil + shutil.move(s, kernsrc) + os.symlink(kernsrc, s) +} +addtask symlink_kernsrc before do_patch do_configure after do_unpack + +do_configure() { + cp ../kernel-defconfig .config + set -e + unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS + oe_runmake -C ${S} ARCH=arm64 mrproper + ${KERNEL_CONFIG_COMMAND} + #yes '' | oe_runmake oldconfig + oe_runmake -C ${B} savedefconfig +} + +get_cc_option () { + # Check if KERNEL_CC supports the option "file-prefix-map". + # This option allows us to build images with __FILE__ values that do not + # contain the host build path. + if ${KERNEL_CC} -Q --help=joined | grep -q "\-ffile-prefix-map="; then + echo "-ffile-prefix-map=${S}=/kernel-source/" + fi +} + +do_compile () { + cc_extra=$(get_cc_option) + oe_runmake CC="${KERNEL_CC} $cc_extra " LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} +} + +do_compile_kernelmodules() { + : +} + +do_shared_workdir () { + : +} + +do_install() { + # + # First install the modules + # + unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE + if (grep -q -i -e '^CONFIG_MODULES=y$' .config); then + oe_runmake DEPMOD=echo MODLIB=${D}${nonarch_base_libdir}/modules/${KERNEL_VERSION} INSTALL_FW_PATH=${D}${nonarch_base_libdir}/firmware modules_install + rm "${D}${nonarch_base_libdir}/modules/${KERNEL_VERSION}/build" + rm "${D}${nonarch_base_libdir}/modules/${KERNEL_VERSION}/source" + # If the kernel/ directory is empty remove it to prevent QA issues + rmdir --ignore-fail-on-non-empty "${D}${nonarch_base_libdir}/modules/${KERNEL_VERSION}/kernel" + else + bbnote "no modules to install" + fi + + # + # Install various kernel output (zImage, map file, config, module support files) + # + install -d ${D}/${KERNEL_IMAGEDEST} + install -d ${D}/boot + + for imageType in ${KERNEL_IMAGETYPES} ; do + if [ $imageType != "fitImage" ] || [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ] ; then + install -m 0644 ${KERNEL_OUTPUT_DIR}/$imageType ${D}/${KERNEL_IMAGEDEST}/$imageType-${KERNEL_VERSION} + fi + done + + install -m 0644 System.map ${D}/boot/System.map-${KERNEL_VERSION} + install -m 0644 .config ${D}/boot/config-${KERNEL_VERSION} + install -m 0644 vmlinux ${D}/boot/vmlinux-${KERNEL_VERSION} + [ -e Module.symvers ] && install -m 0644 Module.symvers ${D}/boot/Module.symvers-${KERNEL_VERSION} + install -d ${D}${sysconfdir}/modules-load.d + install -d ${D}${sysconfdir}/modprobe.d +} + +do_bundle_initramfs() { + return 0 + if [ ! -z "${INITRAMFS_IMAGE}" -a x"${INITRAMFS_IMAGE_BUNDLE}" = x1 ]; then + echo "Creating a kernel image with a bundled initramfs..." + copy_initramfs + # Backing up kernel image relies on its type(regular file or symbolic link) + tmp_path="" + for imageType in ${KERNEL_IMAGETYPE_FOR_MAKE} ; do + if [ -h ${KERNEL_OUTPUT_DIR}/$imageType ] ; then + linkpath=`readlink -n ${KERNEL_OUTPUT_DIR}/$imageType` + realpath=`readlink -fn ${KERNEL_OUTPUT_DIR}/$imageType` + mv -f $realpath $realpath.bak + tmp_path=$tmp_path" "$imageType"#"$linkpath"#"$realpath + elif [ -f ${KERNEL_OUTPUT_DIR}/$imageType ]; then + mv -f ${KERNEL_OUTPUT_DIR}/$imageType ${KERNEL_OUTPUT_DIR}/$imageType.bak + tmp_path=$tmp_path" "$imageType"##" + fi + done + use_alternate_initrd=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio + kernel_do_compile + # Restoring kernel image + for tp in $tmp_path ; do + imageType=`echo $tp|cut -d "#" -f 1` + linkpath=`echo $tp|cut -d "#" -f 2` + realpath=`echo $tp|cut -d "#" -f 3` + if [ -n "$realpath" ]; then + mv -f $realpath $realpath.initramfs + mv -f $realpath.bak $realpath + ln -sf $linkpath.initramfs ${B}/${KERNEL_OUTPUT_DIR}/$imageType.initramfs + else + mv -f ${KERNEL_OUTPUT_DIR}/$imageType ${KERNEL_OUTPUT_DIR}/$imageType.initramfs + mv -f ${KERNEL_OUTPUT_DIR}/$imageType.bak ${KERNEL_OUTPUT_DIR}/$imageType + fi + done + fi +} +do_bundle_initramfs[dirs] = "${B}" + +do_deploy() { + : +} + +addtask bundle_initramfs after do_install before do_deploy +addtask deploy after do_install +addtask shared_workdir after do_compile before do_install +addtask compile_kernelmodules -- Gitee From d2cfeda27e1ad0ff2b212321a56882f0cb5fd863 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Tue, 14 Sep 2021 19:14:45 +0800 Subject: [PATCH 005/304] add recipe for busybox add recipe for busybox Signed-off-by: Wayne Ren --- .../recipes-core/busybox/busybox_1.33.1.bb | 170 +++ .../recipes-core/busybox/files/rtos-defconfig | 1197 +++++++++++++++++ 2 files changed, 1367 insertions(+) create mode 100644 meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb create mode 100644 meta-openeuler/recipes-core/busybox/files/rtos-defconfig diff --git a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb new file mode 100644 index 00000000000..aa9ea775578 --- /dev/null +++ b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb @@ -0,0 +1,170 @@ +SUMMARY = "Dummy Linux kernel" +DESCRIPTION = "Dummy Linux kernel, to be selected as the preferred \ +provider for virtual/kernel to satisfy dependencies for situations \ +where you wish to build the kernel externally from the build system." +SECTION = "kernel" + +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +INHIBIT_DEFAULT_DEPS = "1" +PR = "r1" + +DEPENDS += "virtual/libc" +#get arch info +inherit kernel-arch + +SRC_URI = "file://busybox/busybox-1.33.1.tar.bz2 \ + file://rtos-defconfig \ +" +FILESPATH:prepend += "${LOCAL_FILES}/${BPN}:" +S = "${WORKDIR}/${BPN}-${PV}" + +#not split debug files with dwarfsrcfiles,no dwarfsrcfiles +INHIBIT_PACKAGE_DEBUG_SPLIT = "1" + +# Whether to split the suid apps into a seperate binary +BUSYBOX_SPLIT_SUID ?= "1" + +export EXTRA_CFLAGS = "${CFLAGS}" +export EXTRA_LDFLAGS = "${LDFLAGS}" + +EXTRA_OEMAKE = "CC='${CC}' LD='${CCLD}' V=1 ARCH=${TARGET_ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y HOSTCC='${BUILD_CC}' HOSTCPP='${BUILD_CPP}'" +EXTRA_OEMAKE = "CC='${CC}' V=1 ARCH=${ARCH} LD=${LD} CROSS_COMPILE=${TARGET_PREFIX}" +EXTRA_OEMAKE = "CC='${CC}' LD='${CCLD}' V=1 ARCH=${ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y HOSTCC='${BUILD_CC}' HOSTCPP='${BUILD_CPP}'" +#use host pkg-config add by openeuler +EXTRA_OECONF += "PKG_CONFIG=pkg-config" +EXTRA_OEMAKE += "PKG_CONFIG=pkg-config" + +PACKAGES =+ "${PN}-httpd ${PN}-udhcpd ${PN}-udhcpc ${PN}-syslog ${PN}-mdev ${PN}-hwclock" + +FILES:${PN}-httpd = "${sysconfdir}/init.d/busybox-httpd /srv/www" +FILES:${PN}-syslog = "${sysconfdir}/init.d/syslog* ${sysconfdir}/syslog-startup.conf* ${sysconfdir}/syslog.conf* ${systemd_unitdir}/system/syslog.service ${sysconfdir}/default/busybox-syslog" +FILES:${PN}-mdev = "${sysconfdir}/init.d/mdev ${sysconfdir}/mdev.conf ${sysconfdir}/mdev/*" +FILES:${PN}-udhcpd = "${sysconfdir}/init.d/busybox-udhcpd" +FILES:${PN}-udhcpc = "${sysconfdir}/udhcpc.d ${datadir}/udhcpc" +FILES:${PN}-hwclock = "${sysconfdir}/init.d/hwclock.sh" + +INITSCRIPT_PACKAGES = "${PN}-httpd ${PN}-syslog ${PN}-udhcpd ${PN}-mdev ${PN}-hwclock" + +INITSCRIPT_NAME:${PN}-httpd = "busybox-httpd" +INITSCRIPT_NAME:${PN}-hwclock = "hwclock.sh" +INITSCRIPT_NAME:${PN}-mdev = "mdev" +INITSCRIPT_PARAMS:${PN}-mdev = "start 04 S ." +INITSCRIPT_NAME:${PN}-syslog = "syslog" +INITSCRIPT_NAME:${PN}-udhcpd = "busybox-udhcpd" + +SYSTEMD_PACKAGES = "${PN}-syslog" +SYSTEMD_SERVICE:${PN}-syslog = "${@bb.utils.contains('SRC_URI', 'file://syslog.cfg', 'busybox-syslog.service', '', d)}" + +RDEPENDS:${PN}-syslog = "busybox" +CONFFILES:${PN}-syslog = "${sysconfdir}/syslog-startup.conf" +RCONFLICTS:${PN}-syslog = "rsyslog sysklogd syslog-ng" + +CONFFILES:${PN}-mdev = "${sysconfdir}/mdev.conf" + +RRECOMMENDS:${PN} = "${PN}-udhcpc" + +RDEPENDS:${PN} = "${@["", "busybox-inittab"][(d.getVar('VIRTUAL-RUNTIME_init_manager') == 'busybox')]}" + +do_configure() { + cp ../rtos-defconfig .config + set -e + unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS + yes '' | oe_runmake oldconfig +} + +do_compile () { + unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS + export KCONFIG_NOTIMESTAMP=1 + if [ -e .config.orig ]; then + # Need to guard again an interrupted do_compile - restore any backup + cp .config.orig .config + fi + cp .config .config.orig + + for s in suid nosuid; do + oe_runmake busybox_unstripped + mv busybox_unstripped busybox.$s + oe_runmake busybox.links + sort busybox.links > busybox.links.$s + rm busybox.links + done + cp .config.orig .config +} + +do_install () { + sed -i "s:^/bin/:BASE_BINDIR/:" busybox.links* + sed -i "s:^/sbin/:BASE_SBINDIR/:" busybox.links* + sed -i "s:^/usr/bin/:BINDIR/:" busybox.links* + sed -i "s:^/usr/sbin/:SBINDIR/:" busybox.links* + + # Move arch/link to BINDIR to match coreutils + sed -i "s:^BASE_BINDIR/arch:BINDIR/arch:" busybox.links* + sed -i "s:^BASE_BINDIR/link:BINDIR/link:" busybox.links* + + sed -i "s:^BASE_BINDIR/:${base_bindir}/:" busybox.links* + sed -i "s:^BASE_SBINDIR/:${base_sbindir}/:" busybox.links* + sed -i "s:^BINDIR/:${bindir}/:" busybox.links* + sed -i "s:^SBINDIR/:${sbindir}/:" busybox.links* + + install -d ${D}${sysconfdir}/init.d + + if ! grep -q "CONFIG_FEATURE_INDIVIDUAL=y" ${B}/.config; then + # Install ${base_bindir}/busybox, and the ${base_bindir}/sh link so the postinst script + # can run. Let update-alternatives handle the rest. + install -d ${D}${base_bindir} + if [ "${BUSYBOX_SPLIT_SUID}" = "1" ]; then + install -m 4755 ${B}/busybox.suid ${D}${base_bindir} + install -m 0755 ${B}/busybox.nosuid ${D}${base_bindir} + install -m 0644 ${S}/busybox.links.suid ${D}${sysconfdir} + install -m 0644 ${S}/busybox.links.nosuid ${D}${sysconfdir} + if grep -q "CONFIG_SH_IS_ASH=y" ${B}/.config; then + ln -sf busybox.nosuid ${D}${base_bindir}/sh + fi + # Keep a default busybox for people who want to invoke busybox directly. + # This is also useful for the on device upgrade. Because we want + # to use the busybox command in postinst. + ln -sf busybox.nosuid ${D}${base_bindir}/busybox + else + if grep -q "CONFIG_FEATURE_SUID=y" ${B}/.config; then + install -m 4755 ${B}/busybox ${D}${base_bindir} + else + install -m 0755 ${B}/busybox ${D}${base_bindir} + fi + install -m 0644 ${S}/busybox.links ${D}${sysconfdir} + if grep -q "CONFIG_SH_IS_ASH=y" ${B}/.config; then + ln -sf busybox ${D}${base_bindir}/sh + fi + # We make this symlink here to eliminate the error when upgrading together + # with busybox-syslog. Without this symlink, the opkg may think of the + # busybox.nosuid as obsolete and remove it, resulting in dead links like + # ${base_bindir}/sed -> ${base_bindir}/busybox.nosuid. This will make upgrading busybox-syslog fail. + # This symlink will be safely deleted in postinst, thus no negative effect. + ln -sf busybox ${D}${base_bindir}/busybox.nosuid + fi + else + install -d ${D}${base_bindir} ${D}${bindir} ${D}${libdir} + cat busybox.links | while read FILE; do + NAME=`basename "$FILE"` + install -m 0755 "0_lib/$NAME" "${D}$FILE.${BPN}" + done + # add suid bit where needed + for i in `grep -E "APPLET.*BB_SUID_((MAYBE|REQUIRE))" include/applets.h | grep -v _BB_SUID_DROP | cut -f 3 -d '(' | cut -f 1 -d ','`; do + find ${D} -name $i.${BPN} -exec chmod a+s {} \; + done + install -m 0755 0_lib/libbusybox.so.${PV} ${D}${libdir}/libbusybox.so.${PV} + ln -sf sh.${BPN} ${D}${base_bindir}/sh + ln -sf ln.${BPN} ${D}${base_bindir}/ln + ln -sf test.${BPN} ${D}${bindir}/test + if [ -f ${D}/linuxrc.${BPN} ]; then + mv ${D}/linuxrc.${BPN} ${D}/linuxrc + fi + install -m 0644 ${S}/busybox.links ${D}${sysconfdir} + fi + + # Remove the sysvinit specific configuration file for systemd systems to avoid confusion + if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'false', 'true', d)}; then + rm -f ${D}${sysconfdir}/syslog-startup.conf + fi +} diff --git a/meta-openeuler/recipes-core/busybox/files/rtos-defconfig b/meta-openeuler/recipes-core/busybox/files/rtos-defconfig new file mode 100644 index 00000000000..104cf9ae8f7 --- /dev/null +++ b/meta-openeuler/recipes-core/busybox/files/rtos-defconfig @@ -0,0 +1,1197 @@ +# +# Automatically generated make config: don't edit +# Busybox version: 1.32.1 +# Thu May 20 10:03:03 2021 +# +CONFIG_HAVE_DOT_CONFIG=y + +# +# Settings +# +# CONFIG_DESKTOP is not set +CONFIG_EXTRA_COMPAT=y +# CONFIG_FEDORA_COMPAT is not set +CONFIG_INCLUDE_SUSv2=y +CONFIG_LONG_OPTS=y +CONFIG_SHOW_USAGE=y +CONFIG_FEATURE_VERBOSE_USAGE=y +CONFIG_FEATURE_COMPRESS_USAGE=y +CONFIG_LFS=y +# CONFIG_PAM is not set +CONFIG_FEATURE_DEVPTS=y +CONFIG_FEATURE_UTMP=y +CONFIG_FEATURE_WTMP=y +# CONFIG_FEATURE_PIDFILE is not set +CONFIG_PID_FILE_PATH="" +CONFIG_BUSYBOX=y +# CONFIG_FEATURE_SHOW_SCRIPT is not set +CONFIG_FEATURE_INSTALLER=y +# CONFIG_INSTALL_NO_USR is not set +CONFIG_FEATURE_SUID=y +# CONFIG_FEATURE_SUID_CONFIG is not set +# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set +# CONFIG_FEATURE_PREFER_APPLETS is not set +CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" +# CONFIG_SELINUX is not set +# CONFIG_FEATURE_CLEAN_UP is not set +# CONFIG_FEATURE_SYSLOG_INFO is not set +CONFIG_FEATURE_SYSLOG=y +CONFIG_PLATFORM_LINUX=y + +# +# Build Options +# +# CONFIG_STATIC is not set +# CONFIG_PIE is not set +# CONFIG_NOMMU is not set +# CONFIG_BUILD_LIBBUSYBOX is not set +# CONFIG_FEATURE_LIBBUSYBOX_STATIC is not set +# CONFIG_FEATURE_INDIVIDUAL is not set +# CONFIG_FEATURE_SHARED_BUSYBOX is not set +CONFIG_CROSS_COMPILER_PREFIX="" +CONFIG_SYSROOT="" +CONFIG_EXTRA_CFLAGS="" +CONFIG_EXTRA_LDFLAGS="" +CONFIG_EXTRA_LDLIBS="" +CONFIG_USE_PORTABLE_CODE=y +CONFIG_STACK_OPTIMIZATION_386=y + +# +# Installation Options ("make install" behavior) +# +CONFIG_INSTALL_APPLET_SYMLINKS=y +# CONFIG_INSTALL_APPLET_HARDLINKS is not set +# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set +# CONFIG_INSTALL_APPLET_DONT is not set +# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set +# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set +# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set +CONFIG_PREFIX="./_install" + +# +# Debugging Options +# +# CONFIG_DEBUG is not set +# CONFIG_DEBUG_PESSIMIZE is not set +# CONFIG_DEBUG_SANITIZE is not set +# CONFIG_UNIT_TEST is not set +# CONFIG_WERROR is not set +# CONFIG_WARN_SIMPLE_MSG is not set +CONFIG_NO_DEBUG_LIB=y +# CONFIG_DMALLOC is not set +# CONFIG_EFENCE is not set + +# +# Library Tuning +# +CONFIG_FEATURE_RTOS_APPLET_BLACKLIST=y +# CONFIG_FEATURE_USE_BSS_TAIL is not set +CONFIG_FLOAT_DURATION=y +# CONFIG_FEATURE_RTMINMAX is not set +# CONFIG_FEATURE_RTMINMAX_USE_LIBC_DEFINITIONS is not set +CONFIG_FEATURE_BUFFERS_USE_MALLOC=y +# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set +# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set +CONFIG_PASSWORD_MINLEN=6 +CONFIG_MD5_SMALL=1 +CONFIG_SHA3_SMALL=1 +CONFIG_FEATURE_FAST_TOP=y +CONFIG_FEATURE_ETC_NETWORKS=y +# CONFIG_FEATURE_ETC_SERVICES is not set +CONFIG_FEATURE_EDITING=y +CONFIG_FEATURE_EDITING_MAX_LEN=1024 +CONFIG_FEATURE_EDITING_VI=y +CONFIG_FEATURE_EDITING_HISTORY=255 +CONFIG_FEATURE_EDITING_SAVEHISTORY=y +# CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set +# CONFIG_FEATURE_REVERSE_SEARCH is not set +CONFIG_FEATURE_TAB_COMPLETION=y +# CONFIG_FEATURE_USERNAME_COMPLETION is not set +CONFIG_FEATURE_EDITING_FANCY_PROMPT=y +CONFIG_FEATURE_EDITING_WINCH=y +# CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set +# CONFIG_LOCALE_SUPPORT is not set +# CONFIG_UNICODE_SUPPORT is not set +# CONFIG_UNICODE_USING_LOCALE is not set +# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set +CONFIG_SUBST_WCHAR=0 +CONFIG_LAST_SUPPORTED_WCHAR=0 +# CONFIG_UNICODE_COMBINING_WCHARS is not set +# CONFIG_UNICODE_WIDE_WCHARS is not set +# CONFIG_UNICODE_BIDI_SUPPORT is not set +# CONFIG_UNICODE_NEUTRAL_TABLE is not set +# CONFIG_UNICODE_PRESERVE_BROKEN is not set +CONFIG_FEATURE_NON_POSIX_CP=y +# CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set +# CONFIG_FEATURE_USE_SENDFILE is not set +CONFIG_FEATURE_COPYBUF_KB=4 +CONFIG_FEATURE_SKIP_ROOTFS=y +# CONFIG_MONOTONIC_SYSCALL is not set +CONFIG_IOCTL_HEX2STR_ERROR=y +# CONFIG_FEATURE_HWIB is not set + +# +# Applets +# + +# +# Archival Utilities +# +# CONFIG_FEATURE_SEAMLESS_XZ is not set +# CONFIG_FEATURE_SEAMLESS_LZMA is not set +CONFIG_FEATURE_SEAMLESS_BZ2=y +CONFIG_FEATURE_SEAMLESS_GZ=y +# CONFIG_FEATURE_SEAMLESS_Z is not set +# CONFIG_AR is not set +# CONFIG_FEATURE_AR_LONG_FILENAMES is not set +# CONFIG_FEATURE_AR_CREATE is not set +# CONFIG_UNCOMPRESS is not set +CONFIG_GUNZIP=y +CONFIG_ZCAT=y +CONFIG_FEATURE_GUNZIP_LONG_OPTIONS=y +# CONFIG_BUNZIP2 is not set +# CONFIG_BZCAT is not set +# CONFIG_UNLZMA is not set +# CONFIG_LZCAT is not set +# CONFIG_LZMA is not set +# CONFIG_UNXZ is not set +# CONFIG_XZCAT is not set +# CONFIG_XZ is not set +# CONFIG_BZIP2 is not set +CONFIG_BZIP2_SMALL=0 +# CONFIG_FEATURE_BZIP2_DECOMPRESS is not set +CONFIG_CPIO=y +CONFIG_FEATURE_CPIO_O=y +CONFIG_FEATURE_CPIO_P=y +# CONFIG_DPKG is not set +# CONFIG_DPKG_DEB is not set +CONFIG_GZIP=y +CONFIG_FEATURE_GZIP_LONG_OPTIONS=y +CONFIG_GZIP_FAST=0 +# CONFIG_FEATURE_GZIP_LEVELS is not set +CONFIG_FEATURE_GZIP_DECOMPRESS=y +# CONFIG_LZOP is not set +# CONFIG_UNLZOP is not set +# CONFIG_LZOPCAT is not set +# CONFIG_LZOP_COMPR_HIGH is not set +# CONFIG_RPM is not set +# CONFIG_RPM2CPIO is not set +CONFIG_TAR=y +CONFIG_FEATURE_TAR_LONG_OPTIONS=y +CONFIG_FEATURE_TAR_CREATE=y +CONFIG_FEATURE_TAR_AUTODETECT=y +CONFIG_FEATURE_TAR_FROM=y +CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY=y +CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY=y +CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y +CONFIG_FEATURE_TAR_TO_COMMAND=y +CONFIG_FEATURE_TAR_UNAME_GNAME=y +CONFIG_FEATURE_TAR_NOPRESERVE_TIME=y +# CONFIG_FEATURE_TAR_SELINUX is not set +# CONFIG_FEATURE_RTOS_TAR_RESTORE_PERMS is not set +CONFIG_UNZIP=y +CONFIG_FEATURE_UNZIP_CDF=y +# CONFIG_FEATURE_UNZIP_BZIP2 is not set +# CONFIG_FEATURE_UNZIP_LZMA is not set +# CONFIG_FEATURE_UNZIP_XZ is not set +# CONFIG_FEATURE_LZMA_FAST is not set + +# +# Coreutils +# +CONFIG_BASENAME=y +CONFIG_CAT=y +# CONFIG_FEATURE_CATN is not set +# CONFIG_FEATURE_CATV is not set +CONFIG_CHGRP=y +CONFIG_CHMOD=y +CONFIG_CHOWN=y +CONFIG_FEATURE_CHOWN_LONG_OPTIONS=y +CONFIG_CHROOT=y +# CONFIG_CKSUM is not set +CONFIG_COMM=y +CONFIG_CP=y +CONFIG_FEATURE_CP_LONG_OPTIONS=y +# CONFIG_FEATURE_CP_REFLINK is not set +CONFIG_CUT=y +CONFIG_DATE=y +CONFIG_FEATURE_DATE_ISOFMT=y +CONFIG_FEATURE_DATE_NANO=y +CONFIG_FEATURE_DATE_COMPAT=y +CONFIG_DD=y +CONFIG_FEATURE_DD_SIGNAL_HANDLING=y +CONFIG_FEATURE_DD_THIRD_STATUS_LINE=y +CONFIG_FEATURE_DD_IBS_OBS=y +CONFIG_FEATURE_DD_STATUS=y +CONFIG_DF=y +CONFIG_FEATURE_DF_FANCY=y +CONFIG_DIRNAME=y +# CONFIG_DOS2UNIX is not set +# CONFIG_UNIX2DOS is not set +CONFIG_DU=y +CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y +CONFIG_ECHO=y +CONFIG_FEATURE_FANCY_ECHO=y +CONFIG_ENV=y +CONFIG_EXPAND=y +# CONFIG_UNEXPAND is not set +CONFIG_EXPR=y +CONFIG_EXPR_MATH_SUPPORT_64=y +# CONFIG_FACTOR is not set +CONFIG_FALSE=y +# CONFIG_FOLD is not set +CONFIG_HEAD=y +CONFIG_FEATURE_FANCY_HEAD=y +CONFIG_HOSTID=y +CONFIG_ID=y +CONFIG_GROUPS=y +CONFIG_INSTALL=y +CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y +# CONFIG_LINK is not set +CONFIG_LN=y +CONFIG_LOGNAME=y +CONFIG_LS=y +CONFIG_FEATURE_LS_FILETYPES=y +CONFIG_FEATURE_LS_FOLLOWLINKS=y +CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_FEATURE_LS_WIDTH=y +CONFIG_FEATURE_LS_SORTFILES=y +CONFIG_FEATURE_LS_TIMESTAMPS=y +CONFIG_FEATURE_LS_USERNAME=y +CONFIG_FEATURE_LS_COLOR=y +CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y +CONFIG_MD5SUM=y +# CONFIG_SHA1SUM is not set +# CONFIG_SHA256SUM is not set +# CONFIG_SHA512SUM is not set +# CONFIG_SHA3SUM is not set + +# +# Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum +# +CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y +CONFIG_MKDIR=y +CONFIG_MKFIFO=y +CONFIG_MKNOD=y +CONFIG_MKTEMP=y +CONFIG_MV=y +CONFIG_NICE=y +# CONFIG_NL is not set +CONFIG_NOHUP=y +# CONFIG_NPROC is not set +CONFIG_OD=y +# CONFIG_PASTE is not set +CONFIG_PRINTENV=y +CONFIG_PRINTF=y +CONFIG_PWD=y +CONFIG_READLINK=y +CONFIG_FEATURE_READLINK_FOLLOW=y +# CONFIG_REALPATH is not set +CONFIG_RM=y +CONFIG_RMDIR=y +CONFIG_SEQ=y +# CONFIG_SHRED is not set +# CONFIG_SHUF is not set +CONFIG_SLEEP=y +CONFIG_FEATURE_FANCY_SLEEP=y +CONFIG_SORT=y +CONFIG_FEATURE_SORT_BIG=y +# CONFIG_FEATURE_SORT_OPTIMIZE_MEMORY is not set +# CONFIG_SPLIT is not set +# CONFIG_FEATURE_SPLIT_FANCY is not set +CONFIG_STAT=y +CONFIG_FEATURE_STAT_FORMAT=y +CONFIG_FEATURE_STAT_FILESYSTEM=y +CONFIG_STTY=y +CONFIG_SUM=y +CONFIG_SYNC=y +# CONFIG_FEATURE_SYNC_FANCY is not set +CONFIG_FSYNC=y +# CONFIG_TAC is not set +CONFIG_TAIL=y +CONFIG_FEATURE_FANCY_TAIL=y +CONFIG_TEE=y +CONFIG_FEATURE_TEE_USE_BLOCK_IO=y +CONFIG_TEST=y +CONFIG_TEST1=y +CONFIG_TEST2=y +CONFIG_FEATURE_TEST_64=y +CONFIG_TIMEOUT=y +CONFIG_TOUCH=y +CONFIG_FEATURE_TOUCH_NODEREF=y +# CONFIG_FEATURE_TOUCH_SUSV3 is not set +CONFIG_TR=y +CONFIG_FEATURE_TR_CLASSES=y +CONFIG_FEATURE_TR_EQUIV=y +CONFIG_TRUE=y +# CONFIG_TRUNCATE is not set +CONFIG_TTY=y +CONFIG_UNAME=y +CONFIG_UNAME_OSNAME="GNU/Linux" +# CONFIG_BB_ARCH is not set +CONFIG_UNIQ=y +# CONFIG_UNLINK is not set +CONFIG_USLEEP=y +# CONFIG_UUDECODE is not set +CONFIG_BASE64=y +# CONFIG_UUENCODE is not set +CONFIG_WC=y +CONFIG_FEATURE_WC_LARGE=y +CONFIG_WHO=y +# CONFIG_W is not set +CONFIG_USERS=y +CONFIG_WHOAMI=y +CONFIG_YES=y + +# +# Common options +# +CONFIG_FEATURE_VERBOSE=y + +# +# Common options for cp and mv +# +CONFIG_FEATURE_PRESERVE_HARDLINKS=y + +# +# Common options for df, du, ls +# +CONFIG_FEATURE_HUMAN_READABLE=y + +# +# Console Utilities +# +# CONFIG_CHVT is not set +CONFIG_CLEAR=y +CONFIG_DEALLOCVT=y +# CONFIG_DUMPKMAP is not set +# CONFIG_FGCONSOLE is not set +# CONFIG_KBD_MODE is not set +# CONFIG_LOADFONT is not set +# CONFIG_SETFONT is not set +# CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set +CONFIG_DEFAULT_SETFONT_DIR="" +# CONFIG_FEATURE_LOADFONT_PSF2 is not set +# CONFIG_FEATURE_LOADFONT_RAW is not set +CONFIG_LOADKMAP=y +# CONFIG_OPENVT is not set +CONFIG_RESET=y +CONFIG_RESIZE=y +CONFIG_FEATURE_RESIZE_PRINT=y +CONFIG_SETCONSOLE=y +CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS=y +# CONFIG_SETKEYCODES is not set +# CONFIG_SETLOGCONS is not set +# CONFIG_SHOWKEY is not set + +# +# Debian Utilities +# +# CONFIG_PIPE_PROGRESS is not set +# CONFIG_RUN_PARTS is not set +# CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS is not set +# CONFIG_FEATURE_RUN_PARTS_FANCY is not set +CONFIG_START_STOP_DAEMON=y +CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y +CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y +CONFIG_WHICH=y + +# +# klibc-utils +# +# CONFIG_MINIPS is not set +# CONFIG_NUKE is not set +# CONFIG_RESUME is not set +# CONFIG_RUN_INIT is not set + +# +# Editors +# +CONFIG_AWK=y +CONFIG_FEATURE_AWK_LIBM=y +CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y +CONFIG_CMP=y +CONFIG_DIFF=y +CONFIG_FEATURE_DIFF_LONG_OPTIONS=y +CONFIG_FEATURE_DIFF_DIR=y +CONFIG_ED=y +# CONFIG_PATCH is not set +CONFIG_SED=y +CONFIG_VI=y +CONFIG_FEATURE_VI_MAX_LEN=4096 +# CONFIG_FEATURE_VI_8BIT is not set +CONFIG_FEATURE_VI_COLON=y +CONFIG_FEATURE_VI_YANKMARK=y +CONFIG_FEATURE_VI_SEARCH=y +# CONFIG_FEATURE_VI_REGEX_SEARCH is not set +CONFIG_FEATURE_VI_USE_SIGNALS=y +CONFIG_FEATURE_VI_DOT_CMD=y +CONFIG_FEATURE_VI_READONLY=y +CONFIG_FEATURE_VI_SETOPTS=y +CONFIG_FEATURE_VI_SET=y +CONFIG_FEATURE_VI_WIN_RESIZE=y +CONFIG_FEATURE_VI_ASK_TERMINAL=y +CONFIG_FEATURE_VI_UNDO=y +CONFIG_FEATURE_VI_UNDO_QUEUE=y +CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=256 +# CONFIG_FEATURE_ALLOW_EXEC is not set + +# +# Finding Utilities +# +CONFIG_FIND=y +CONFIG_FEATURE_FIND_PRINT0=y +CONFIG_FEATURE_FIND_MTIME=y +CONFIG_FEATURE_FIND_MMIN=y +CONFIG_FEATURE_FIND_PERM=y +CONFIG_FEATURE_FIND_TYPE=y +# CONFIG_FEATURE_FIND_EXECUTABLE is not set +CONFIG_FEATURE_FIND_XDEV=y +CONFIG_FEATURE_FIND_MAXDEPTH=y +CONFIG_FEATURE_FIND_NEWER=y +CONFIG_FEATURE_FIND_INUM=y +CONFIG_FEATURE_FIND_EXEC=y +CONFIG_FEATURE_FIND_EXEC_PLUS=y +CONFIG_FEATURE_FIND_USER=y +CONFIG_FEATURE_FIND_GROUP=y +CONFIG_FEATURE_FIND_NOT=y +CONFIG_FEATURE_FIND_DEPTH=y +CONFIG_FEATURE_FIND_PAREN=y +CONFIG_FEATURE_FIND_SIZE=y +CONFIG_FEATURE_FIND_PRUNE=y +# CONFIG_FEATURE_FIND_QUIT is not set +CONFIG_FEATURE_FIND_DELETE=y +# CONFIG_FEATURE_FIND_EMPTY is not set +CONFIG_FEATURE_FIND_PATH=y +CONFIG_FEATURE_FIND_REGEX=y +# CONFIG_FEATURE_FIND_CONTEXT is not set +CONFIG_FEATURE_FIND_LINKS=y +CONFIG_GREP=y +CONFIG_EGREP=y +CONFIG_FGREP=y +CONFIG_FEATURE_GREP_CONTEXT=y +CONFIG_XARGS=y +CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y +CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y +CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y +CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y +CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR=y +CONFIG_FEATURE_XARGS_SUPPORT_PARALLEL=y +CONFIG_FEATURE_XARGS_SUPPORT_ARGS_FILE=y + +# +# Init Utilities +# +# CONFIG_BOOTCHARTD is not set +# CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set +# CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE is not set +CONFIG_HALT=y +CONFIG_POWEROFF=y +CONFIG_REBOOT=y +# CONFIG_FEATURE_WAIT_FOR_INIT is not set +# CONFIG_FEATURE_CALL_TELINIT is not set +CONFIG_TELINIT_PATH="" +CONFIG_INIT=y +CONFIG_LINUXRC=y +CONFIG_FEATURE_USE_INITTAB=y +CONFIG_FEATURE_KILL_REMOVED=y +CONFIG_FEATURE_KILL_DELAY=0 +CONFIG_FEATURE_INIT_SCTTY=y +# CONFIG_FEATURE_INIT_SYSLOG is not set +CONFIG_FEATURE_INIT_QUIET=y +CONFIG_FEATURE_INIT_COREDUMPS=y +CONFIG_INIT_TERMINAL_TYPE="linux" +CONFIG_FEATURE_INIT_MODIFY_CMDLINE=y +# CONFIG_FEATURE_RTOS_SUPPORT_KEXEC is not set + +# +# Login/Password Management Utilities +# +CONFIG_FEATURE_SHADOWPASSWDS=y +# CONFIG_USE_BB_PWD_GRP is not set +# CONFIG_USE_BB_SHADOW is not set +# CONFIG_USE_BB_CRYPT is not set +# CONFIG_USE_BB_CRYPT_SHA is not set +# CONFIG_ADD_SHELL is not set +# CONFIG_REMOVE_SHELL is not set +# CONFIG_ADDGROUP is not set +# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set +# CONFIG_ADDUSER is not set +# CONFIG_FEATURE_CHECK_NAMES is not set +CONFIG_LAST_ID=0 +CONFIG_FIRST_SYSTEM_ID=0 +CONFIG_LAST_SYSTEM_ID=0 +# CONFIG_CHPASSWD is not set +CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="" +# CONFIG_CRYPTPW is not set +# CONFIG_MKPASSWD is not set +# CONFIG_DELUSER is not set +# CONFIG_DELGROUP is not set +# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set +CONFIG_GETTY=y +# CONFIG_LOGIN is not set +# CONFIG_LOGIN_SESSION_AS_CHILD is not set +# CONFIG_LOGIN_SCRIPTS is not set +# CONFIG_FEATURE_NOLOGIN is not set +# CONFIG_FEATURE_SECURETTY is not set +# CONFIG_PASSWD is not set +# CONFIG_FEATURE_PASSWD_WEAK_CHECK is not set +# CONFIG_SU is not set +# CONFIG_FEATURE_SU_SYSLOG is not set +# CONFIG_FEATURE_SU_CHECKS_SHELLS is not set +# CONFIG_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set +# CONFIG_SULOGIN is not set +# CONFIG_VLOCK is not set + +# +# Linux Ext2 FS Progs +# +CONFIG_CHATTR=y +CONFIG_FSCK=y +CONFIG_LSATTR=y +# CONFIG_TUNE2FS is not set + +# +# Linux Module Utilities +# +# CONFIG_MODPROBE_SMALL is not set +CONFIG_DEPMOD=y +CONFIG_INSMOD=y +CONFIG_LSMOD=y +# CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set +CONFIG_MODINFO=y +CONFIG_MODPROBE=y +# CONFIG_FEATURE_MODPROBE_BLACKLIST is not set +CONFIG_RMMOD=y + +# +# Options common to multiple modutils +# +CONFIG_FEATURE_CMDLINE_MODULE_OPTIONS=y +# CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set +# CONFIG_FEATURE_2_4_MODULES is not set +# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set +# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set +# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set +# CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set +# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set +# CONFIG_FEATURE_MODUTILS_ALIAS is not set +# CONFIG_FEATURE_MODUTILS_SYMBOLS is not set +CONFIG_DEFAULT_MODULES_DIR="/lib/modules" +CONFIG_DEFAULT_DEPMOD_FILE="modules.dep" +# CONFIG_FEATURE_MODINFO_SHOW_PKCS7_SIGNATURE is not set + +# +# Linux System Utilities +# +# CONFIG_ACPID is not set +# CONFIG_FEATURE_ACPID_COMPAT is not set +# CONFIG_BLKDISCARD is not set +CONFIG_BLKID=y +CONFIG_FEATURE_BLKID_TYPE=y +CONFIG_BLOCKDEV=y +CONFIG_CAL=y +CONFIG_CHRT=y +CONFIG_DMESG=y +CONFIG_FEATURE_DMESG_PRETTY=y +# CONFIG_EJECT is not set +# CONFIG_FEATURE_EJECT_SCSI is not set +# CONFIG_FALLOCATE is not set +# CONFIG_FATATTR is not set +# CONFIG_FBSET is not set +# CONFIG_FEATURE_FBSET_FANCY is not set +# CONFIG_FEATURE_FBSET_READMODE is not set +# CONFIG_FDFORMAT is not set +CONFIG_FDISK=y +# CONFIG_FDISK_SUPPORT_LARGE_DISKS is not set +CONFIG_FEATURE_FDISK_WRITABLE=y +CONFIG_FEATURE_AIX_LABEL=y +CONFIG_FEATURE_SGI_LABEL=y +CONFIG_FEATURE_SUN_LABEL=y +CONFIG_FEATURE_OSF_LABEL=y +CONFIG_FEATURE_GPT_LABEL=y +CONFIG_FEATURE_FDISK_ADVANCED=y +# CONFIG_FDISK_SUPPORT_NOINTERACTIVE_OPTIONS is not set +CONFIG_FINDFS=y +CONFIG_FLOCK=y +# CONFIG_FDFLUSH is not set +CONFIG_FREERAMDISK=y +CONFIG_FSCK_MINIX=y +# CONFIG_FSFREEZE is not set +# CONFIG_FSTRIM is not set +CONFIG_GETOPT=y +# CONFIG_FEATURE_GETOPT_LONG is not set +CONFIG_HEXDUMP=y +CONFIG_FEATURE_HEXDUMP_REVERSE=y +CONFIG_HD=y +# CONFIG_XXD is not set +CONFIG_HWCLOCK=y +CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS=y +# CONFIG_IONICE is not set +CONFIG_IPCRM=y +CONFIG_IPCS=y +CONFIG_LAST=y +# CONFIG_FEATURE_LAST_FANCY is not set +CONFIG_LOSETUP=y +CONFIG_LSPCI=y +# CONFIG_LSUSB is not set +CONFIG_MDEV=y +CONFIG_FEATURE_MDEV_CONF=y +CONFIG_FEATURE_MDEV_RENAME=y +CONFIG_FEATURE_MDEV_RENAME_REGEXP=y +CONFIG_FEATURE_MDEV_EXEC=y +CONFIG_FEATURE_MDEV_LOAD_FIRMWARE=y +# CONFIG_FEATURE_MDEV_DAEMON is not set +CONFIG_MESG=y +CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y +# CONFIG_MKE2FS is not set +# CONFIG_MKFS_EXT2 is not set +# CONFIG_MKFS_MINIX is not set +CONFIG_FEATURE_MINIX2=y +# CONFIG_MKFS_REISER is not set +CONFIG_MKDOSFS=y +CONFIG_MKFS_VFAT=y +# CONFIG_MKSWAP is not set +# CONFIG_FEATURE_MKSWAP_UUID is not set +CONFIG_MORE=y +CONFIG_MOUNT=y +CONFIG_FEATURE_MOUNT_FAKE=y +CONFIG_FEATURE_MOUNT_VERBOSE=y +# CONFIG_FEATURE_MOUNT_HELPERS is not set +CONFIG_FEATURE_MOUNT_LABEL=y +CONFIG_FEATURE_MOUNT_NFS=y +CONFIG_FEATURE_MOUNT_CIFS=y +CONFIG_FEATURE_MOUNT_FLAGS=y +CONFIG_FEATURE_MOUNT_FSTAB=y +CONFIG_FEATURE_MOUNT_OTHERTAB=y +CONFIG_MOUNTPOINT=y +# CONFIG_NOLOGIN is not set +# CONFIG_NOLOGIN_DEPENDENCIES is not set +# CONFIG_NSENTER is not set +CONFIG_PIVOT_ROOT=y +# CONFIG_RDATE is not set +# CONFIG_RDEV is not set +CONFIG_READPROFILE=y +CONFIG_RENICE=y +CONFIG_REV=y +# CONFIG_RTCWAKE is not set +CONFIG_SCRIPT=y +# CONFIG_SCRIPTREPLAY is not set +# CONFIG_SETARCH is not set +# CONFIG_LINUX32 is not set +# CONFIG_LINUX64 is not set +# CONFIG_SETPRIV is not set +# CONFIG_FEATURE_SETPRIV_DUMP is not set +# CONFIG_FEATURE_SETPRIV_CAPABILITIES is not set +# CONFIG_FEATURE_SETPRIV_CAPABILITY_NAMES is not set +CONFIG_SETSID=y +CONFIG_SWAPON=y +CONFIG_FEATURE_SWAPON_DISCARD=y +CONFIG_FEATURE_SWAPON_PRI=y +CONFIG_SWAPOFF=y +CONFIG_FEATURE_SWAPONOFF_LABEL=y +CONFIG_SWITCH_ROOT=y +CONFIG_TASKSET=y +CONFIG_FEATURE_TASKSET_FANCY=y +# CONFIG_FEATURE_TASKSET_CPULIST is not set +# CONFIG_UEVENT is not set +CONFIG_UMOUNT=y +CONFIG_FEATURE_UMOUNT_ALL=y +# CONFIG_UNSHARE is not set +# CONFIG_WALL is not set + +# +# Common options for mount/umount +# +CONFIG_FEATURE_MOUNT_LOOP=y +CONFIG_FEATURE_MOUNT_LOOP_CREATE=y +# CONFIG_FEATURE_MTAB_SUPPORT is not set +CONFIG_VOLUMEID=y + +# +# Filesystem/Volume identification +# +CONFIG_FEATURE_VOLUMEID_BCACHE=y +# CONFIG_FEATURE_VOLUMEID_BTRFS is not set +# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set +# CONFIG_FEATURE_VOLUMEID_EXFAT is not set +# CONFIG_FEATURE_VOLUMEID_EXT is not set +CONFIG_FEATURE_VOLUMEID_F2FS=y +# CONFIG_FEATURE_VOLUMEID_FAT is not set +# CONFIG_FEATURE_VOLUMEID_HFS is not set +# CONFIG_FEATURE_VOLUMEID_ISO9660 is not set +# CONFIG_FEATURE_VOLUMEID_JFS is not set +CONFIG_FEATURE_VOLUMEID_LFS=y +# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set +# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set +# CONFIG_FEATURE_VOLUMEID_LUKS is not set +CONFIG_FEATURE_VOLUMEID_MINIX=y +# CONFIG_FEATURE_VOLUMEID_NILFS is not set +# CONFIG_FEATURE_VOLUMEID_NTFS is not set +# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set +# CONFIG_FEATURE_VOLUMEID_REISERFS is not set +# CONFIG_FEATURE_VOLUMEID_ROMFS is not set +CONFIG_FEATURE_VOLUMEID_SQUASHFS=y +# CONFIG_FEATURE_VOLUMEID_SYSV is not set +CONFIG_FEATURE_VOLUMEID_UBIFS=y +# CONFIG_FEATURE_VOLUMEID_UDF is not set +# CONFIG_FEATURE_VOLUMEID_XFS is not set + +# +# Miscellaneous Utilities +# +CONFIG_ADJTIMEX=y +# CONFIG_BBCONFIG is not set +# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set +# CONFIG_BC is not set +# CONFIG_DC is not set +# CONFIG_FEATURE_DC_BIG is not set +# CONFIG_FEATURE_DC_LIBM is not set +# CONFIG_FEATURE_BC_INTERACTIVE is not set +# CONFIG_FEATURE_BC_LONG_OPTIONS is not set +# CONFIG_BEEP is not set +CONFIG_FEATURE_BEEP_FREQ=0 +CONFIG_FEATURE_BEEP_LENGTH_MS=0 +# CONFIG_CHAT is not set +# CONFIG_FEATURE_CHAT_NOFAIL is not set +# CONFIG_FEATURE_CHAT_TTY_HIFI is not set +# CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set +# CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set +# CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set +# CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set +# CONFIG_FEATURE_CHAT_CLR_ABORT is not set +# CONFIG_CONSPY is not set +CONFIG_CROND=y +CONFIG_FEATURE_CROND_D=y +CONFIG_FEATURE_CROND_CALL_SENDMAIL=y +CONFIG_FEATURE_CROND_SPECIAL_TIMES=y +CONFIG_FEATURE_CROND_DIR="/var/spool/cron" +CONFIG_CRONTAB=y +# CONFIG_DEVFSD is not set +# CONFIG_DEVFSD_MODLOAD is not set +# CONFIG_DEVFSD_FG_NP is not set +# CONFIG_DEVFSD_VERBOSE is not set +# CONFIG_FEATURE_DEVFS is not set +# CONFIG_DEVMEM is not set +# CONFIG_FBSPLASH is not set +CONFIG_FLASH_ERASEALL=y +CONFIG_FLASH_LOCK=y +CONFIG_FLASH_UNLOCK=y +CONFIG_FLASHCP=y +# CONFIG_HDPARM is not set +# CONFIG_FEATURE_HDPARM_GET_IDENTITY is not set +# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set +# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set +# CONFIG_HEXEDIT is not set +# CONFIG_I2CGET is not set +# CONFIG_I2CSET is not set +# CONFIG_I2CDUMP is not set +# CONFIG_I2CDETECT is not set +# CONFIG_I2CTRANSFER is not set +# CONFIG_INOTIFYD is not set +CONFIG_LESS=y +CONFIG_FEATURE_LESS_MAXLINES=9999999 +CONFIG_FEATURE_LESS_BRACKETS=y +CONFIG_FEATURE_LESS_FLAGS=y +CONFIG_FEATURE_LESS_TRUNCATE=y +CONFIG_FEATURE_LESS_MARKS=y +CONFIG_FEATURE_LESS_REGEXP=y +CONFIG_FEATURE_LESS_WINCH=y +# CONFIG_FEATURE_LESS_ASK_TERMINAL is not set +CONFIG_FEATURE_LESS_DASHCMD=y +CONFIG_FEATURE_LESS_LINENUMS=y +CONFIG_FEATURE_LESS_RAW=y +CONFIG_FEATURE_LESS_ENV=y +# CONFIG_LSSCSI is not set +CONFIG_MAKEDEVS=y +# CONFIG_FEATURE_MAKEDEVS_LEAF is not set +CONFIG_FEATURE_MAKEDEVS_TABLE=y +# CONFIG_MAN is not set +# CONFIG_MICROCOM is not set +# CONFIG_MIM is not set +# CONFIG_MT is not set +CONFIG_NANDWRITE=y +CONFIG_NANDDUMP=y +# CONFIG_PARTPROBE is not set +# CONFIG_RAIDAUTORUN is not set +# CONFIG_READAHEAD is not set +# CONFIG_RFKILL is not set +CONFIG_RUNLEVEL=y +CONFIG_RX=y +# CONFIG_SETFATTR is not set +# CONFIG_SETSERIAL is not set +CONFIG_STRINGS=y +CONFIG_TIME=y +# CONFIG_TS is not set +CONFIG_TTYSIZE=y +# CONFIG_UBIATTACH is not set +# CONFIG_UBIDETACH is not set +# CONFIG_UBIMKVOL is not set +# CONFIG_UBIRMVOL is not set +# CONFIG_UBIRSVOL is not set +# CONFIG_UBIUPDATEVOL is not set +# CONFIG_UBIRENAME is not set +# CONFIG_VOLNAME is not set +# CONFIG_WATCHDOG is not set + +# +# Networking Utilities +# +CONFIG_FEATURE_IPV6=y +# CONFIG_FEATURE_UNIX_LOCAL is not set +CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y +# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set +# CONFIG_FEATURE_TLS_SHA1 is not set +CONFIG_ARP=y +CONFIG_ARPING=y +# CONFIG_BRCTL is not set +# CONFIG_FEATURE_BRCTL_FANCY is not set +# CONFIG_FEATURE_BRCTL_SHOW is not set +# CONFIG_DNSD is not set +# CONFIG_ETHER_WAKE is not set +# CONFIG_FTPD is not set +# CONFIG_FEATURE_FTPD_WRITE is not set +# CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set +# CONFIG_FEATURE_FTPD_AUTHENTICATION is not set +# CONFIG_FTPGET is not set +# CONFIG_FTPPUT is not set +# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set +# CONFIG_FEATURE_RTOS_FTP_TIMEOUT is not set +CONFIG_HOSTNAME=y +CONFIG_DNSDOMAINNAME=y +# CONFIG_HTTPD is not set +# CONFIG_FEATURE_HTTPD_RANGES is not set +# CONFIG_FEATURE_HTTPD_SETUID is not set +# CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set +# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set +# CONFIG_FEATURE_HTTPD_CGI is not set +# CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set +# CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set +# CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set +# CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set +# CONFIG_FEATURE_HTTPD_PROXY is not set +# CONFIG_FEATURE_HTTPD_GZIP is not set +CONFIG_IFCONFIG=y +CONFIG_FEATURE_IFCONFIG_STATUS=y +CONFIG_FEATURE_IFCONFIG_SLIP=y +CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y +CONFIG_FEATURE_IFCONFIG_HW=y +CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y +CONFIG_IFENSLAVE=y +CONFIG_IFPLUGD=y +CONFIG_IFUP=y +CONFIG_IFDOWN=y +CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" +# CONFIG_FEATURE_IFUPDOWN_IP is not set +CONFIG_FEATURE_IFUPDOWN_IPV4=y +CONFIG_FEATURE_IFUPDOWN_IPV6=y +CONFIG_FEATURE_IFUPDOWN_MAPPING=y +# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set +# CONFIG_INETD is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set +# CONFIG_FEATURE_INETD_RPC is not set +CONFIG_IP=y +CONFIG_IPADDR=y +CONFIG_IPLINK=y +CONFIG_IPROUTE=y +CONFIG_IPTUNNEL=y +CONFIG_IPRULE=y +# CONFIG_IPNEIGH is not set +CONFIG_FEATURE_IP_ADDRESS=y +CONFIG_FEATURE_IP_LINK=y +CONFIG_FEATURE_IP_ROUTE=y +CONFIG_FEATURE_IP_ROUTE_DIR="/etc/iproute2" +CONFIG_FEATURE_IP_TUNNEL=y +CONFIG_FEATURE_IP_RULE=y +CONFIG_FEATURE_IP_NEIGH=y +# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set +# CONFIG_IPCALC is not set +# CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set +# CONFIG_FEATURE_IPCALC_FANCY is not set +# CONFIG_FAKEIDENTD is not set +# CONFIG_NAMEIF is not set +# CONFIG_FEATURE_NAMEIF_EXTENDED is not set +# CONFIG_NBDCLIENT is not set +# CONFIG_NC is not set +# CONFIG_NETCAT is not set +# CONFIG_NC_SERVER is not set +# CONFIG_NC_EXTRA is not set +# CONFIG_NC_110_COMPAT is not set +CONFIG_NETSTAT=y +CONFIG_FEATURE_NETSTAT_WIDE=y +CONFIG_FEATURE_NETSTAT_PRG=y +# CONFIG_NSLOOKUP is not set +# CONFIG_FEATURE_NSLOOKUP_BIG is not set +# CONFIG_FEATURE_NSLOOKUP_LONG_OPTIONS is not set +# CONFIG_NTPD is not set +# CONFIG_FEATURE_NTPD_SERVER is not set +# CONFIG_FEATURE_NTPD_CONF is not set +# CONFIG_FEATURE_NTP_AUTH is not set +CONFIG_PING=y +CONFIG_PING6=y +CONFIG_FEATURE_FANCY_PING=y +# CONFIG_PSCAN is not set +CONFIG_ROUTE=y +# CONFIG_SLATTACH is not set +# CONFIG_SSL_CLIENT is not set +# CONFIG_TC is not set +# CONFIG_FEATURE_TC_INGRESS is not set +CONFIG_TCPSVD=y +# CONFIG_UDPSVD is not set +# CONFIG_TELNET is not set +# CONFIG_FEATURE_TELNET_TTYPE is not set +# CONFIG_FEATURE_TELNET_AUTOLOGIN is not set +# CONFIG_FEATURE_TELNET_WIDTH is not set +# CONFIG_TELNETD is not set +# CONFIG_FEATURE_TELNETD_STANDALONE is not set +# CONFIG_FEATURE_TELNETD_INETD_WAIT is not set +# CONFIG_TFTP is not set +# CONFIG_FEATURE_TFTP_PROGRESS_BAR is not set +# CONFIG_FEATURE_TFTP_HPA_COMPAT is not set +# CONFIG_TFTPD is not set +# CONFIG_FEATURE_TFTP_GET is not set +# CONFIG_FEATURE_TFTP_PUT is not set +# CONFIG_FEATURE_TFTP_BLOCKSIZE is not set +# CONFIG_TFTP_DEBUG is not set +# CONFIG_TLS is not set +# CONFIG_TRACEROUTE is not set +# CONFIG_TRACEROUTE6 is not set +# CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set +# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set +# CONFIG_TUNCTL is not set +# CONFIG_FEATURE_TUNCTL_UG is not set +CONFIG_VCONFIG=y +# CONFIG_WGET is not set +# CONFIG_FEATURE_WGET_LONG_OPTIONS is not set +# CONFIG_FEATURE_WGET_STATUSBAR is not set +# CONFIG_FEATURE_WGET_AUTHENTICATION is not set +# CONFIG_FEATURE_WGET_TIMEOUT is not set +# CONFIG_FEATURE_WGET_HTTPS is not set +# CONFIG_FEATURE_WGET_OPENSSL is not set +# CONFIG_WHOIS is not set +# CONFIG_ZCIP is not set +# CONFIG_UDHCPD is not set +# CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set +# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set +CONFIG_DHCPD_LEASES_FILE="" +# CONFIG_DUMPLEASES is not set +# CONFIG_DHCPRELAY is not set +CONFIG_UDHCPC=y +CONFIG_FEATURE_UDHCPC_ARPING=y +CONFIG_FEATURE_UDHCPC_SANITIZEOPT=y +CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" +# CONFIG_UDHCPC6 is not set +# CONFIG_FEATURE_UDHCPC6_RFC3646 is not set +# CONFIG_FEATURE_UDHCPC6_RFC4704 is not set +# CONFIG_FEATURE_UDHCPC6_RFC4833 is not set +# CONFIG_FEATURE_UDHCPC6_RFC5970 is not set + +# +# Common options for DHCP applets +# +CONFIG_FEATURE_UDHCP_PORT=y +CONFIG_UDHCP_DEBUG=9 +CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 +CONFIG_FEATURE_UDHCP_RFC3397=y +# CONFIG_FEATURE_UDHCP_8021Q is not set +CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n" + +# +# Print Utilities +# +# CONFIG_LPD is not set +# CONFIG_LPR is not set +# CONFIG_LPQ is not set + +# +# Mail Utilities +# +# CONFIG_MAKEMIME is not set +# CONFIG_POPMAILDIR is not set +# CONFIG_FEATURE_POPMAILDIR_DELIVERY is not set +# CONFIG_REFORMIME is not set +# CONFIG_FEATURE_REFORMIME_COMPAT is not set +# CONFIG_SENDMAIL is not set +CONFIG_FEATURE_MIME_CHARSET="" + +# +# Process Utilities +# +CONFIG_FREE=y +CONFIG_FUSER=y +CONFIG_IOSTAT=y +CONFIG_KILL=y +CONFIG_KILLALL=y +CONFIG_KILLALL5=y +CONFIG_LSOF=y +CONFIG_MPSTAT=y +# CONFIG_NMETER is not set +# CONFIG_PGREP is not set +CONFIG_PKILL=y +CONFIG_PIDOF=y +CONFIG_FEATURE_PIDOF_SINGLE=y +CONFIG_FEATURE_PIDOF_OMIT=y +# CONFIG_PMAP is not set +# CONFIG_POWERTOP is not set +# CONFIG_FEATURE_POWERTOP_INTERACTIVE is not set +CONFIG_PS=y +CONFIG_FEATURE_PS_WIDE=y +# CONFIG_FEATURE_PS_LONG is not set +# CONFIG_FEATURE_PS_TIME is not set +# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set +# CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS is not set +# CONFIG_PSTREE is not set +# CONFIG_PWDX is not set +# CONFIG_SMEMCAP is not set +CONFIG_BB_SYSCTL=y +CONFIG_TOP=y +CONFIG_FEATURE_TOP_INTERACTIVE=y +CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y +CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y +# CONFIG_FEATURE_TOP_SMP_CPU is not set +# CONFIG_FEATURE_TOP_DECIMALS is not set +# CONFIG_FEATURE_TOP_SMP_PROCESS is not set +# CONFIG_FEATURE_TOPMEM is not set +CONFIG_UPTIME=y +CONFIG_FEATURE_UPTIME_UTMP_SUPPORT=y +# CONFIG_WATCH is not set +CONFIG_FEATURE_SHOW_THREADS=y +CONFIG_RTOS_FIX_CPUTIME_OVERFLOW=y + +# +# Runit Utilities +# +# CONFIG_CHPST is not set +# CONFIG_SETUIDGID is not set +# CONFIG_ENVUIDGID is not set +# CONFIG_ENVDIR is not set +# CONFIG_SOFTLIMIT is not set +# CONFIG_RUNSV is not set +# CONFIG_RUNSVDIR is not set +# CONFIG_FEATURE_RUNSVDIR_LOG is not set +# CONFIG_SV is not set +CONFIG_SV_DEFAULT_SERVICE_DIR="" +# CONFIG_SVC is not set +# CONFIG_SVOK is not set +# CONFIG_SVLOGD is not set +# CONFIG_CHCON is not set +# CONFIG_GETENFORCE is not set +# CONFIG_GETSEBOOL is not set +# CONFIG_LOAD_POLICY is not set +# CONFIG_MATCHPATHCON is not set +# CONFIG_RUNCON is not set +# CONFIG_SELINUXENABLED is not set +# CONFIG_SESTATUS is not set +# CONFIG_SETENFORCE is not set +# CONFIG_SETFILES is not set +# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set +# CONFIG_RESTORECON is not set +# CONFIG_SETSEBOOL is not set + +# +# Shells +# +CONFIG_SH_IS_ASH=y +# CONFIG_SH_IS_HUSH is not set +# CONFIG_SH_IS_NONE is not set +CONFIG_BASH_IS_ASH=y +# CONFIG_BASH_IS_HUSH is not set +# CONFIG_BASH_IS_NONE is not set +CONFIG_SHELL_ASH=y +CONFIG_ASH=y +CONFIG_ASH_OPTIMIZE_FOR_SIZE=y +CONFIG_ASH_INTERNAL_GLOB=y +CONFIG_ASH_BASH_COMPAT=y +CONFIG_ASH_BASH_SOURCE_CURDIR=y +CONFIG_ASH_BASH_NOT_FOUND_HOOK=y +CONFIG_ASH_JOB_CONTROL=y +CONFIG_ASH_ALIAS=y +CONFIG_ASH_RANDOM_SUPPORT=y +CONFIG_ASH_EXPAND_PRMT=y +CONFIG_ASH_IDLE_TIMEOUT=y +# CONFIG_ASH_MAIL is not set +CONFIG_ASH_ECHO=y +CONFIG_ASH_PRINTF=y +CONFIG_ASH_TEST=y +CONFIG_ASH_HELP=y +CONFIG_ASH_GETOPTS=y +CONFIG_ASH_CMDCMD=y +CONFIG_CTTYHACK=y +CONFIG_HUSH=y +CONFIG_SHELL_HUSH=y +CONFIG_HUSH_BASH_COMPAT=y +CONFIG_HUSH_BRACE_EXPANSION=y +CONFIG_HUSH_LINENO_VAR=y +CONFIG_HUSH_BASH_SOURCE_CURDIR=y +CONFIG_HUSH_INTERACTIVE=y +CONFIG_HUSH_SAVEHISTORY=y +CONFIG_HUSH_JOB=y +CONFIG_HUSH_TICK=y +CONFIG_HUSH_IF=y +CONFIG_HUSH_LOOPS=y +CONFIG_HUSH_CASE=y +CONFIG_HUSH_FUNCTIONS=y +CONFIG_HUSH_LOCAL=y +CONFIG_HUSH_RANDOM_SUPPORT=y +CONFIG_HUSH_MODE_X=y +CONFIG_HUSH_ECHO=y +CONFIG_HUSH_PRINTF=y +CONFIG_HUSH_TEST=y +CONFIG_HUSH_HELP=y +CONFIG_HUSH_EXPORT=y +CONFIG_HUSH_EXPORT_N=y +CONFIG_HUSH_READONLY=y +CONFIG_HUSH_KILL=y +CONFIG_HUSH_WAIT=y +CONFIG_HUSH_COMMAND=y +CONFIG_HUSH_TRAP=y +CONFIG_HUSH_TYPE=y +CONFIG_HUSH_TIMES=y +CONFIG_HUSH_READ=y +CONFIG_HUSH_SET=y +CONFIG_HUSH_UNSET=y +CONFIG_HUSH_ULIMIT=y +CONFIG_HUSH_UMASK=y +CONFIG_HUSH_GETOPTS=y +# CONFIG_HUSH_MEMLEAK is not set + +# +# Options common to all shells +# +CONFIG_FEATURE_SH_MATH=y +CONFIG_FEATURE_SH_MATH_64=y +# CONFIG_FEATURE_SH_MATH_BASE is not set +CONFIG_FEATURE_SH_EXTRA_QUIET=y +# CONFIG_FEATURE_SH_STANDALONE is not set +# CONFIG_FEATURE_SH_NOFORK is not set +CONFIG_FEATURE_SH_READ_FRAC=y +# CONFIG_FEATURE_SH_HISTFILESIZE is not set +# CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS is not set + +# +# System Logging Utilities +# +CONFIG_KLOGD=y +CONFIG_FEATURE_KLOGD_KLOGCTL=y +CONFIG_LOGGER=y +# CONFIG_LOGREAD is not set +# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set +# CONFIG_SYSLOGD is not set +# CONFIG_FEATURE_ROTATE_LOGFILE is not set +# CONFIG_FEATURE_REMOTE_LOG is not set +# CONFIG_FEATURE_SYSLOGD_DUP is not set +# CONFIG_FEATURE_SYSLOGD_CFG is not set +# CONFIG_FEATURE_SYSLOGD_PRECISE_TIMESTAMPS is not set +CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=0 +# CONFIG_FEATURE_IPC_SYSLOG is not set +CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0 +# CONFIG_FEATURE_KMSG_SYSLOG is not set -- Gitee From 60fb70f79abe348bd789b4d86f9a9a6e9fb13fba Mon Sep 17 00:00:00 2001 From: lisimin Date: Thu, 16 Sep 2021 17:48:16 +0800 Subject: [PATCH 006/304] revet to hardknott syntax change defconfig from yocto-embedded-tools Signed-off-by: lisimin --- meta-openeuler/conf/bblayers.conf.sample | 2 +- .../conf/distro/include/tcmode-gcc-bin.inc | 2 +- meta-openeuler/conf/distro/openeuler.conf | 2 +- meta-openeuler/conf/layer.conf | 2 +- meta-openeuler/conf/local.conf.sample | 14 +- .../recipes-core/busybox/busybox_1.33.1.bb | 44 +- .../recipes-core/busybox/files/rtos-defconfig | 1197 ------ .../recipes-core/glibc/glibc_2.25.bb | 6 +- .../recipes-core/images/openeuler-image.bb | 10 +- .../gcc/gcc-bin-toolchain-compilerlibs.bb | 8 +- .../gcc/gcc-bin-toolchain-cross.bb | 2 +- .../pseudo/pseudo_git.bbappend | 15 +- .../linux/files/kernel-defconfig | 3641 ----------------- .../recipes-kernel/linux/linux-openeuler.bb | 44 +- 14 files changed, 76 insertions(+), 4913 deletions(-) delete mode 100644 meta-openeuler/recipes-core/busybox/files/rtos-defconfig delete mode 100644 meta-openeuler/recipes-kernel/linux/files/kernel-defconfig diff --git a/meta-openeuler/conf/bblayers.conf.sample b/meta-openeuler/conf/bblayers.conf.sample index fe99672effa..3053c1ed1a1 100644 --- a/meta-openeuler/conf/bblayers.conf.sample +++ b/meta-openeuler/conf/bblayers.conf.sample @@ -9,5 +9,5 @@ BBLAYERS ?= " \ ##OEROOT##/meta \ ##OEROOT##/meta-poky \ ##OEROOT##/meta-yocto-bsp \ - ##OEROOT##/../meta-openeuler \ + ##OEROOT##/../yocto-meta-embedded/meta-openeuler \ " diff --git a/meta-openeuler/conf/distro/include/tcmode-gcc-bin.inc b/meta-openeuler/conf/distro/include/tcmode-gcc-bin.inc index 607d2bddd9e..27c94bdf591 100644 --- a/meta-openeuler/conf/distro/include/tcmode-gcc-bin.inc +++ b/meta-openeuler/conf/distro/include/tcmode-gcc-bin.inc @@ -20,7 +20,7 @@ PREFERRED_PROVIDER_libgcc-initial = "gcc-bin-toolchain-compilerlibs-${TARGET_ARC GCCVERSION = "7.3.0" -PATH:append = ":${COMPONENTS_DIR}/${BUILD_ARCH}/gcc-bin-toolchain-cross-${TARGET_ARCH}/usr/bin" +PATH_append = ":${COMPONENTS_DIR}/${BUILD_ARCH}/gcc-bin-toolchain-cross-${TARGET_ARCH}/usr/bin" #cannot set with linaro gcc,set it null DEBUG_PREFIX_MAP = "" diff --git a/meta-openeuler/conf/distro/openeuler.conf b/meta-openeuler/conf/distro/openeuler.conf index 15f1ad33b24..a199305016e 100644 --- a/meta-openeuler/conf/distro/openeuler.conf +++ b/meta-openeuler/conf/distro/openeuler.conf @@ -72,7 +72,7 @@ PREFERRED_PROVIDER_virtual/kernel = "linux-openeuler" LOCAL_SRC_DIR = "${BPN}" INHIBIT_PACKAGE_DEBUG_SPLIT = "1" -DEPENDS:remove += "cmake-native ninja-native" +DEPENDS_remove += "cmake-native ninja-native" #DL_DIR = "${LOCAL_FILES}" DL_DIR = "downloads" INHERIT += "get_dl_dir get_rpmdeps" diff --git a/meta-openeuler/conf/layer.conf b/meta-openeuler/conf/layer.conf index 5278e3d603b..f77e92b56a0 100644 --- a/meta-openeuler/conf/layer.conf +++ b/meta-openeuler/conf/layer.conf @@ -9,7 +9,7 @@ BBFILE_COLLECTIONS += "openeuler" BBFILE_PATTERN_openeuler = "^${LAYERDIR}/" BBFILE_PRIORITY_openeuler = "10" -LAYERSERIES_COMPAT_openeuler = "honister" +LAYERSERIES_COMPAT_openeuler = "hardknott" # This should only be incremented on significant changes that will # cause compatibility issues with other layers diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index e347f0c67fd..e5404a9edf6 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -234,14 +234,14 @@ BB_DISKMON_DIRS ??= "\ # # By default native qemu will build with a builtin VNC server where graphical output can be # seen. The line below enables the SDL UI frontend too. -#PACKAGECONFIG:append:pn-qemu-system-native = " sdl" +#PACKAGECONFIG_append:pn-qemu-system-native = " sdl" # By default libsdl2-native will be built, if you want to use your host's libSDL instead of # the minimal libsdl built by libsdl2-native then uncomment the ASSUME_PROVIDED line below. #ASSUME_PROVIDED += "libsdl2-native" # You can also enable the Gtk UI frontend, which takes somewhat longer to build, but adds # a handy set of menus for controlling the emulator. -#PACKAGECONFIG:append:pn-qemu-system-native = " gtk+" +#PACKAGECONFIG_append:pn-qemu-system-native = " gtk+" # # Hash Equivalence @@ -271,16 +271,16 @@ BB_DISKMON_DIRS ??= "\ # track the version of this file when it was generated. This can safely be ignored if # this doesn't mean anything to you. CONF_VERSION = "2" -HOSTTOOLS += "patchelf python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja automake-1.13 xz" -HOSTTOOLS:remove += "diffstat lz4c pzstd" -SANITY_REQUIRED_UTILITIES:remove += "diffstat chrpath" +HOSTTOOLS += "patchelf python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja xz" +HOSTTOOLS_remove += "diffstat lz4c pzstd rpcgen" +SANITY_REQUIRED_UTILITIES_remove += "diffstat chrpath" CONNECTIVITY_CHECK_URIS = "" #PREFERRED_VERSION_linux-yocto = "5.10%" ASSUME_PROVIDED += "rpm-native dwarfsrcfiles-native depmodwrapper-cross kmod-native bc-native bison-native make-native gperf-native pigz-native pbzip2-native ldconfig-native xz-native makedevs-native alsa-lib-native perl-native qemu-native chrpath-native kern-tools-native gmp-native libsdl2-native mesa-native virglrenderer-native pixman-native texinfo-dummy-native python3-native python3-setuptools-native gettext-native m4-native flex-native unifdef-native rsync-native init-system-helpers automake-native autoconf-native libtool-native opkg-utils-native patch-native pkgconfig-native init-system-helpers update-rc.d-native initscripts run-postinsts" PATCHTOOL = "patch" TCMODE = "gcc-bin" -INHERIT:remove += "uninative" -PATCHDEPENDENCY:remove += "patch-replacement-native:do_populate_sysroot" +INHERIT_remove += "uninative" +PATCHDEPENDENCY_remove += "patch-replacement-native:do_populate_sysroot" PREMIRRORS = "\ bzr://.*/.* file:////usr1/openeuler/src \n \ cvs://.*/.* file:////usr1/openeuler/src \n \ diff --git a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb index aa9ea775578..f80b30c2aaa 100644 --- a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb +++ b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb @@ -15,9 +15,9 @@ DEPENDS += "virtual/libc" inherit kernel-arch SRC_URI = "file://busybox/busybox-1.33.1.tar.bz2 \ - file://rtos-defconfig \ + file://yocto-embedded-tools/config/arm64/defconfig-busybox \ " -FILESPATH:prepend += "${LOCAL_FILES}/${BPN}:" +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" S = "${WORKDIR}/${BPN}-${PV}" #not split debug files with dwarfsrcfiles,no dwarfsrcfiles @@ -38,37 +38,37 @@ EXTRA_OEMAKE += "PKG_CONFIG=pkg-config" PACKAGES =+ "${PN}-httpd ${PN}-udhcpd ${PN}-udhcpc ${PN}-syslog ${PN}-mdev ${PN}-hwclock" -FILES:${PN}-httpd = "${sysconfdir}/init.d/busybox-httpd /srv/www" -FILES:${PN}-syslog = "${sysconfdir}/init.d/syslog* ${sysconfdir}/syslog-startup.conf* ${sysconfdir}/syslog.conf* ${systemd_unitdir}/system/syslog.service ${sysconfdir}/default/busybox-syslog" -FILES:${PN}-mdev = "${sysconfdir}/init.d/mdev ${sysconfdir}/mdev.conf ${sysconfdir}/mdev/*" -FILES:${PN}-udhcpd = "${sysconfdir}/init.d/busybox-udhcpd" -FILES:${PN}-udhcpc = "${sysconfdir}/udhcpc.d ${datadir}/udhcpc" -FILES:${PN}-hwclock = "${sysconfdir}/init.d/hwclock.sh" +FILES_${PN}-httpd = "${sysconfdir}/init.d/busybox-httpd /srv/www" +FILES_${PN}-syslog = "${sysconfdir}/init.d/syslog* ${sysconfdir}/syslog-startup.conf* ${sysconfdir}/syslog.conf* ${systemd_unitdir}/system/syslog.service ${sysconfdir}/default/busybox-syslog" +FILES_${PN}-mdev = "${sysconfdir}/init.d/mdev ${sysconfdir}/mdev.conf ${sysconfdir}/mdev/*" +FILES_${PN}-udhcpd = "${sysconfdir}/init.d/busybox-udhcpd" +FILES_${PN}-udhcpc = "${sysconfdir}/udhcpc.d ${datadir}/udhcpc" +FILES_${PN}-hwclock = "${sysconfdir}/init.d/hwclock.sh" INITSCRIPT_PACKAGES = "${PN}-httpd ${PN}-syslog ${PN}-udhcpd ${PN}-mdev ${PN}-hwclock" -INITSCRIPT_NAME:${PN}-httpd = "busybox-httpd" -INITSCRIPT_NAME:${PN}-hwclock = "hwclock.sh" -INITSCRIPT_NAME:${PN}-mdev = "mdev" -INITSCRIPT_PARAMS:${PN}-mdev = "start 04 S ." -INITSCRIPT_NAME:${PN}-syslog = "syslog" -INITSCRIPT_NAME:${PN}-udhcpd = "busybox-udhcpd" +INITSCRIPT_NAME_${PN}-httpd = "busybox-httpd" +INITSCRIPT_NAME_${PN}-hwclock = "hwclock.sh" +INITSCRIPT_NAME_${PN}-mdev = "mdev" +INITSCRIPT_PARAMS_${PN}-mdev = "start 04 S ." +INITSCRIPT_NAME_${PN}-syslog = "syslog" +INITSCRIPT_NAME_${PN}-udhcpd = "busybox-udhcpd" SYSTEMD_PACKAGES = "${PN}-syslog" -SYSTEMD_SERVICE:${PN}-syslog = "${@bb.utils.contains('SRC_URI', 'file://syslog.cfg', 'busybox-syslog.service', '', d)}" +SYSTEMD_SERVICE_${PN}-syslog = "${@bb.utils.contains('SRC_URI', 'file://syslog.cfg', 'busybox-syslog.service', '', d)}" -RDEPENDS:${PN}-syslog = "busybox" -CONFFILES:${PN}-syslog = "${sysconfdir}/syslog-startup.conf" -RCONFLICTS:${PN}-syslog = "rsyslog sysklogd syslog-ng" +RDEPENDS_${PN}-syslog = "busybox" +CONFFILES_${PN}-syslog = "${sysconfdir}/syslog-startup.conf" +RCONFLICTS_${PN}-syslog = "rsyslog sysklogd syslog-ng" -CONFFILES:${PN}-mdev = "${sysconfdir}/mdev.conf" +CONFFILES_${PN}-mdev = "${sysconfdir}/mdev.conf" -RRECOMMENDS:${PN} = "${PN}-udhcpc" +RRECOMMENDS_${PN} = "${PN}-udhcpc" -RDEPENDS:${PN} = "${@["", "busybox-inittab"][(d.getVar('VIRTUAL-RUNTIME_init_manager') == 'busybox')]}" +RDEPENDS_${PN} = "${@["", "busybox-inittab"][(d.getVar('VIRTUAL-RUNTIME_init_manager') == 'busybox')]}" do_configure() { - cp ../rtos-defconfig .config + cp ../yocto-embedded-tools/config/arm64/defconfig-busybox .config set -e unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS yes '' | oe_runmake oldconfig diff --git a/meta-openeuler/recipes-core/busybox/files/rtos-defconfig b/meta-openeuler/recipes-core/busybox/files/rtos-defconfig deleted file mode 100644 index 104cf9ae8f7..00000000000 --- a/meta-openeuler/recipes-core/busybox/files/rtos-defconfig +++ /dev/null @@ -1,1197 +0,0 @@ -# -# Automatically generated make config: don't edit -# Busybox version: 1.32.1 -# Thu May 20 10:03:03 2021 -# -CONFIG_HAVE_DOT_CONFIG=y - -# -# Settings -# -# CONFIG_DESKTOP is not set -CONFIG_EXTRA_COMPAT=y -# CONFIG_FEDORA_COMPAT is not set -CONFIG_INCLUDE_SUSv2=y -CONFIG_LONG_OPTS=y -CONFIG_SHOW_USAGE=y -CONFIG_FEATURE_VERBOSE_USAGE=y -CONFIG_FEATURE_COMPRESS_USAGE=y -CONFIG_LFS=y -# CONFIG_PAM is not set -CONFIG_FEATURE_DEVPTS=y -CONFIG_FEATURE_UTMP=y -CONFIG_FEATURE_WTMP=y -# CONFIG_FEATURE_PIDFILE is not set -CONFIG_PID_FILE_PATH="" -CONFIG_BUSYBOX=y -# CONFIG_FEATURE_SHOW_SCRIPT is not set -CONFIG_FEATURE_INSTALLER=y -# CONFIG_INSTALL_NO_USR is not set -CONFIG_FEATURE_SUID=y -# CONFIG_FEATURE_SUID_CONFIG is not set -# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set -# CONFIG_FEATURE_PREFER_APPLETS is not set -CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" -# CONFIG_SELINUX is not set -# CONFIG_FEATURE_CLEAN_UP is not set -# CONFIG_FEATURE_SYSLOG_INFO is not set -CONFIG_FEATURE_SYSLOG=y -CONFIG_PLATFORM_LINUX=y - -# -# Build Options -# -# CONFIG_STATIC is not set -# CONFIG_PIE is not set -# CONFIG_NOMMU is not set -# CONFIG_BUILD_LIBBUSYBOX is not set -# CONFIG_FEATURE_LIBBUSYBOX_STATIC is not set -# CONFIG_FEATURE_INDIVIDUAL is not set -# CONFIG_FEATURE_SHARED_BUSYBOX is not set -CONFIG_CROSS_COMPILER_PREFIX="" -CONFIG_SYSROOT="" -CONFIG_EXTRA_CFLAGS="" -CONFIG_EXTRA_LDFLAGS="" -CONFIG_EXTRA_LDLIBS="" -CONFIG_USE_PORTABLE_CODE=y -CONFIG_STACK_OPTIMIZATION_386=y - -# -# Installation Options ("make install" behavior) -# -CONFIG_INSTALL_APPLET_SYMLINKS=y -# CONFIG_INSTALL_APPLET_HARDLINKS is not set -# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set -# CONFIG_INSTALL_APPLET_DONT is not set -# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set -# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set -# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set -CONFIG_PREFIX="./_install" - -# -# Debugging Options -# -# CONFIG_DEBUG is not set -# CONFIG_DEBUG_PESSIMIZE is not set -# CONFIG_DEBUG_SANITIZE is not set -# CONFIG_UNIT_TEST is not set -# CONFIG_WERROR is not set -# CONFIG_WARN_SIMPLE_MSG is not set -CONFIG_NO_DEBUG_LIB=y -# CONFIG_DMALLOC is not set -# CONFIG_EFENCE is not set - -# -# Library Tuning -# -CONFIG_FEATURE_RTOS_APPLET_BLACKLIST=y -# CONFIG_FEATURE_USE_BSS_TAIL is not set -CONFIG_FLOAT_DURATION=y -# CONFIG_FEATURE_RTMINMAX is not set -# CONFIG_FEATURE_RTMINMAX_USE_LIBC_DEFINITIONS is not set -CONFIG_FEATURE_BUFFERS_USE_MALLOC=y -# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set -# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set -CONFIG_PASSWORD_MINLEN=6 -CONFIG_MD5_SMALL=1 -CONFIG_SHA3_SMALL=1 -CONFIG_FEATURE_FAST_TOP=y -CONFIG_FEATURE_ETC_NETWORKS=y -# CONFIG_FEATURE_ETC_SERVICES is not set -CONFIG_FEATURE_EDITING=y -CONFIG_FEATURE_EDITING_MAX_LEN=1024 -CONFIG_FEATURE_EDITING_VI=y -CONFIG_FEATURE_EDITING_HISTORY=255 -CONFIG_FEATURE_EDITING_SAVEHISTORY=y -# CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set -# CONFIG_FEATURE_REVERSE_SEARCH is not set -CONFIG_FEATURE_TAB_COMPLETION=y -# CONFIG_FEATURE_USERNAME_COMPLETION is not set -CONFIG_FEATURE_EDITING_FANCY_PROMPT=y -CONFIG_FEATURE_EDITING_WINCH=y -# CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set -# CONFIG_LOCALE_SUPPORT is not set -# CONFIG_UNICODE_SUPPORT is not set -# CONFIG_UNICODE_USING_LOCALE is not set -# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set -CONFIG_SUBST_WCHAR=0 -CONFIG_LAST_SUPPORTED_WCHAR=0 -# CONFIG_UNICODE_COMBINING_WCHARS is not set -# CONFIG_UNICODE_WIDE_WCHARS is not set -# CONFIG_UNICODE_BIDI_SUPPORT is not set -# CONFIG_UNICODE_NEUTRAL_TABLE is not set -# CONFIG_UNICODE_PRESERVE_BROKEN is not set -CONFIG_FEATURE_NON_POSIX_CP=y -# CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set -# CONFIG_FEATURE_USE_SENDFILE is not set -CONFIG_FEATURE_COPYBUF_KB=4 -CONFIG_FEATURE_SKIP_ROOTFS=y -# CONFIG_MONOTONIC_SYSCALL is not set -CONFIG_IOCTL_HEX2STR_ERROR=y -# CONFIG_FEATURE_HWIB is not set - -# -# Applets -# - -# -# Archival Utilities -# -# CONFIG_FEATURE_SEAMLESS_XZ is not set -# CONFIG_FEATURE_SEAMLESS_LZMA is not set -CONFIG_FEATURE_SEAMLESS_BZ2=y -CONFIG_FEATURE_SEAMLESS_GZ=y -# CONFIG_FEATURE_SEAMLESS_Z is not set -# CONFIG_AR is not set -# CONFIG_FEATURE_AR_LONG_FILENAMES is not set -# CONFIG_FEATURE_AR_CREATE is not set -# CONFIG_UNCOMPRESS is not set -CONFIG_GUNZIP=y -CONFIG_ZCAT=y -CONFIG_FEATURE_GUNZIP_LONG_OPTIONS=y -# CONFIG_BUNZIP2 is not set -# CONFIG_BZCAT is not set -# CONFIG_UNLZMA is not set -# CONFIG_LZCAT is not set -# CONFIG_LZMA is not set -# CONFIG_UNXZ is not set -# CONFIG_XZCAT is not set -# CONFIG_XZ is not set -# CONFIG_BZIP2 is not set -CONFIG_BZIP2_SMALL=0 -# CONFIG_FEATURE_BZIP2_DECOMPRESS is not set -CONFIG_CPIO=y -CONFIG_FEATURE_CPIO_O=y -CONFIG_FEATURE_CPIO_P=y -# CONFIG_DPKG is not set -# CONFIG_DPKG_DEB is not set -CONFIG_GZIP=y -CONFIG_FEATURE_GZIP_LONG_OPTIONS=y -CONFIG_GZIP_FAST=0 -# CONFIG_FEATURE_GZIP_LEVELS is not set -CONFIG_FEATURE_GZIP_DECOMPRESS=y -# CONFIG_LZOP is not set -# CONFIG_UNLZOP is not set -# CONFIG_LZOPCAT is not set -# CONFIG_LZOP_COMPR_HIGH is not set -# CONFIG_RPM is not set -# CONFIG_RPM2CPIO is not set -CONFIG_TAR=y -CONFIG_FEATURE_TAR_LONG_OPTIONS=y -CONFIG_FEATURE_TAR_CREATE=y -CONFIG_FEATURE_TAR_AUTODETECT=y -CONFIG_FEATURE_TAR_FROM=y -CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY=y -CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY=y -CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y -CONFIG_FEATURE_TAR_TO_COMMAND=y -CONFIG_FEATURE_TAR_UNAME_GNAME=y -CONFIG_FEATURE_TAR_NOPRESERVE_TIME=y -# CONFIG_FEATURE_TAR_SELINUX is not set -# CONFIG_FEATURE_RTOS_TAR_RESTORE_PERMS is not set -CONFIG_UNZIP=y -CONFIG_FEATURE_UNZIP_CDF=y -# CONFIG_FEATURE_UNZIP_BZIP2 is not set -# CONFIG_FEATURE_UNZIP_LZMA is not set -# CONFIG_FEATURE_UNZIP_XZ is not set -# CONFIG_FEATURE_LZMA_FAST is not set - -# -# Coreutils -# -CONFIG_BASENAME=y -CONFIG_CAT=y -# CONFIG_FEATURE_CATN is not set -# CONFIG_FEATURE_CATV is not set -CONFIG_CHGRP=y -CONFIG_CHMOD=y -CONFIG_CHOWN=y -CONFIG_FEATURE_CHOWN_LONG_OPTIONS=y -CONFIG_CHROOT=y -# CONFIG_CKSUM is not set -CONFIG_COMM=y -CONFIG_CP=y -CONFIG_FEATURE_CP_LONG_OPTIONS=y -# CONFIG_FEATURE_CP_REFLINK is not set -CONFIG_CUT=y -CONFIG_DATE=y -CONFIG_FEATURE_DATE_ISOFMT=y -CONFIG_FEATURE_DATE_NANO=y -CONFIG_FEATURE_DATE_COMPAT=y -CONFIG_DD=y -CONFIG_FEATURE_DD_SIGNAL_HANDLING=y -CONFIG_FEATURE_DD_THIRD_STATUS_LINE=y -CONFIG_FEATURE_DD_IBS_OBS=y -CONFIG_FEATURE_DD_STATUS=y -CONFIG_DF=y -CONFIG_FEATURE_DF_FANCY=y -CONFIG_DIRNAME=y -# CONFIG_DOS2UNIX is not set -# CONFIG_UNIX2DOS is not set -CONFIG_DU=y -CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y -CONFIG_ECHO=y -CONFIG_FEATURE_FANCY_ECHO=y -CONFIG_ENV=y -CONFIG_EXPAND=y -# CONFIG_UNEXPAND is not set -CONFIG_EXPR=y -CONFIG_EXPR_MATH_SUPPORT_64=y -# CONFIG_FACTOR is not set -CONFIG_FALSE=y -# CONFIG_FOLD is not set -CONFIG_HEAD=y -CONFIG_FEATURE_FANCY_HEAD=y -CONFIG_HOSTID=y -CONFIG_ID=y -CONFIG_GROUPS=y -CONFIG_INSTALL=y -CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y -# CONFIG_LINK is not set -CONFIG_LN=y -CONFIG_LOGNAME=y -CONFIG_LS=y -CONFIG_FEATURE_LS_FILETYPES=y -CONFIG_FEATURE_LS_FOLLOWLINKS=y -CONFIG_FEATURE_LS_RECURSIVE=y -CONFIG_FEATURE_LS_WIDTH=y -CONFIG_FEATURE_LS_SORTFILES=y -CONFIG_FEATURE_LS_TIMESTAMPS=y -CONFIG_FEATURE_LS_USERNAME=y -CONFIG_FEATURE_LS_COLOR=y -CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y -CONFIG_MD5SUM=y -# CONFIG_SHA1SUM is not set -# CONFIG_SHA256SUM is not set -# CONFIG_SHA512SUM is not set -# CONFIG_SHA3SUM is not set - -# -# Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum -# -CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y -CONFIG_MKDIR=y -CONFIG_MKFIFO=y -CONFIG_MKNOD=y -CONFIG_MKTEMP=y -CONFIG_MV=y -CONFIG_NICE=y -# CONFIG_NL is not set -CONFIG_NOHUP=y -# CONFIG_NPROC is not set -CONFIG_OD=y -# CONFIG_PASTE is not set -CONFIG_PRINTENV=y -CONFIG_PRINTF=y -CONFIG_PWD=y -CONFIG_READLINK=y -CONFIG_FEATURE_READLINK_FOLLOW=y -# CONFIG_REALPATH is not set -CONFIG_RM=y -CONFIG_RMDIR=y -CONFIG_SEQ=y -# CONFIG_SHRED is not set -# CONFIG_SHUF is not set -CONFIG_SLEEP=y -CONFIG_FEATURE_FANCY_SLEEP=y -CONFIG_SORT=y -CONFIG_FEATURE_SORT_BIG=y -# CONFIG_FEATURE_SORT_OPTIMIZE_MEMORY is not set -# CONFIG_SPLIT is not set -# CONFIG_FEATURE_SPLIT_FANCY is not set -CONFIG_STAT=y -CONFIG_FEATURE_STAT_FORMAT=y -CONFIG_FEATURE_STAT_FILESYSTEM=y -CONFIG_STTY=y -CONFIG_SUM=y -CONFIG_SYNC=y -# CONFIG_FEATURE_SYNC_FANCY is not set -CONFIG_FSYNC=y -# CONFIG_TAC is not set -CONFIG_TAIL=y -CONFIG_FEATURE_FANCY_TAIL=y -CONFIG_TEE=y -CONFIG_FEATURE_TEE_USE_BLOCK_IO=y -CONFIG_TEST=y -CONFIG_TEST1=y -CONFIG_TEST2=y -CONFIG_FEATURE_TEST_64=y -CONFIG_TIMEOUT=y -CONFIG_TOUCH=y -CONFIG_FEATURE_TOUCH_NODEREF=y -# CONFIG_FEATURE_TOUCH_SUSV3 is not set -CONFIG_TR=y -CONFIG_FEATURE_TR_CLASSES=y -CONFIG_FEATURE_TR_EQUIV=y -CONFIG_TRUE=y -# CONFIG_TRUNCATE is not set -CONFIG_TTY=y -CONFIG_UNAME=y -CONFIG_UNAME_OSNAME="GNU/Linux" -# CONFIG_BB_ARCH is not set -CONFIG_UNIQ=y -# CONFIG_UNLINK is not set -CONFIG_USLEEP=y -# CONFIG_UUDECODE is not set -CONFIG_BASE64=y -# CONFIG_UUENCODE is not set -CONFIG_WC=y -CONFIG_FEATURE_WC_LARGE=y -CONFIG_WHO=y -# CONFIG_W is not set -CONFIG_USERS=y -CONFIG_WHOAMI=y -CONFIG_YES=y - -# -# Common options -# -CONFIG_FEATURE_VERBOSE=y - -# -# Common options for cp and mv -# -CONFIG_FEATURE_PRESERVE_HARDLINKS=y - -# -# Common options for df, du, ls -# -CONFIG_FEATURE_HUMAN_READABLE=y - -# -# Console Utilities -# -# CONFIG_CHVT is not set -CONFIG_CLEAR=y -CONFIG_DEALLOCVT=y -# CONFIG_DUMPKMAP is not set -# CONFIG_FGCONSOLE is not set -# CONFIG_KBD_MODE is not set -# CONFIG_LOADFONT is not set -# CONFIG_SETFONT is not set -# CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set -CONFIG_DEFAULT_SETFONT_DIR="" -# CONFIG_FEATURE_LOADFONT_PSF2 is not set -# CONFIG_FEATURE_LOADFONT_RAW is not set -CONFIG_LOADKMAP=y -# CONFIG_OPENVT is not set -CONFIG_RESET=y -CONFIG_RESIZE=y -CONFIG_FEATURE_RESIZE_PRINT=y -CONFIG_SETCONSOLE=y -CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS=y -# CONFIG_SETKEYCODES is not set -# CONFIG_SETLOGCONS is not set -# CONFIG_SHOWKEY is not set - -# -# Debian Utilities -# -# CONFIG_PIPE_PROGRESS is not set -# CONFIG_RUN_PARTS is not set -# CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS is not set -# CONFIG_FEATURE_RUN_PARTS_FANCY is not set -CONFIG_START_STOP_DAEMON=y -CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y -CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y -CONFIG_WHICH=y - -# -# klibc-utils -# -# CONFIG_MINIPS is not set -# CONFIG_NUKE is not set -# CONFIG_RESUME is not set -# CONFIG_RUN_INIT is not set - -# -# Editors -# -CONFIG_AWK=y -CONFIG_FEATURE_AWK_LIBM=y -CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y -CONFIG_CMP=y -CONFIG_DIFF=y -CONFIG_FEATURE_DIFF_LONG_OPTIONS=y -CONFIG_FEATURE_DIFF_DIR=y -CONFIG_ED=y -# CONFIG_PATCH is not set -CONFIG_SED=y -CONFIG_VI=y -CONFIG_FEATURE_VI_MAX_LEN=4096 -# CONFIG_FEATURE_VI_8BIT is not set -CONFIG_FEATURE_VI_COLON=y -CONFIG_FEATURE_VI_YANKMARK=y -CONFIG_FEATURE_VI_SEARCH=y -# CONFIG_FEATURE_VI_REGEX_SEARCH is not set -CONFIG_FEATURE_VI_USE_SIGNALS=y -CONFIG_FEATURE_VI_DOT_CMD=y -CONFIG_FEATURE_VI_READONLY=y -CONFIG_FEATURE_VI_SETOPTS=y -CONFIG_FEATURE_VI_SET=y -CONFIG_FEATURE_VI_WIN_RESIZE=y -CONFIG_FEATURE_VI_ASK_TERMINAL=y -CONFIG_FEATURE_VI_UNDO=y -CONFIG_FEATURE_VI_UNDO_QUEUE=y -CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=256 -# CONFIG_FEATURE_ALLOW_EXEC is not set - -# -# Finding Utilities -# -CONFIG_FIND=y -CONFIG_FEATURE_FIND_PRINT0=y -CONFIG_FEATURE_FIND_MTIME=y -CONFIG_FEATURE_FIND_MMIN=y -CONFIG_FEATURE_FIND_PERM=y -CONFIG_FEATURE_FIND_TYPE=y -# CONFIG_FEATURE_FIND_EXECUTABLE is not set -CONFIG_FEATURE_FIND_XDEV=y -CONFIG_FEATURE_FIND_MAXDEPTH=y -CONFIG_FEATURE_FIND_NEWER=y -CONFIG_FEATURE_FIND_INUM=y -CONFIG_FEATURE_FIND_EXEC=y -CONFIG_FEATURE_FIND_EXEC_PLUS=y -CONFIG_FEATURE_FIND_USER=y -CONFIG_FEATURE_FIND_GROUP=y -CONFIG_FEATURE_FIND_NOT=y -CONFIG_FEATURE_FIND_DEPTH=y -CONFIG_FEATURE_FIND_PAREN=y -CONFIG_FEATURE_FIND_SIZE=y -CONFIG_FEATURE_FIND_PRUNE=y -# CONFIG_FEATURE_FIND_QUIT is not set -CONFIG_FEATURE_FIND_DELETE=y -# CONFIG_FEATURE_FIND_EMPTY is not set -CONFIG_FEATURE_FIND_PATH=y -CONFIG_FEATURE_FIND_REGEX=y -# CONFIG_FEATURE_FIND_CONTEXT is not set -CONFIG_FEATURE_FIND_LINKS=y -CONFIG_GREP=y -CONFIG_EGREP=y -CONFIG_FGREP=y -CONFIG_FEATURE_GREP_CONTEXT=y -CONFIG_XARGS=y -CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y -CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y -CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y -CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y -CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR=y -CONFIG_FEATURE_XARGS_SUPPORT_PARALLEL=y -CONFIG_FEATURE_XARGS_SUPPORT_ARGS_FILE=y - -# -# Init Utilities -# -# CONFIG_BOOTCHARTD is not set -# CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set -# CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE is not set -CONFIG_HALT=y -CONFIG_POWEROFF=y -CONFIG_REBOOT=y -# CONFIG_FEATURE_WAIT_FOR_INIT is not set -# CONFIG_FEATURE_CALL_TELINIT is not set -CONFIG_TELINIT_PATH="" -CONFIG_INIT=y -CONFIG_LINUXRC=y -CONFIG_FEATURE_USE_INITTAB=y -CONFIG_FEATURE_KILL_REMOVED=y -CONFIG_FEATURE_KILL_DELAY=0 -CONFIG_FEATURE_INIT_SCTTY=y -# CONFIG_FEATURE_INIT_SYSLOG is not set -CONFIG_FEATURE_INIT_QUIET=y -CONFIG_FEATURE_INIT_COREDUMPS=y -CONFIG_INIT_TERMINAL_TYPE="linux" -CONFIG_FEATURE_INIT_MODIFY_CMDLINE=y -# CONFIG_FEATURE_RTOS_SUPPORT_KEXEC is not set - -# -# Login/Password Management Utilities -# -CONFIG_FEATURE_SHADOWPASSWDS=y -# CONFIG_USE_BB_PWD_GRP is not set -# CONFIG_USE_BB_SHADOW is not set -# CONFIG_USE_BB_CRYPT is not set -# CONFIG_USE_BB_CRYPT_SHA is not set -# CONFIG_ADD_SHELL is not set -# CONFIG_REMOVE_SHELL is not set -# CONFIG_ADDGROUP is not set -# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set -# CONFIG_ADDUSER is not set -# CONFIG_FEATURE_CHECK_NAMES is not set -CONFIG_LAST_ID=0 -CONFIG_FIRST_SYSTEM_ID=0 -CONFIG_LAST_SYSTEM_ID=0 -# CONFIG_CHPASSWD is not set -CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="" -# CONFIG_CRYPTPW is not set -# CONFIG_MKPASSWD is not set -# CONFIG_DELUSER is not set -# CONFIG_DELGROUP is not set -# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set -CONFIG_GETTY=y -# CONFIG_LOGIN is not set -# CONFIG_LOGIN_SESSION_AS_CHILD is not set -# CONFIG_LOGIN_SCRIPTS is not set -# CONFIG_FEATURE_NOLOGIN is not set -# CONFIG_FEATURE_SECURETTY is not set -# CONFIG_PASSWD is not set -# CONFIG_FEATURE_PASSWD_WEAK_CHECK is not set -# CONFIG_SU is not set -# CONFIG_FEATURE_SU_SYSLOG is not set -# CONFIG_FEATURE_SU_CHECKS_SHELLS is not set -# CONFIG_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set -# CONFIG_SULOGIN is not set -# CONFIG_VLOCK is not set - -# -# Linux Ext2 FS Progs -# -CONFIG_CHATTR=y -CONFIG_FSCK=y -CONFIG_LSATTR=y -# CONFIG_TUNE2FS is not set - -# -# Linux Module Utilities -# -# CONFIG_MODPROBE_SMALL is not set -CONFIG_DEPMOD=y -CONFIG_INSMOD=y -CONFIG_LSMOD=y -# CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set -CONFIG_MODINFO=y -CONFIG_MODPROBE=y -# CONFIG_FEATURE_MODPROBE_BLACKLIST is not set -CONFIG_RMMOD=y - -# -# Options common to multiple modutils -# -CONFIG_FEATURE_CMDLINE_MODULE_OPTIONS=y -# CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set -# CONFIG_FEATURE_2_4_MODULES is not set -# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set -# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set -# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set -# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set -# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set -# CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set -# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set -# CONFIG_FEATURE_MODUTILS_ALIAS is not set -# CONFIG_FEATURE_MODUTILS_SYMBOLS is not set -CONFIG_DEFAULT_MODULES_DIR="/lib/modules" -CONFIG_DEFAULT_DEPMOD_FILE="modules.dep" -# CONFIG_FEATURE_MODINFO_SHOW_PKCS7_SIGNATURE is not set - -# -# Linux System Utilities -# -# CONFIG_ACPID is not set -# CONFIG_FEATURE_ACPID_COMPAT is not set -# CONFIG_BLKDISCARD is not set -CONFIG_BLKID=y -CONFIG_FEATURE_BLKID_TYPE=y -CONFIG_BLOCKDEV=y -CONFIG_CAL=y -CONFIG_CHRT=y -CONFIG_DMESG=y -CONFIG_FEATURE_DMESG_PRETTY=y -# CONFIG_EJECT is not set -# CONFIG_FEATURE_EJECT_SCSI is not set -# CONFIG_FALLOCATE is not set -# CONFIG_FATATTR is not set -# CONFIG_FBSET is not set -# CONFIG_FEATURE_FBSET_FANCY is not set -# CONFIG_FEATURE_FBSET_READMODE is not set -# CONFIG_FDFORMAT is not set -CONFIG_FDISK=y -# CONFIG_FDISK_SUPPORT_LARGE_DISKS is not set -CONFIG_FEATURE_FDISK_WRITABLE=y -CONFIG_FEATURE_AIX_LABEL=y -CONFIG_FEATURE_SGI_LABEL=y -CONFIG_FEATURE_SUN_LABEL=y -CONFIG_FEATURE_OSF_LABEL=y -CONFIG_FEATURE_GPT_LABEL=y -CONFIG_FEATURE_FDISK_ADVANCED=y -# CONFIG_FDISK_SUPPORT_NOINTERACTIVE_OPTIONS is not set -CONFIG_FINDFS=y -CONFIG_FLOCK=y -# CONFIG_FDFLUSH is not set -CONFIG_FREERAMDISK=y -CONFIG_FSCK_MINIX=y -# CONFIG_FSFREEZE is not set -# CONFIG_FSTRIM is not set -CONFIG_GETOPT=y -# CONFIG_FEATURE_GETOPT_LONG is not set -CONFIG_HEXDUMP=y -CONFIG_FEATURE_HEXDUMP_REVERSE=y -CONFIG_HD=y -# CONFIG_XXD is not set -CONFIG_HWCLOCK=y -CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS=y -# CONFIG_IONICE is not set -CONFIG_IPCRM=y -CONFIG_IPCS=y -CONFIG_LAST=y -# CONFIG_FEATURE_LAST_FANCY is not set -CONFIG_LOSETUP=y -CONFIG_LSPCI=y -# CONFIG_LSUSB is not set -CONFIG_MDEV=y -CONFIG_FEATURE_MDEV_CONF=y -CONFIG_FEATURE_MDEV_RENAME=y -CONFIG_FEATURE_MDEV_RENAME_REGEXP=y -CONFIG_FEATURE_MDEV_EXEC=y -CONFIG_FEATURE_MDEV_LOAD_FIRMWARE=y -# CONFIG_FEATURE_MDEV_DAEMON is not set -CONFIG_MESG=y -CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y -# CONFIG_MKE2FS is not set -# CONFIG_MKFS_EXT2 is not set -# CONFIG_MKFS_MINIX is not set -CONFIG_FEATURE_MINIX2=y -# CONFIG_MKFS_REISER is not set -CONFIG_MKDOSFS=y -CONFIG_MKFS_VFAT=y -# CONFIG_MKSWAP is not set -# CONFIG_FEATURE_MKSWAP_UUID is not set -CONFIG_MORE=y -CONFIG_MOUNT=y -CONFIG_FEATURE_MOUNT_FAKE=y -CONFIG_FEATURE_MOUNT_VERBOSE=y -# CONFIG_FEATURE_MOUNT_HELPERS is not set -CONFIG_FEATURE_MOUNT_LABEL=y -CONFIG_FEATURE_MOUNT_NFS=y -CONFIG_FEATURE_MOUNT_CIFS=y -CONFIG_FEATURE_MOUNT_FLAGS=y -CONFIG_FEATURE_MOUNT_FSTAB=y -CONFIG_FEATURE_MOUNT_OTHERTAB=y -CONFIG_MOUNTPOINT=y -# CONFIG_NOLOGIN is not set -# CONFIG_NOLOGIN_DEPENDENCIES is not set -# CONFIG_NSENTER is not set -CONFIG_PIVOT_ROOT=y -# CONFIG_RDATE is not set -# CONFIG_RDEV is not set -CONFIG_READPROFILE=y -CONFIG_RENICE=y -CONFIG_REV=y -# CONFIG_RTCWAKE is not set -CONFIG_SCRIPT=y -# CONFIG_SCRIPTREPLAY is not set -# CONFIG_SETARCH is not set -# CONFIG_LINUX32 is not set -# CONFIG_LINUX64 is not set -# CONFIG_SETPRIV is not set -# CONFIG_FEATURE_SETPRIV_DUMP is not set -# CONFIG_FEATURE_SETPRIV_CAPABILITIES is not set -# CONFIG_FEATURE_SETPRIV_CAPABILITY_NAMES is not set -CONFIG_SETSID=y -CONFIG_SWAPON=y -CONFIG_FEATURE_SWAPON_DISCARD=y -CONFIG_FEATURE_SWAPON_PRI=y -CONFIG_SWAPOFF=y -CONFIG_FEATURE_SWAPONOFF_LABEL=y -CONFIG_SWITCH_ROOT=y -CONFIG_TASKSET=y -CONFIG_FEATURE_TASKSET_FANCY=y -# CONFIG_FEATURE_TASKSET_CPULIST is not set -# CONFIG_UEVENT is not set -CONFIG_UMOUNT=y -CONFIG_FEATURE_UMOUNT_ALL=y -# CONFIG_UNSHARE is not set -# CONFIG_WALL is not set - -# -# Common options for mount/umount -# -CONFIG_FEATURE_MOUNT_LOOP=y -CONFIG_FEATURE_MOUNT_LOOP_CREATE=y -# CONFIG_FEATURE_MTAB_SUPPORT is not set -CONFIG_VOLUMEID=y - -# -# Filesystem/Volume identification -# -CONFIG_FEATURE_VOLUMEID_BCACHE=y -# CONFIG_FEATURE_VOLUMEID_BTRFS is not set -# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set -# CONFIG_FEATURE_VOLUMEID_EXFAT is not set -# CONFIG_FEATURE_VOLUMEID_EXT is not set -CONFIG_FEATURE_VOLUMEID_F2FS=y -# CONFIG_FEATURE_VOLUMEID_FAT is not set -# CONFIG_FEATURE_VOLUMEID_HFS is not set -# CONFIG_FEATURE_VOLUMEID_ISO9660 is not set -# CONFIG_FEATURE_VOLUMEID_JFS is not set -CONFIG_FEATURE_VOLUMEID_LFS=y -# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set -# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set -# CONFIG_FEATURE_VOLUMEID_LUKS is not set -CONFIG_FEATURE_VOLUMEID_MINIX=y -# CONFIG_FEATURE_VOLUMEID_NILFS is not set -# CONFIG_FEATURE_VOLUMEID_NTFS is not set -# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set -# CONFIG_FEATURE_VOLUMEID_REISERFS is not set -# CONFIG_FEATURE_VOLUMEID_ROMFS is not set -CONFIG_FEATURE_VOLUMEID_SQUASHFS=y -# CONFIG_FEATURE_VOLUMEID_SYSV is not set -CONFIG_FEATURE_VOLUMEID_UBIFS=y -# CONFIG_FEATURE_VOLUMEID_UDF is not set -# CONFIG_FEATURE_VOLUMEID_XFS is not set - -# -# Miscellaneous Utilities -# -CONFIG_ADJTIMEX=y -# CONFIG_BBCONFIG is not set -# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set -# CONFIG_BC is not set -# CONFIG_DC is not set -# CONFIG_FEATURE_DC_BIG is not set -# CONFIG_FEATURE_DC_LIBM is not set -# CONFIG_FEATURE_BC_INTERACTIVE is not set -# CONFIG_FEATURE_BC_LONG_OPTIONS is not set -# CONFIG_BEEP is not set -CONFIG_FEATURE_BEEP_FREQ=0 -CONFIG_FEATURE_BEEP_LENGTH_MS=0 -# CONFIG_CHAT is not set -# CONFIG_FEATURE_CHAT_NOFAIL is not set -# CONFIG_FEATURE_CHAT_TTY_HIFI is not set -# CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set -# CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set -# CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set -# CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set -# CONFIG_FEATURE_CHAT_CLR_ABORT is not set -# CONFIG_CONSPY is not set -CONFIG_CROND=y -CONFIG_FEATURE_CROND_D=y -CONFIG_FEATURE_CROND_CALL_SENDMAIL=y -CONFIG_FEATURE_CROND_SPECIAL_TIMES=y -CONFIG_FEATURE_CROND_DIR="/var/spool/cron" -CONFIG_CRONTAB=y -# CONFIG_DEVFSD is not set -# CONFIG_DEVFSD_MODLOAD is not set -# CONFIG_DEVFSD_FG_NP is not set -# CONFIG_DEVFSD_VERBOSE is not set -# CONFIG_FEATURE_DEVFS is not set -# CONFIG_DEVMEM is not set -# CONFIG_FBSPLASH is not set -CONFIG_FLASH_ERASEALL=y -CONFIG_FLASH_LOCK=y -CONFIG_FLASH_UNLOCK=y -CONFIG_FLASHCP=y -# CONFIG_HDPARM is not set -# CONFIG_FEATURE_HDPARM_GET_IDENTITY is not set -# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set -# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set -# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set -# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set -# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set -# CONFIG_HEXEDIT is not set -# CONFIG_I2CGET is not set -# CONFIG_I2CSET is not set -# CONFIG_I2CDUMP is not set -# CONFIG_I2CDETECT is not set -# CONFIG_I2CTRANSFER is not set -# CONFIG_INOTIFYD is not set -CONFIG_LESS=y -CONFIG_FEATURE_LESS_MAXLINES=9999999 -CONFIG_FEATURE_LESS_BRACKETS=y -CONFIG_FEATURE_LESS_FLAGS=y -CONFIG_FEATURE_LESS_TRUNCATE=y -CONFIG_FEATURE_LESS_MARKS=y -CONFIG_FEATURE_LESS_REGEXP=y -CONFIG_FEATURE_LESS_WINCH=y -# CONFIG_FEATURE_LESS_ASK_TERMINAL is not set -CONFIG_FEATURE_LESS_DASHCMD=y -CONFIG_FEATURE_LESS_LINENUMS=y -CONFIG_FEATURE_LESS_RAW=y -CONFIG_FEATURE_LESS_ENV=y -# CONFIG_LSSCSI is not set -CONFIG_MAKEDEVS=y -# CONFIG_FEATURE_MAKEDEVS_LEAF is not set -CONFIG_FEATURE_MAKEDEVS_TABLE=y -# CONFIG_MAN is not set -# CONFIG_MICROCOM is not set -# CONFIG_MIM is not set -# CONFIG_MT is not set -CONFIG_NANDWRITE=y -CONFIG_NANDDUMP=y -# CONFIG_PARTPROBE is not set -# CONFIG_RAIDAUTORUN is not set -# CONFIG_READAHEAD is not set -# CONFIG_RFKILL is not set -CONFIG_RUNLEVEL=y -CONFIG_RX=y -# CONFIG_SETFATTR is not set -# CONFIG_SETSERIAL is not set -CONFIG_STRINGS=y -CONFIG_TIME=y -# CONFIG_TS is not set -CONFIG_TTYSIZE=y -# CONFIG_UBIATTACH is not set -# CONFIG_UBIDETACH is not set -# CONFIG_UBIMKVOL is not set -# CONFIG_UBIRMVOL is not set -# CONFIG_UBIRSVOL is not set -# CONFIG_UBIUPDATEVOL is not set -# CONFIG_UBIRENAME is not set -# CONFIG_VOLNAME is not set -# CONFIG_WATCHDOG is not set - -# -# Networking Utilities -# -CONFIG_FEATURE_IPV6=y -# CONFIG_FEATURE_UNIX_LOCAL is not set -CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y -# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set -# CONFIG_FEATURE_TLS_SHA1 is not set -CONFIG_ARP=y -CONFIG_ARPING=y -# CONFIG_BRCTL is not set -# CONFIG_FEATURE_BRCTL_FANCY is not set -# CONFIG_FEATURE_BRCTL_SHOW is not set -# CONFIG_DNSD is not set -# CONFIG_ETHER_WAKE is not set -# CONFIG_FTPD is not set -# CONFIG_FEATURE_FTPD_WRITE is not set -# CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set -# CONFIG_FEATURE_FTPD_AUTHENTICATION is not set -# CONFIG_FTPGET is not set -# CONFIG_FTPPUT is not set -# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set -# CONFIG_FEATURE_RTOS_FTP_TIMEOUT is not set -CONFIG_HOSTNAME=y -CONFIG_DNSDOMAINNAME=y -# CONFIG_HTTPD is not set -# CONFIG_FEATURE_HTTPD_RANGES is not set -# CONFIG_FEATURE_HTTPD_SETUID is not set -# CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set -# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set -# CONFIG_FEATURE_HTTPD_CGI is not set -# CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set -# CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set -# CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set -# CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set -# CONFIG_FEATURE_HTTPD_PROXY is not set -# CONFIG_FEATURE_HTTPD_GZIP is not set -CONFIG_IFCONFIG=y -CONFIG_FEATURE_IFCONFIG_STATUS=y -CONFIG_FEATURE_IFCONFIG_SLIP=y -CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y -CONFIG_FEATURE_IFCONFIG_HW=y -CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y -CONFIG_IFENSLAVE=y -CONFIG_IFPLUGD=y -CONFIG_IFUP=y -CONFIG_IFDOWN=y -CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" -# CONFIG_FEATURE_IFUPDOWN_IP is not set -CONFIG_FEATURE_IFUPDOWN_IPV4=y -CONFIG_FEATURE_IFUPDOWN_IPV6=y -CONFIG_FEATURE_IFUPDOWN_MAPPING=y -# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set -# CONFIG_INETD is not set -# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set -# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set -# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set -# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set -# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set -# CONFIG_FEATURE_INETD_RPC is not set -CONFIG_IP=y -CONFIG_IPADDR=y -CONFIG_IPLINK=y -CONFIG_IPROUTE=y -CONFIG_IPTUNNEL=y -CONFIG_IPRULE=y -# CONFIG_IPNEIGH is not set -CONFIG_FEATURE_IP_ADDRESS=y -CONFIG_FEATURE_IP_LINK=y -CONFIG_FEATURE_IP_ROUTE=y -CONFIG_FEATURE_IP_ROUTE_DIR="/etc/iproute2" -CONFIG_FEATURE_IP_TUNNEL=y -CONFIG_FEATURE_IP_RULE=y -CONFIG_FEATURE_IP_NEIGH=y -# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set -# CONFIG_IPCALC is not set -# CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set -# CONFIG_FEATURE_IPCALC_FANCY is not set -# CONFIG_FAKEIDENTD is not set -# CONFIG_NAMEIF is not set -# CONFIG_FEATURE_NAMEIF_EXTENDED is not set -# CONFIG_NBDCLIENT is not set -# CONFIG_NC is not set -# CONFIG_NETCAT is not set -# CONFIG_NC_SERVER is not set -# CONFIG_NC_EXTRA is not set -# CONFIG_NC_110_COMPAT is not set -CONFIG_NETSTAT=y -CONFIG_FEATURE_NETSTAT_WIDE=y -CONFIG_FEATURE_NETSTAT_PRG=y -# CONFIG_NSLOOKUP is not set -# CONFIG_FEATURE_NSLOOKUP_BIG is not set -# CONFIG_FEATURE_NSLOOKUP_LONG_OPTIONS is not set -# CONFIG_NTPD is not set -# CONFIG_FEATURE_NTPD_SERVER is not set -# CONFIG_FEATURE_NTPD_CONF is not set -# CONFIG_FEATURE_NTP_AUTH is not set -CONFIG_PING=y -CONFIG_PING6=y -CONFIG_FEATURE_FANCY_PING=y -# CONFIG_PSCAN is not set -CONFIG_ROUTE=y -# CONFIG_SLATTACH is not set -# CONFIG_SSL_CLIENT is not set -# CONFIG_TC is not set -# CONFIG_FEATURE_TC_INGRESS is not set -CONFIG_TCPSVD=y -# CONFIG_UDPSVD is not set -# CONFIG_TELNET is not set -# CONFIG_FEATURE_TELNET_TTYPE is not set -# CONFIG_FEATURE_TELNET_AUTOLOGIN is not set -# CONFIG_FEATURE_TELNET_WIDTH is not set -# CONFIG_TELNETD is not set -# CONFIG_FEATURE_TELNETD_STANDALONE is not set -# CONFIG_FEATURE_TELNETD_INETD_WAIT is not set -# CONFIG_TFTP is not set -# CONFIG_FEATURE_TFTP_PROGRESS_BAR is not set -# CONFIG_FEATURE_TFTP_HPA_COMPAT is not set -# CONFIG_TFTPD is not set -# CONFIG_FEATURE_TFTP_GET is not set -# CONFIG_FEATURE_TFTP_PUT is not set -# CONFIG_FEATURE_TFTP_BLOCKSIZE is not set -# CONFIG_TFTP_DEBUG is not set -# CONFIG_TLS is not set -# CONFIG_TRACEROUTE is not set -# CONFIG_TRACEROUTE6 is not set -# CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set -# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set -# CONFIG_TUNCTL is not set -# CONFIG_FEATURE_TUNCTL_UG is not set -CONFIG_VCONFIG=y -# CONFIG_WGET is not set -# CONFIG_FEATURE_WGET_LONG_OPTIONS is not set -# CONFIG_FEATURE_WGET_STATUSBAR is not set -# CONFIG_FEATURE_WGET_AUTHENTICATION is not set -# CONFIG_FEATURE_WGET_TIMEOUT is not set -# CONFIG_FEATURE_WGET_HTTPS is not set -# CONFIG_FEATURE_WGET_OPENSSL is not set -# CONFIG_WHOIS is not set -# CONFIG_ZCIP is not set -# CONFIG_UDHCPD is not set -# CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set -# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set -CONFIG_DHCPD_LEASES_FILE="" -# CONFIG_DUMPLEASES is not set -# CONFIG_DHCPRELAY is not set -CONFIG_UDHCPC=y -CONFIG_FEATURE_UDHCPC_ARPING=y -CONFIG_FEATURE_UDHCPC_SANITIZEOPT=y -CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" -# CONFIG_UDHCPC6 is not set -# CONFIG_FEATURE_UDHCPC6_RFC3646 is not set -# CONFIG_FEATURE_UDHCPC6_RFC4704 is not set -# CONFIG_FEATURE_UDHCPC6_RFC4833 is not set -# CONFIG_FEATURE_UDHCPC6_RFC5970 is not set - -# -# Common options for DHCP applets -# -CONFIG_FEATURE_UDHCP_PORT=y -CONFIG_UDHCP_DEBUG=9 -CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 -CONFIG_FEATURE_UDHCP_RFC3397=y -# CONFIG_FEATURE_UDHCP_8021Q is not set -CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n" - -# -# Print Utilities -# -# CONFIG_LPD is not set -# CONFIG_LPR is not set -# CONFIG_LPQ is not set - -# -# Mail Utilities -# -# CONFIG_MAKEMIME is not set -# CONFIG_POPMAILDIR is not set -# CONFIG_FEATURE_POPMAILDIR_DELIVERY is not set -# CONFIG_REFORMIME is not set -# CONFIG_FEATURE_REFORMIME_COMPAT is not set -# CONFIG_SENDMAIL is not set -CONFIG_FEATURE_MIME_CHARSET="" - -# -# Process Utilities -# -CONFIG_FREE=y -CONFIG_FUSER=y -CONFIG_IOSTAT=y -CONFIG_KILL=y -CONFIG_KILLALL=y -CONFIG_KILLALL5=y -CONFIG_LSOF=y -CONFIG_MPSTAT=y -# CONFIG_NMETER is not set -# CONFIG_PGREP is not set -CONFIG_PKILL=y -CONFIG_PIDOF=y -CONFIG_FEATURE_PIDOF_SINGLE=y -CONFIG_FEATURE_PIDOF_OMIT=y -# CONFIG_PMAP is not set -# CONFIG_POWERTOP is not set -# CONFIG_FEATURE_POWERTOP_INTERACTIVE is not set -CONFIG_PS=y -CONFIG_FEATURE_PS_WIDE=y -# CONFIG_FEATURE_PS_LONG is not set -# CONFIG_FEATURE_PS_TIME is not set -# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set -# CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS is not set -# CONFIG_PSTREE is not set -# CONFIG_PWDX is not set -# CONFIG_SMEMCAP is not set -CONFIG_BB_SYSCTL=y -CONFIG_TOP=y -CONFIG_FEATURE_TOP_INTERACTIVE=y -CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y -CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y -# CONFIG_FEATURE_TOP_SMP_CPU is not set -# CONFIG_FEATURE_TOP_DECIMALS is not set -# CONFIG_FEATURE_TOP_SMP_PROCESS is not set -# CONFIG_FEATURE_TOPMEM is not set -CONFIG_UPTIME=y -CONFIG_FEATURE_UPTIME_UTMP_SUPPORT=y -# CONFIG_WATCH is not set -CONFIG_FEATURE_SHOW_THREADS=y -CONFIG_RTOS_FIX_CPUTIME_OVERFLOW=y - -# -# Runit Utilities -# -# CONFIG_CHPST is not set -# CONFIG_SETUIDGID is not set -# CONFIG_ENVUIDGID is not set -# CONFIG_ENVDIR is not set -# CONFIG_SOFTLIMIT is not set -# CONFIG_RUNSV is not set -# CONFIG_RUNSVDIR is not set -# CONFIG_FEATURE_RUNSVDIR_LOG is not set -# CONFIG_SV is not set -CONFIG_SV_DEFAULT_SERVICE_DIR="" -# CONFIG_SVC is not set -# CONFIG_SVOK is not set -# CONFIG_SVLOGD is not set -# CONFIG_CHCON is not set -# CONFIG_GETENFORCE is not set -# CONFIG_GETSEBOOL is not set -# CONFIG_LOAD_POLICY is not set -# CONFIG_MATCHPATHCON is not set -# CONFIG_RUNCON is not set -# CONFIG_SELINUXENABLED is not set -# CONFIG_SESTATUS is not set -# CONFIG_SETENFORCE is not set -# CONFIG_SETFILES is not set -# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set -# CONFIG_RESTORECON is not set -# CONFIG_SETSEBOOL is not set - -# -# Shells -# -CONFIG_SH_IS_ASH=y -# CONFIG_SH_IS_HUSH is not set -# CONFIG_SH_IS_NONE is not set -CONFIG_BASH_IS_ASH=y -# CONFIG_BASH_IS_HUSH is not set -# CONFIG_BASH_IS_NONE is not set -CONFIG_SHELL_ASH=y -CONFIG_ASH=y -CONFIG_ASH_OPTIMIZE_FOR_SIZE=y -CONFIG_ASH_INTERNAL_GLOB=y -CONFIG_ASH_BASH_COMPAT=y -CONFIG_ASH_BASH_SOURCE_CURDIR=y -CONFIG_ASH_BASH_NOT_FOUND_HOOK=y -CONFIG_ASH_JOB_CONTROL=y -CONFIG_ASH_ALIAS=y -CONFIG_ASH_RANDOM_SUPPORT=y -CONFIG_ASH_EXPAND_PRMT=y -CONFIG_ASH_IDLE_TIMEOUT=y -# CONFIG_ASH_MAIL is not set -CONFIG_ASH_ECHO=y -CONFIG_ASH_PRINTF=y -CONFIG_ASH_TEST=y -CONFIG_ASH_HELP=y -CONFIG_ASH_GETOPTS=y -CONFIG_ASH_CMDCMD=y -CONFIG_CTTYHACK=y -CONFIG_HUSH=y -CONFIG_SHELL_HUSH=y -CONFIG_HUSH_BASH_COMPAT=y -CONFIG_HUSH_BRACE_EXPANSION=y -CONFIG_HUSH_LINENO_VAR=y -CONFIG_HUSH_BASH_SOURCE_CURDIR=y -CONFIG_HUSH_INTERACTIVE=y -CONFIG_HUSH_SAVEHISTORY=y -CONFIG_HUSH_JOB=y -CONFIG_HUSH_TICK=y -CONFIG_HUSH_IF=y -CONFIG_HUSH_LOOPS=y -CONFIG_HUSH_CASE=y -CONFIG_HUSH_FUNCTIONS=y -CONFIG_HUSH_LOCAL=y -CONFIG_HUSH_RANDOM_SUPPORT=y -CONFIG_HUSH_MODE_X=y -CONFIG_HUSH_ECHO=y -CONFIG_HUSH_PRINTF=y -CONFIG_HUSH_TEST=y -CONFIG_HUSH_HELP=y -CONFIG_HUSH_EXPORT=y -CONFIG_HUSH_EXPORT_N=y -CONFIG_HUSH_READONLY=y -CONFIG_HUSH_KILL=y -CONFIG_HUSH_WAIT=y -CONFIG_HUSH_COMMAND=y -CONFIG_HUSH_TRAP=y -CONFIG_HUSH_TYPE=y -CONFIG_HUSH_TIMES=y -CONFIG_HUSH_READ=y -CONFIG_HUSH_SET=y -CONFIG_HUSH_UNSET=y -CONFIG_HUSH_ULIMIT=y -CONFIG_HUSH_UMASK=y -CONFIG_HUSH_GETOPTS=y -# CONFIG_HUSH_MEMLEAK is not set - -# -# Options common to all shells -# -CONFIG_FEATURE_SH_MATH=y -CONFIG_FEATURE_SH_MATH_64=y -# CONFIG_FEATURE_SH_MATH_BASE is not set -CONFIG_FEATURE_SH_EXTRA_QUIET=y -# CONFIG_FEATURE_SH_STANDALONE is not set -# CONFIG_FEATURE_SH_NOFORK is not set -CONFIG_FEATURE_SH_READ_FRAC=y -# CONFIG_FEATURE_SH_HISTFILESIZE is not set -# CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS is not set - -# -# System Logging Utilities -# -CONFIG_KLOGD=y -CONFIG_FEATURE_KLOGD_KLOGCTL=y -CONFIG_LOGGER=y -# CONFIG_LOGREAD is not set -# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set -# CONFIG_SYSLOGD is not set -# CONFIG_FEATURE_ROTATE_LOGFILE is not set -# CONFIG_FEATURE_REMOTE_LOG is not set -# CONFIG_FEATURE_SYSLOGD_DUP is not set -# CONFIG_FEATURE_SYSLOGD_CFG is not set -# CONFIG_FEATURE_SYSLOGD_PRECISE_TIMESTAMPS is not set -CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=0 -# CONFIG_FEATURE_IPC_SYSLOG is not set -CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0 -# CONFIG_FEATURE_KMSG_SYSLOG is not set diff --git a/meta-openeuler/recipes-core/glibc/glibc_2.25.bb b/meta-openeuler/recipes-core/glibc/glibc_2.25.bb index 514b8d91426..a369413cd78 100644 --- a/meta-openeuler/recipes-core/glibc/glibc_2.25.bb +++ b/meta-openeuler/recipes-core/glibc/glibc_2.25.bb @@ -15,7 +15,7 @@ PROVIDES += " \ virtual/libiconv \ " PROVIDES += "virtual/libc virtual/libiconv virtual/libintl" -#RPROVIDES:${PN}-dev += "libc-dev" +#RPROVIDES_${PN}-dev += "libc-dev" INHIBIT_DEFAULT_DEPS = "1" @@ -23,11 +23,11 @@ INHIBIT_DEFAULT_DEPS = "1" PR = "r1" SRC_URI = "file://sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu" -#FILESPATH:prepend += "${LOCAL_FILES}:" +#FILESPATH_prepend += "${LOCAL_FILES}:" DL_DIR = "${LOCAL_SYSROOT_DL_DIR}" S = "${WORKDIR}/sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu" PSEUDO_DISABLED = "1" -PRIVATE_LIBS:${PN}-dev:append = "libdl.so.2 libresolv.so.2 libm.so.6 librt.so.1 libnsl.so.1 libnss_files.so.2 " +PRIVATE_LIBS_${PN}-dev_append = "libdl.so.2 libresolv.so.2 libm.so.6 librt.so.1 libnsl.so.1 libnss_files.so.2 " do_configure() { : diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 88d40c6bbc5..83d27cff7dd 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -11,18 +11,18 @@ inherit core-image IMAGE_TYPES = "cpio" IMAGE_FSTYPES_DEBUGFS = "cpio" #tar:lower version has no --sort=name -IMAGE_CMD:tar = "${IMAGE_CMD_TAR} --format=posix --numeric-owner -cf ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.tar -C ${IMAGE_ROOTFS} . || [ $? -eq 1 ]" +IMAGE_CMD_tar = "${IMAGE_CMD_TAR} --format=posix --numeric-owner -cf ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.tar -C ${IMAGE_ROOTFS} . || [ $? -eq 1 ]" #not depends to update-alternatives do_rootfs[depends] = "" #not depends to ldconfig-native #LDCONFIGDEPEND = "" -DEPENDS:remove += "${@' '.join(["%s-qemuwrapper-cross" % m for m in d.getVar("MULTILIB_VARIANTS").split()])} qemuwrapper-cross depmodwrapper-cross cross-localedef-native" +DEPENDS_remove += "${@' '.join(["%s-qemuwrapper-cross" % m for m in d.getVar("MULTILIB_VARIANTS").split()])} qemuwrapper-cross depmodwrapper-cross cross-localedef-native" RPMROOTFSDEPENDS = "" -FEATURE_PACKAGES_tools-sdk:remove = " packagegroup-core-sdk packagegroup-core-standalone-sdk-target" -TOOLCHAIN_TARGET_TASK:remove += "${@multilib_pkg_extend(d, 'packagegroup-core-standalone-sdk-target')}" +FEATURE_PACKAGES_tools-sdk_remove = " packagegroup-core-sdk packagegroup-core-standalone-sdk-target" +TOOLCHAIN_TARGET_TASK_remove += "${@multilib_pkg_extend(d, 'packagegroup-core-standalone-sdk-target')}" #IMAGE_ROOTFS_SIZE ?= "8192" -#IMAGE_ROOTFS_EXTRA_SPACE:append = "${@bb.utils.contains("DISTRO_FEATURES", "systemd", " + 4096", "", d)}" +#IMAGE_ROOTFS_EXTRA_SPACE_append = "${@bb.utils.contains("DISTRO_FEATURES", "systemd", " + 4096", "", d)}" #do_package depends to command zstd python do_package() { diff --git a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-compilerlibs.bb b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-compilerlibs.bb index adfd0cd6521..002b7b15346 100644 --- a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-compilerlibs.bb +++ b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-compilerlibs.bb @@ -110,14 +110,14 @@ INHIBIT_SYSROOT_STRIP = "1" INHIBIT_PACKAGE_DEBUG_SPLIT = "1" INHIBIT_PACKAGE_STRIP = "1" -ERROR_QA:remove += "dev-elf dev-so" -WARN_QA:remove += "libdir" +ERROR_QA_remove += "dev-elf dev-so" +WARN_QA_remove += "libdir" INSANE_SKIP += "installed-vs-shipped" do_package_qa[noexec] = "1" -SYSROOT_DIRS:append =" \ +SYSROOT_DIRS_append =" \ ${sublibdir} \ ${subincludedir} \ " -SYSROOT_DIRS_NATIVE:append = "${subbindir}" +SYSROOT_DIRS_NATIVE_append = "${subbindir}" diff --git a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb index 17e420bb2d4..4c3a396b8c1 100644 --- a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb +++ b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb @@ -16,7 +16,7 @@ bindir = "${exec_prefix}/bin/" libdir = "${exec_prefix}/lib/" libexecdir = "${exec_prefix}/libexec/" -do_install:class-cross() { +do_install_class-cross() { install -m 0755 -d ${D}/${prefix} cp -pPR ${B}/* ${D}/${prefix} for f in ${D}/${prefix}/bin/${EULER_TOOLCHAIN_SYSNAME}-*; do diff --git a/meta-openeuler/recipes-devtools/pseudo/pseudo_git.bbappend b/meta-openeuler/recipes-devtools/pseudo/pseudo_git.bbappend index 2614b4e344a..3cd742c6ee6 100644 --- a/meta-openeuler/recipes-devtools/pseudo/pseudo_git.bbappend +++ b/meta-openeuler/recipes-devtools/pseudo/pseudo_git.bbappend @@ -1,14 +1,14 @@ -DEPENDS:remove += "sqlite3 attr" +DEPENDS_remove += "sqlite3 attr" XSRC_URI = "git://git.yoctoproject.org/pseudo;branch=oe-core \ file://0001-configure-Prune-PIE-flags.patch \ file://fallback-passwd \ file://fallback-group \ " -FILESPATH:prepend += "${LOCAL_FILES}:" -SRC_URI:remove:class-native = " \ +FILESPATH_prepend += "${LOCAL_FILES}:" +SRC_URI_remove_class-native = " \ http://downloads.yoctoproject.org/mirror/sources/pseudo-prebuilt-2.33.tar.xz;subdir=git/prebuilt;name=prebuilt \ file://older-glibc-symbols.patch" -SRC_URI:class-native = "file://pseudo \ +SRC_URI_class-native = "file://yocto-pseudo/pseudo-060058bb29f70b244e685b3c704eb0641b736f73.tar.gz \ file://fallback-passwd \ file://fallback-group \ " @@ -16,8 +16,9 @@ SRC_URI:class-native = "file://pseudo \ PV = "1.9.0" LIC_FILES_CHKSUM = "file://COPYING;md5=243b725d71bb5df4a1e5920b344b86ad" LIC_FILES_CHKSUM = "file://COPYING;md5=a1d8023a6f953ac6ea4af765ff62d574" -S = "${WORKDIR}/${BPN}" -PSEUDO_EXTRA_OPTS:remove = "--enable-xattr" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" +S = "${WORKDIR}/${BPN}-060058bb29f70b244e685b3c704eb0641b736f73" +PSEUDO_EXTRA_OPTS_remove = "--enable-xattr" #set --with-sqlite to system host,use system headers do_compile () { @@ -30,7 +31,7 @@ do_compile () { } #do install使用了chrpath,需新增 -xxdo_install:append:class-native () { +xxdo_install_append_class-native () { xchrpath ${D}${bindir}/pseudo -r `chrpath ${D}${bindir}/pseudo | cut -d = -f 2 | sed s/XORIGIN/\\$ORIGIN/` install -d ${D}${sysconfdir} # The fallback files should never be modified diff --git a/meta-openeuler/recipes-kernel/linux/files/kernel-defconfig b/meta-openeuler/recipes-kernel/linux/files/kernel-defconfig deleted file mode 100644 index b6d5d90483f..00000000000 --- a/meta-openeuler/recipes-kernel/linux/files/kernel-defconfig +++ /dev/null @@ -1,3641 +0,0 @@ -# -# Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.10.0 Kernel Configuration -# -CONFIG_CC_VERSION_TEXT="aarch64-linux-gnu-gcc (Linaro GCC 7.3-2018.05) 7.3.1 20180425 [linaro-7.3-2018.05 revision d29120a424ecfbc167ef90065c0eeb7f91977701]" -CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=70301 -CONFIG_LD_VERSION=228020000 -CONFIG_CLANG_VERSION=0 -CONFIG_LLD_VERSION=0 -CONFIG_CC_CAN_LINK=y -CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y -CONFIG_IRQ_WORK=y -CONFIG_BUILDTIME_TABLE_SORT=y -CONFIG_THREAD_INFO_IN_TASK=y - -# -# General setup -# -CONFIG_INIT_ENV_ARG_LIMIT=32 -# CONFIG_COMPILE_TEST is not set -CONFIG_LOCALVERSION="" -# CONFIG_LOCALVERSION_AUTO is not set -CONFIG_BUILD_SALT="" -CONFIG_DEFAULT_INIT="" -CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set -CONFIG_SYSVIPC=y -CONFIG_SYSVIPC_SYSCTL=y -# CONFIG_POSIX_MQUEUE is not set -# CONFIG_WATCH_QUEUE is not set -CONFIG_CROSS_MEMORY_ATTACH=y -# CONFIG_USELIB is not set -CONFIG_AUDIT=y -CONFIG_HAVE_ARCH_AUDITSYSCALL=y -CONFIG_AUDITSYSCALL=y - -# -# IRQ subsystem -# -CONFIG_GENERIC_IRQ_PROBE=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_IRQ_SHOW_LEVEL=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_IRQ_DOMAIN=y -CONFIG_IRQ_DOMAIN_HIERARCHY=y -CONFIG_GENERIC_IRQ_IPI=y -CONFIG_GENERIC_MSI_IRQ=y -CONFIG_GENERIC_MSI_IRQ_DOMAIN=y -CONFIG_HANDLE_DOMAIN_IRQ=y -CONFIG_IRQ_FORCED_THREADING=y -CONFIG_SPARSE_IRQ=y -# CONFIG_GENERIC_IRQ_DEBUGFS is not set -# end of IRQ subsystem - -CONFIG_GENERIC_IRQ_MULTI_HANDLER=y -CONFIG_GENERIC_TIME_VSYSCALL=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_ARCH_HAS_TICK_BROADCAST=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y - -# -# Timers subsystem -# -CONFIG_TICK_ONESHOT=y -CONFIG_NO_HZ_COMMON=y -# CONFIG_HZ_PERIODIC is not set -# CONFIG_NO_HZ_IDLE is not set -CONFIG_NO_HZ_FULL=y -CONFIG_CONTEXT_TRACKING=y -# CONFIG_CONTEXT_TRACKING_FORCE is not set -# CONFIG_NO_HZ is not set -CONFIG_HIGH_RES_TIMERS=y -# end of Timers subsystem - -# CONFIG_PREEMPT_NONE is not set -# CONFIG_PREEMPT_VOLUNTARY is not set -CONFIG_PREEMPT=y -CONFIG_PREEMPT_COUNT=y -CONFIG_PREEMPTION=y - -# -# CPU/Task time and stats accounting -# -CONFIG_VIRT_CPU_ACCOUNTING=y -CONFIG_VIRT_CPU_ACCOUNTING_GEN=y -# CONFIG_IRQ_TIME_ACCOUNTING is not set -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_BSD_PROCESS_ACCT_V3=y -CONFIG_TASKSTATS=y -CONFIG_TASK_DELAY_ACCT=y -CONFIG_TASK_XACCT=y -CONFIG_TASK_IO_ACCOUNTING=y -# CONFIG_PSI is not set -# end of CPU/Task time and stats accounting - -CONFIG_CPU_ISOLATION=y - -# -# RCU Subsystem -# -CONFIG_TREE_RCU=y -CONFIG_PREEMPT_RCU=y -CONFIG_RCU_EXPERT=y -CONFIG_SRCU=y -CONFIG_TREE_SRCU=y -CONFIG_TASKS_RCU_GENERIC=y -CONFIG_TASKS_RCU=y -CONFIG_TASKS_RUDE_RCU=y -CONFIG_RCU_STALL_COMMON=y -CONFIG_RCU_NEED_SEGCBLIST=y -CONFIG_RCU_FANOUT=64 -CONFIG_RCU_FANOUT_LEAF=16 -# CONFIG_RCU_FAST_NO_HZ is not set -# CONFIG_RCU_BOOST is not set -CONFIG_RCU_NOCB_CPU=y -# CONFIG_TASKS_TRACE_RCU_READ_MB is not set -# end of RCU Subsystem - -# CONFIG_IKCONFIG is not set -# CONFIG_IKHEADERS is not set -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 -CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=12 -CONFIG_GENERIC_SCHED_CLOCK=y - -# -# Scheduler features -# -# end of Scheduler features - -CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y -CONFIG_CC_HAS_INT128=y -CONFIG_ARCH_SUPPORTS_INT128=y -CONFIG_CGROUPS=y -# CONFIG_MEMCG is not set -# CONFIG_BLK_CGROUP is not set -CONFIG_CGROUP_SCHED=y -CONFIG_FAIR_GROUP_SCHED=y -# CONFIG_CFS_BANDWIDTH is not set -# CONFIG_RT_GROUP_SCHED is not set -# CONFIG_CGROUP_PIDS is not set -# CONFIG_CGROUP_RDMA is not set -# CONFIG_CGROUP_FREEZER is not set -# CONFIG_CGROUP_HUGETLB is not set -# CONFIG_CPUSETS is not set -# CONFIG_CGROUP_DEVICE is not set -# CONFIG_CGROUP_CPUACCT is not set -# CONFIG_CGROUP_DEBUG is not set -# CONFIG_CGROUP_FILES is not set -# CONFIG_NAMESPACES is not set -# CONFIG_CHECKPOINT_RESTORE is not set -# CONFIG_SCHED_AUTOGROUP is not set -# CONFIG_SYSFS_DEPRECATED is not set -# CONFIG_RELAY is not set -CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="" -CONFIG_RD_GZIP=y -# CONFIG_RD_BZIP2 is not set -CONFIG_RD_LZMA=y -# CONFIG_RD_XZ is not set -# CONFIG_RD_LZO is not set -# CONFIG_RD_LZ4 is not set -# CONFIG_RD_ZSTD is not set -CONFIG_INITRAMFS_FILE_METADATA="" -# CONFIG_BOOT_CONFIG is not set -# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set -CONFIG_CC_OPTIMIZE_FOR_SIZE=y -CONFIG_LD_ORPHAN_WARN=y -CONFIG_SYSCTL=y -CONFIG_HAVE_UID16=y -CONFIG_SYSCTL_EXCEPTION_TRACE=y -CONFIG_BPF=y -CONFIG_EXPERT=y -CONFIG_UID16=y -CONFIG_MULTIUSER=y -# CONFIG_SGETMASK_SYSCALL is not set -# CONFIG_SYSFS_SYSCALL is not set -CONFIG_FHANDLE=y -CONFIG_POSIX_TIMERS=y -CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y -CONFIG_BUG=y -CONFIG_ELF_CORE=y -CONFIG_BASE_FULL=y -CONFIG_FUTEX=y -CONFIG_FUTEX_PI=y -CONFIG_HAVE_FUTEX_CMPXCHG=y -CONFIG_EPOLL=y -CONFIG_SIGNALFD=y -# CONFIG_TIMERFD is not set -# CONFIG_EVENTFD is not set -CONFIG_SHMEM=y -CONFIG_AIO=y -# CONFIG_IO_URING is not set -# CONFIG_ADVISE_SYSCALLS is not set -CONFIG_MEMBARRIER=y -CONFIG_KALLSYMS=y -CONFIG_KALLSYMS_ALL=y -CONFIG_KALLSYMS_BASE_RELATIVE=y -# CONFIG_BPF_SYSCALL is not set -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -# CONFIG_USERFAULTFD is not set -CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y -# CONFIG_KCMP is not set -# CONFIG_RSEQ is not set -CONFIG_EMBEDDED=y -CONFIG_HAVE_PERF_EVENTS=y -# CONFIG_PC104 is not set - -# -# Kernel Performance Events And Counters -# -# CONFIG_PERF_EVENTS is not set -# end of Kernel Performance Events And Counters - -CONFIG_VM_EVENT_COUNTERS=y -# CONFIG_SLUB_DEBUG is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -# CONFIG_SLAB_MERGE_DEFAULT is not set -CONFIG_SLAB_FREELIST_RANDOM=y -CONFIG_SLAB_FREELIST_HARDENED=y -CONFIG_SHUFFLE_PAGE_ALLOCATOR=y -CONFIG_SLUB_CPU_PARTIAL=y -CONFIG_SYSTEM_DATA_VERIFICATION=y -CONFIG_PROFILING=y -CONFIG_TRACEPOINTS=y -# end of General setup - -CONFIG_ARM64=y -CONFIG_64BIT=y -CONFIG_MMU=y -CONFIG_ARM64_PAGE_SHIFT=12 -CONFIG_ARM64_CONT_PTE_SHIFT=4 -CONFIG_ARM64_CONT_PMD_SHIFT=4 -CONFIG_ARCH_MMAP_RND_BITS_MIN=18 -CONFIG_ARCH_MMAP_RND_BITS_MAX=24 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 -CONFIG_STACKTRACE_SUPPORT=y -CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 -CONFIG_LOCKDEP_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y -CONFIG_GENERIC_HWEIGHT=y -CONFIG_GENERIC_CSUM=y -CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_ZONE_DMA=y -CONFIG_ZONE_DMA32=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y -CONFIG_SMP=y -CONFIG_KERNEL_MODE_NEON=y -CONFIG_FIX_EARLYCON_MEM=y -CONFIG_PGTABLE_LEVELS=3 -CONFIG_ARCH_SUPPORTS_UPROBES=y -CONFIG_ARCH_PROC_KCORE_TEXT=y -CONFIG_ARCH_HAS_CPU_RELAX=y - -# -# Platform selection -# -# CONFIG_ARCH_ACTIONS is not set -# CONFIG_ARCH_AGILEX is not set -# CONFIG_ARCH_SUNXI is not set -# CONFIG_ARCH_ALPINE is not set -# CONFIG_ARCH_BCM2835 is not set -# CONFIG_ARCH_BCM_IPROC is not set -# CONFIG_ARCH_BERLIN is not set -# CONFIG_ARCH_BITMAIN is not set -# CONFIG_ARCH_BRCMSTB is not set -# CONFIG_ARCH_EXYNOS is not set -# CONFIG_ARCH_SPARX5 is not set -# CONFIG_ARCH_K3 is not set -# CONFIG_ARCH_LAYERSCAPE is not set -# CONFIG_ARCH_LG1K is not set -CONFIG_ARCH_HISI=y -# CONFIG_ARCH_KEEMBAY is not set -# CONFIG_ARCH_MEDIATEK is not set -# CONFIG_ARCH_MESON is not set -# CONFIG_ARCH_MVEBU is not set -# CONFIG_ARCH_MXC is not set -# CONFIG_ARCH_PHYTIUM is not set -# CONFIG_ARCH_QCOM is not set -# CONFIG_ARCH_REALTEK is not set -# CONFIG_ARCH_RENESAS is not set -# CONFIG_ARCH_ROCKCHIP is not set -# CONFIG_ARCH_S32 is not set -# CONFIG_ARCH_SEATTLE is not set -# CONFIG_ARCH_STRATIX10 is not set -# CONFIG_ARCH_SYNQUACER is not set -# CONFIG_ARCH_TEGRA is not set -# CONFIG_ARCH_SPRD is not set -# CONFIG_ARCH_THUNDER is not set -# CONFIG_ARCH_THUNDER2 is not set -# CONFIG_ARCH_UNIPHIER is not set -# CONFIG_ARCH_VEXPRESS is not set -# CONFIG_ARCH_VISCONTI is not set -# CONFIG_ARCH_XGENE is not set -# CONFIG_ARCH_ZX is not set -# CONFIG_ARCH_ZYNQMP is not set -# end of Platform selection - -CONFIG_HAVE_LIVEPATCH_WO_FTRACE=y - -# -# Enable Livepatch -# -CONFIG_LIVEPATCH=y -CONFIG_LIVEPATCH_WO_FTRACE=y -CONFIG_LIVEPATCH_STOP_MACHINE_CONSISTENCY=y -# CONFIG_LIVEPATCH_STACK is not set -CONFIG_LIVEPATCH_RESTRICT_KPROBE=y -# end of Enable Livepatch - -# -# Kernel Features -# - -# -# ARM errata workarounds via the alternatives framework -# -CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y -CONFIG_ARM64_ERRATUM_826319=y -CONFIG_ARM64_ERRATUM_827319=y -CONFIG_ARM64_ERRATUM_824069=y -CONFIG_ARM64_ERRATUM_819472=y -CONFIG_ARM64_ERRATUM_832075=y -CONFIG_ARM64_ERRATUM_845719=y -# CONFIG_ARM64_ERRATUM_843419 is not set -CONFIG_ARM64_ERRATUM_1024718=y -CONFIG_ARM64_ERRATUM_1418040=y -CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y -CONFIG_ARM64_ERRATUM_1165522=y -CONFIG_ARM64_ERRATUM_1319367=y -CONFIG_ARM64_ERRATUM_1530923=y -CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y -CONFIG_ARM64_ERRATUM_1286807=y -CONFIG_ARM64_ERRATUM_1463225=y -CONFIG_ARM64_ERRATUM_1542419=y -CONFIG_ARM64_ERRATUM_1508412=y -# CONFIG_CAVIUM_ERRATUM_22375 is not set -# CONFIG_CAVIUM_ERRATUM_23154 is not set -# CONFIG_CAVIUM_ERRATUM_27456 is not set -# CONFIG_CAVIUM_ERRATUM_30115 is not set -# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set -# CONFIG_FUJITSU_ERRATUM_010001 is not set -CONFIG_HISILICON_ERRATUM_161600802=y -# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set -# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set -# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set -# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set -CONFIG_SOCIONEXT_SYNQUACER_PREITS=y -CONFIG_HISILICON_ERRATUM_HIP08_RU_PREFETCH=y -# CONFIG_HISILICON_HIP08_RU_PREFETCH_DEFAULT_OFF is not set -# end of ARM errata workarounds via the alternatives framework - -CONFIG_ARM64_4K_PAGES=y -# CONFIG_ARM64_16K_PAGES is not set -# CONFIG_ARM64_64K_PAGES is not set -CONFIG_ARM64_VA_BITS_39=y -# CONFIG_ARM64_VA_BITS_48 is not set -CONFIG_ARM64_VA_BITS=39 -CONFIG_ARM64_PA_BITS_48=y -CONFIG_ARM64_PA_BITS=48 -# CONFIG_CPU_BIG_ENDIAN is not set -CONFIG_CPU_LITTLE_ENDIAN=y -# CONFIG_SCHED_MC is not set -# CONFIG_SCHED_SMT is not set -CONFIG_NR_CPUS=64 -# CONFIG_HOTPLUG_CPU is not set -# CONFIG_NUMA is not set -CONFIG_HZ_100=y -# CONFIG_HZ_250 is not set -# CONFIG_HZ_300 is not set -# CONFIG_HZ_1000 is not set -CONFIG_HZ=100 -CONFIG_SCHED_HRTICK=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y -CONFIG_ARCH_SPARSEMEM_ENABLE=y -CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y -CONFIG_ARCH_FLATMEM_ENABLE=y -CONFIG_HAVE_ARCH_PFN_VALID=y -CONFIG_SYS_SUPPORTS_HUGETLBFS=y -CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y -# CONFIG_PARAVIRT is not set -# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set -# CONFIG_KEXEC_FILE is not set -# CONFIG_CRASH_DUMP is not set -# CONFIG_XEN is not set -CONFIG_FORCE_MAX_ZONEORDER=11 -# CONFIG_UNMAP_KERNEL_AT_EL0 is not set -# CONFIG_RODATA_FULL_DEFAULT_ENABLED is not set -# CONFIG_ARM64_PMEM_RESERVE is not set -# CONFIG_ARM64_SW_TTBR0_PAN is not set -# CONFIG_ARM64_TAGGED_ADDR_ABI is not set -# CONFIG_ARM64_ILP32 is not set -CONFIG_AARCH32_EL0=y -CONFIG_KUSER_HELPERS=y -# CONFIG_ARMV8_DEPRECATED is not set - -# -# ARMv8.1 architectural features -# -# CONFIG_ARM64_HW_AFDBM is not set -# CONFIG_ARM64_PAN is not set -CONFIG_AS_HAS_LSE_ATOMICS=y -# CONFIG_ARM64_USE_LSE_ATOMICS is not set -# CONFIG_ARM64_VHE is not set -# end of ARMv8.1 architectural features - -# -# ARMv8.2 architectural features -# -CONFIG_ARM64_UAO=y -CONFIG_ARM64_PMEM=y -# CONFIG_ARM64_RAS_EXTN is not set -# CONFIG_ARM64_CNP is not set -# end of ARMv8.2 architectural features - -# -# ARMv8.3 architectural features -# -# CONFIG_ARM64_PTR_AUTH is not set -CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y -CONFIG_AS_HAS_PAC=y -# end of ARMv8.3 architectural features - -# -# ARMv8.4 architectural features -# -# CONFIG_ARM64_AMU_EXTN is not set -# end of ARMv8.4 architectural features - -# -# ARMv8.5 architectural features -# -# CONFIG_ARM64_BTI is not set -CONFIG_ARM64_E0PD=y -# CONFIG_ARCH_RANDOM is not set -# end of ARMv8.5 architectural features - -# -# ARMv8.6 architectural features -# -CONFIG_ARM64_TWED=y -# end of ARMv8.6 architectural features - -# CONFIG_ARM64_SVE is not set -CONFIG_ARM64_MODULE_PLTS=y -# CONFIG_ARM64_PSEUDO_NMI is not set -CONFIG_RELOCATABLE=y -CONFIG_RANDOMIZE_BASE=y -CONFIG_RANDOMIZE_MODULE_REGION_FULL=y -# end of Kernel Features - -# -# Boot options -# -CONFIG_CMDLINE="" -CONFIG_EFI_STUB=y -CONFIG_EFI=y -CONFIG_DMI=y -# end of Boot options - -CONFIG_COMPAT=y -CONFIG_SYSVIPC_COMPAT=y -CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y - -# -# Power management options -# -# CONFIG_SUSPEND is not set -# CONFIG_PM is not set -CONFIG_ARCH_SUSPEND_POSSIBLE=y -# end of Power management options - -# -# CPU Power Management -# - -# -# CPU Idle -# -# CONFIG_CPU_IDLE is not set -# end of CPU Idle - -# -# CPU Frequency scaling -# -# CONFIG_CPU_FREQ is not set -# end of CPU Frequency scaling -# end of CPU Power Management - -# -# Firmware Drivers -# -# CONFIG_ARM_SDE_INTERFACE is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_DMIID is not set -# CONFIG_DMI_SYSFS is not set -# CONFIG_FW_CFG_SYSFS is not set -# CONFIG_GOOGLE_FIRMWARE is not set - -# -# EFI (Extensible Firmware Interface) Support -# -CONFIG_EFI_ESRT=y -CONFIG_EFI_PARAMS_FROM_FDT=y -CONFIG_EFI_RUNTIME_WRAPPERS=y -CONFIG_EFI_GENERIC_STUB=y -# CONFIG_EFI_ARMSTUB_DTB_LOADER is not set -# CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER is not set -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_TEST is not set -# CONFIG_RESET_ATTACK_MITIGATION is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -# end of EFI (Extensible Firmware Interface) Support - -CONFIG_EFI_EARLYCON=y -CONFIG_ARM_PSCI_FW=y -CONFIG_HAVE_ARM_SMCCC=y -CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y -# CONFIG_ARM_SMCCC_SOC_ID is not set - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - -CONFIG_ARCH_SUPPORTS_ACPI=y -# CONFIG_ACPI is not set -# CONFIG_VIRTUALIZATION is not set -# CONFIG_ARM64_CRYPTO is not set - -# -# General architecture-dependent options -# -CONFIG_CRASH_CORE=y -CONFIG_SET_FS=y -CONFIG_KPROBES=y -CONFIG_JUMP_LABEL=y -# CONFIG_STATIC_KEYS_SELFTEST is not set -CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y -CONFIG_KRETPROBES=y -CONFIG_HAVE_KPROBES=y -CONFIG_HAVE_KRETPROBES=y -CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y -CONFIG_HAVE_NMI=y -CONFIG_HAVE_ARCH_TRACEHOOK=y -CONFIG_HAVE_DMA_CONTIGUOUS=y -CONFIG_GENERIC_SMP_IDLE_THREAD=y -CONFIG_GENERIC_IDLE_POLL_SETUP=y -CONFIG_ARCH_HAS_FORTIFY_SOURCE=y -CONFIG_ARCH_HAS_KEEPINITRD=y -CONFIG_ARCH_HAS_SET_MEMORY=y -CONFIG_ARCH_HAS_SET_DIRECT_MAP=y -CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y -CONFIG_HAVE_ASM_MODVERSIONS=y -CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y -CONFIG_HAVE_RSEQ=y -CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y -CONFIG_HAVE_PERF_REGS=y -CONFIG_HAVE_PERF_USER_STACK_DUMP=y -CONFIG_HAVE_ARCH_JUMP_LABEL=y -CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y -CONFIG_MMU_GATHER_TABLE_FREE=y -CONFIG_MMU_GATHER_RCU_TABLE_FREE=y -CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y -CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y -CONFIG_HAVE_CMPXCHG_LOCAL=y -CONFIG_HAVE_CMPXCHG_DOUBLE=y -CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y -CONFIG_HAVE_ARCH_SECCOMP=y -CONFIG_HAVE_ARCH_SECCOMP_FILTER=y -CONFIG_SECCOMP=y -CONFIG_SECCOMP_FILTER=y -# CONFIG_SECCOMP_CACHE_DEBUG is not set -CONFIG_HAVE_ARCH_STACKLEAK=y -CONFIG_HAVE_STACKPROTECTOR=y -CONFIG_STACKPROTECTOR=y -CONFIG_STACKPROTECTOR_STRONG=y -CONFIG_HAVE_CONTEXT_TRACKING=y -CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y -CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y -CONFIG_HAVE_MOVE_PUD=y -CONFIG_HAVE_MOVE_PMD=y -CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y -CONFIG_HAVE_ARCH_HUGE_VMAP=y -CONFIG_HAVE_MOD_ARCH_SPECIFIC=y -CONFIG_MODULES_USE_ELF_RELA=y -CONFIG_ARCH_HAS_ELF_RANDOMIZE=y -CONFIG_HAVE_ARCH_MMAP_RND_BITS=y -CONFIG_ARCH_MMAP_RND_BITS=18 -CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y -CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 -CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y -CONFIG_CLONE_BACKWARDS=y -CONFIG_OLD_SIGSUSPEND3=y -CONFIG_COMPAT_OLD_SIGACTION=y -CONFIG_COMPAT_32BIT_TIME=y -CONFIG_HAVE_ARCH_VMAP_STACK=y -CONFIG_VMAP_STACK=y -CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y -CONFIG_STRICT_KERNEL_RWX=y -CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y -CONFIG_STRICT_MODULE_RWX=y -CONFIG_HAVE_ARCH_COMPILER_H=y -CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y -CONFIG_ARCH_USE_MEMREMAP_PROT=y -# CONFIG_LOCK_EVENT_COUNTS is not set -CONFIG_ARCH_HAS_RELR=y -CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y - -# -# GCOV-based kernel profiling -# -# CONFIG_GCOV_KERNEL is not set -CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y -# end of GCOV-based kernel profiling - -CONFIG_HAVE_GCC_PLUGINS=y -# end of General architecture-dependent options - -CONFIG_RT_MUTEXES=y -CONFIG_BASE_SMALL=0 -CONFIG_MODULE_SIG_FORMAT=y -CONFIG_MODULES=y -# CONFIG_MODULE_FORCE_LOAD is not set -CONFIG_MODULE_UNLOAD=y -# CONFIG_MODULE_FORCE_UNLOAD is not set -CONFIG_MODVERSIONS=y -CONFIG_ASM_MODVERSIONS=y -# CONFIG_MODULE_SRCVERSION_ALL is not set -CONFIG_MODULE_SIG=y -# CONFIG_MODULE_SIG_FORCE is not set -# CONFIG_MODULE_SIG_ALL is not set -# CONFIG_MODULE_SIG_SHA1 is not set -# CONFIG_MODULE_SIG_SHA224 is not set -CONFIG_MODULE_SIG_SHA256=y -# CONFIG_MODULE_SIG_SHA384 is not set -# CONFIG_MODULE_SIG_SHA512 is not set -CONFIG_MODULE_SIG_HASH="sha256" -# CONFIG_MODULE_COMPRESS is not set -# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_TRIM_UNUSED_KSYMS is not set -CONFIG_MODULES_TREE_LOOKUP=y -CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y -# CONFIG_BLK_DEV_BSGLIB is not set -# CONFIG_BLK_DEV_INTEGRITY is not set -# CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_CMDLINE_PARSER is not set -# CONFIG_BLK_WBT is not set -CONFIG_BLK_DEBUG_FS=y -# CONFIG_BLK_SED_OPAL is not set -# CONFIG_BLK_INLINE_ENCRYPTION is not set - -# -# Partition Types -# -# CONFIG_PARTITION_ADVANCED is not set -CONFIG_MSDOS_PARTITION=y -CONFIG_EFI_PARTITION=y -# end of Partition Types - -CONFIG_BLOCK_COMPAT=y -CONFIG_BLK_MQ_PCI=y - -# -# IO Schedulers -# -CONFIG_MQ_IOSCHED_DEADLINE=m -# CONFIG_MQ_IOSCHED_KYBER is not set -CONFIG_IOSCHED_BFQ=y -# end of IO Schedulers - -CONFIG_ASN1=y -CONFIG_UNINLINE_SPIN_UNLOCK=y -CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -CONFIG_LOCK_SPIN_ON_OWNER=y -CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_ARCH_USE_QUEUED_RWLOCKS=y -CONFIG_QUEUED_RWLOCKS=y -CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y -CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y - -# -# Executable file formats -# -CONFIG_BINFMT_ELF=y -CONFIG_ARCH_BINFMT_ELF_STATE=y -CONFIG_ARCH_HAVE_ELF_PROT=y -CONFIG_ARCH_USE_GNU_PROPERTY=y -CONFIG_ELFCORE=y -CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y -CONFIG_BINFMT_SCRIPT=y -# CONFIG_BINFMT_MISC is not set -CONFIG_COREDUMP=y -# end of Executable file formats - -# -# Memory Management options -# -CONFIG_SELECT_MEMORY_MODEL=y -# CONFIG_FLATMEM_MANUAL is not set -CONFIG_SPARSEMEM_MANUAL=y -CONFIG_SPARSEMEM=y -CONFIG_SPARSEMEM_EXTREME=y -CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y -# CONFIG_SPARSEMEM_VMEMMAP is not set -CONFIG_HAVE_FAST_GUP=y -CONFIG_HOLES_IN_ZONE=y -CONFIG_ARCH_KEEP_MEMBLOCK=y -# CONFIG_MEMORY_HOTPLUG is not set -CONFIG_SPLIT_PTLOCK_CPUS=4 -CONFIG_COMPACTION=y -# CONFIG_PAGE_REPORTING is not set -CONFIG_MIGRATION=y -CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_BOUNCE=y -CONFIG_KSM=y -CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 -CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y -# CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set -# CONFIG_CLEANCACHE is not set -# CONFIG_ETMEM_SCAN is not set -# CONFIG_ETMEM_SWAP is not set -# CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set -CONFIG_GENERIC_EARLY_IOREMAP=y -# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set -# CONFIG_IDLE_PAGE_TRACKING is not set -CONFIG_ARCH_HAS_PTE_DEVMAP=y -# CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set -CONFIG_ARCH_HAS_PTE_SPECIAL=y -# CONFIG_PIN_MEMORY is not set -# end of Memory Management options - -CONFIG_NET=y -CONFIG_NET_INGRESS=y -CONFIG_SKB_EXTENSIONS=y - -# -# Networking options -# -CONFIG_PACKET=m -# CONFIG_PACKET_DIAG is not set -CONFIG_UNIX=m -CONFIG_UNIX_SCM=y -# CONFIG_UNIX_DIAG is not set -# CONFIG_TLS is not set -CONFIG_XFRM=y -CONFIG_XFRM_ALGO=m -# CONFIG_XFRM_USER is not set -# CONFIG_XFRM_INTERFACE is not set -# CONFIG_XFRM_SUB_POLICY is not set -# CONFIG_XFRM_MIGRATE is not set -# CONFIG_XFRM_STATISTICS is not set -CONFIG_NET_KEY=m -# CONFIG_NET_KEY_MIGRATE is not set -CONFIG_INET=y -CONFIG_IP_MULTICAST=y -CONFIG_IP_ADVANCED_ROUTER=y -# CONFIG_IP_FIB_TRIE_STATS is not set -CONFIG_IP_MULTIPLE_TABLES=y -CONFIG_IP_ROUTE_MULTIPATH=y -CONFIG_IP_ROUTE_VERBOSE=y -# CONFIG_IP_PNP is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPGRE_DEMUX is not set -CONFIG_NET_IP_TUNNEL=m -# CONFIG_IP_MROUTE is not set -CONFIG_SYN_COOKIES=y -# CONFIG_NET_IPVTI is not set -CONFIG_NET_UDP_TUNNEL=m -# CONFIG_NET_FOU is not set -# CONFIG_NET_FOU_IP_TUNNELS is not set -# CONFIG_INET_AH is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_IPCOMP is not set -CONFIG_INET_TUNNEL=m -# CONFIG_INET_DIAG is not set -# CONFIG_TCP_CONG_ADVANCED is not set -CONFIG_TCP_CONG_CUBIC=y -CONFIG_DEFAULT_TCP_CONG="cubic" -# CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=m -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_IPV6_ILA is not set -# CONFIG_IPV6_VTI is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set -# CONFIG_IPV6_SEG6_LWTUNNEL is not set -# CONFIG_IPV6_SEG6_HMAC is not set -# CONFIG_IPV6_RPL_LWTUNNEL is not set -CONFIG_NETLABEL=y -# CONFIG_MPTCP is not set -CONFIG_NETWORK_SECMARK=y -# CONFIG_NETWORK_PHY_TIMESTAMPING is not set -CONFIG_NETFILTER=y -CONFIG_NETFILTER_ADVANCED=y - -# -# Core Netfilter Configuration -# -CONFIG_NETFILTER_INGRESS=y -# CONFIG_NETFILTER_NETLINK_ACCT is not set -# CONFIG_NETFILTER_NETLINK_QUEUE is not set -# CONFIG_NETFILTER_NETLINK_LOG is not set -# CONFIG_NETFILTER_NETLINK_OSF is not set -# CONFIG_NF_CONNTRACK is not set -# CONFIG_NF_LOG_NETDEV is not set -# CONFIG_NF_TABLES is not set -CONFIG_NETFILTER_XTABLES=m - -# -# Xtables combined modules -# -# CONFIG_NETFILTER_XT_MARK is not set - -# -# Xtables targets -# -# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set -# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set -# CONFIG_NETFILTER_XT_TARGET_HMARK is not set -# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set -# CONFIG_NETFILTER_XT_TARGET_LOG is not set -# CONFIG_NETFILTER_XT_TARGET_MARK is not set -# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set -# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set -# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set -# CONFIG_NETFILTER_XT_TARGET_TEE is not set -# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set -# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set - -# -# Xtables matches -# -# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set -# CONFIG_NETFILTER_XT_MATCH_BPF is not set -# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set -# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set -# CONFIG_NETFILTER_XT_MATCH_CPU is not set -# CONFIG_NETFILTER_XT_MATCH_DCCP is not set -# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set -# CONFIG_NETFILTER_XT_MATCH_DSCP is not set -# CONFIG_NETFILTER_XT_MATCH_ECN is not set -# CONFIG_NETFILTER_XT_MATCH_ESP is not set -# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_HL is not set -# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set -# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set -# CONFIG_NETFILTER_XT_MATCH_L2TP is not set -# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set -# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_MAC is not set -# CONFIG_NETFILTER_XT_MATCH_MARK is not set -# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set -# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set -# CONFIG_NETFILTER_XT_MATCH_OSF is not set -# CONFIG_NETFILTER_XT_MATCH_OWNER is not set -# CONFIG_NETFILTER_XT_MATCH_POLICY is not set -# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set -# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set -# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set -# CONFIG_NETFILTER_XT_MATCH_REALM is not set -# CONFIG_NETFILTER_XT_MATCH_RECENT is not set -# CONFIG_NETFILTER_XT_MATCH_SCTP is not set -# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set -# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set -# CONFIG_NETFILTER_XT_MATCH_STRING is not set -# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set -# CONFIG_NETFILTER_XT_MATCH_TIME is not set -# CONFIG_NETFILTER_XT_MATCH_U32 is not set -# end of Core Netfilter Configuration - -# CONFIG_IP_SET is not set -# CONFIG_IP_VS is not set - -# -# IP: Netfilter Configuration -# -# CONFIG_NF_SOCKET_IPV4 is not set -# CONFIG_NF_TPROXY_IPV4 is not set -# CONFIG_NF_DUP_IPV4 is not set -# CONFIG_NF_LOG_ARP is not set -# CONFIG_NF_LOG_IPV4 is not set -CONFIG_NF_REJECT_IPV4=m -CONFIG_IP_NF_IPTABLES=m -# CONFIG_IP_NF_MATCH_AH is not set -# CONFIG_IP_NF_MATCH_ECN is not set -# CONFIG_IP_NF_MATCH_TTL is not set -CONFIG_IP_NF_FILTER=m -CONFIG_IP_NF_TARGET_REJECT=m -# CONFIG_IP_NF_MANGLE is not set -# CONFIG_IP_NF_RAW is not set -# CONFIG_IP_NF_SECURITY is not set -# CONFIG_IP_NF_ARPTABLES is not set -# end of IP: Netfilter Configuration - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_SOCKET_IPV6 is not set -# CONFIG_NF_TPROXY_IPV6 is not set -# CONFIG_NF_DUP_IPV6 is not set -# CONFIG_NF_REJECT_IPV6 is not set -# CONFIG_NF_LOG_IPV6 is not set -# CONFIG_IP6_NF_IPTABLES is not set -# end of IPv6: Netfilter Configuration - -# CONFIG_BPFILTER is not set -# CONFIG_IP_DCCP is not set -# CONFIG_IP_SCTP is not set -# CONFIG_RDS is not set -CONFIG_TIPC=m -CONFIG_TIPC_MEDIA_UDP=y -# CONFIG_TIPC_CRYPTO is not set -# CONFIG_TIPC_DIAG is not set -# CONFIG_ATM is not set -# CONFIG_L2TP is not set -CONFIG_STP=m -CONFIG_GARP=m -# CONFIG_BRIDGE is not set -CONFIG_HAVE_NET_DSA=y -# CONFIG_NET_DSA is not set -CONFIG_VLAN_8021Q=m -CONFIG_VLAN_8021Q_GVRP=y -# CONFIG_VLAN_8021Q_MVRP is not set -# CONFIG_DECNET is not set -CONFIG_LLC=m -# CONFIG_LLC2 is not set -# CONFIG_ATALK is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_PHONET is not set -# CONFIG_6LOWPAN is not set -# CONFIG_IEEE802154 is not set -# CONFIG_NET_SCHED is not set -# CONFIG_DCB is not set -# CONFIG_DNS_RESOLVER is not set -# CONFIG_BATMAN_ADV is not set -# CONFIG_OPENVSWITCH is not set -# CONFIG_VSOCKETS is not set -# CONFIG_NETLINK_DIAG is not set -# CONFIG_MPLS is not set -# CONFIG_NET_NSH is not set -# CONFIG_HSR is not set -# CONFIG_NET_SWITCHDEV is not set -# CONFIG_NET_L3_MASTER_DEV is not set -# CONFIG_QRTR is not set -# CONFIG_NET_NCSI is not set -CONFIG_RPS=y -CONFIG_RFS_ACCEL=y -CONFIG_XPS=y -# CONFIG_CGROUP_NET_PRIO is not set -# CONFIG_CGROUP_NET_CLASSID is not set -CONFIG_NET_RX_BUSY_POLL=y -CONFIG_BQL=y -# CONFIG_BPF_JIT is not set -CONFIG_NET_FLOW_LIMIT=y - -# -# Network testing -# -# CONFIG_NET_PKTGEN is not set -# CONFIG_NET_DROP_MONITOR is not set -# end of Network testing -# end of Networking options - -# CONFIG_HAMRADIO is not set -CONFIG_CAN=m -CONFIG_CAN_RAW=m -CONFIG_CAN_BCM=m -CONFIG_CAN_GW=m -# CONFIG_CAN_J1939 is not set -# CONFIG_CAN_ISOTP is not set - -# -# CAN Device Drivers -# -# CONFIG_CAN_VCAN is not set -# CONFIG_CAN_VXCAN is not set -# CONFIG_CAN_SLCAN is not set -CONFIG_CAN_DEV=m -CONFIG_CAN_CALC_BITTIMING=y -# CONFIG_CAN_FLEXCAN is not set -# CONFIG_CAN_GRCAN is not set -# CONFIG_CAN_KVASER_PCIEFD is not set -# CONFIG_CAN_XILINXCAN is not set -# CONFIG_CAN_C_CAN is not set -# CONFIG_CAN_CC770 is not set -# CONFIG_CAN_IFI_CANFD is not set -# CONFIG_CAN_M_CAN is not set -# CONFIG_CAN_PEAK_PCIEFD is not set -# CONFIG_CAN_SJA1000 is not set -# CONFIG_CAN_SOFTING is not set - -# -# CAN SPI interfaces -# -# CONFIG_CAN_HI311X is not set -# CONFIG_CAN_MCP251X is not set -# CONFIG_CAN_MCP251XFD is not set -# end of CAN SPI interfaces - -# -# CAN USB interfaces -# -# CONFIG_CAN_8DEV_USB is not set -# CONFIG_CAN_EMS_USB is not set -# CONFIG_CAN_ESD_USB2 is not set -# CONFIG_CAN_GS_USB is not set -# CONFIG_CAN_KVASER_USB is not set -# CONFIG_CAN_MCBA_USB is not set -# CONFIG_CAN_PEAK_USB is not set -# CONFIG_CAN_UCAN is not set -# end of CAN USB interfaces - -# CONFIG_CAN_DEBUG_DEVICES is not set -# end of CAN Device Drivers - -# CONFIG_BT is not set -# CONFIG_AF_RXRPC is not set -# CONFIG_AF_KCM is not set -CONFIG_FIB_RULES=y -# CONFIG_WIRELESS is not set -# CONFIG_WIMAX is not set -# CONFIG_RFKILL is not set -# CONFIG_NET_9P is not set -# CONFIG_CAIF is not set -# CONFIG_CEPH_LIB is not set -# CONFIG_NFC is not set -# CONFIG_PSAMPLE is not set -# CONFIG_NET_IFE is not set -# CONFIG_LWTUNNEL is not set -CONFIG_DST_CACHE=y -CONFIG_GRO_CELLS=y -# CONFIG_FAILOVER is not set -# CONFIG_ETHTOOL_NETLINK is not set -CONFIG_HAVE_EBPF_JIT=y - -# -# Device Drivers -# -CONFIG_ARM_AMBA=y -CONFIG_HAVE_PCI=y -CONFIG_PCI=y -CONFIG_PCI_DOMAINS=y -CONFIG_PCI_DOMAINS_GENERIC=y -CONFIG_PCI_SYSCALL=y -CONFIG_PCIEPORTBUS=y -CONFIG_HOTPLUG_PCI_PCIE=y -CONFIG_PCIEAER=y -# CONFIG_PCIEAER_INJECT is not set -# CONFIG_PCIE_ECRC is not set -CONFIG_PCIEASPM=y -CONFIG_PCIEASPM_DEFAULT=y -# CONFIG_PCIEASPM_POWERSAVE is not set -# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set -# CONFIG_PCIEASPM_PERFORMANCE is not set -# CONFIG_PCIE_DPC is not set -# CONFIG_PCIE_PTM is not set -CONFIG_PCI_MSI=y -CONFIG_PCI_MSI_IRQ_DOMAIN=y -CONFIG_PCI_QUIRKS=y -# CONFIG_PCI_DEBUG is not set -# CONFIG_PCI_STUB is not set -# CONFIG_PCI_IOV is not set -# CONFIG_PCI_PRI is not set -# CONFIG_PCI_PASID is not set -CONFIG_PCI_LABEL=y -# CONFIG_PCIE_BUS_TUNE_OFF is not set -CONFIG_PCIE_BUS_DEFAULT=y -# CONFIG_PCIE_BUS_SAFE is not set -# CONFIG_PCIE_BUS_PERFORMANCE is not set -# CONFIG_PCIE_BUS_PEER2PEER is not set -CONFIG_HOTPLUG_PCI=y -# CONFIG_HOTPLUG_PCI_CPCI is not set -# CONFIG_HOTPLUG_PCI_SHPC is not set - -# -# PCI controller drivers -# -# CONFIG_PCI_FTPCI100 is not set -# CONFIG_PCI_HOST_GENERIC is not set -# CONFIG_PCIE_XILINX is not set -# CONFIG_PCI_XGENE is not set -# CONFIG_PCIE_ALTERA is not set -# CONFIG_PCI_HOST_THUNDER_PEM is not set -# CONFIG_PCI_HOST_THUNDER_ECAM is not set - -# -# DesignWare PCI Core Support -# -# CONFIG_PCIE_DW_PLAT_HOST is not set -# CONFIG_PCI_HISI is not set -# CONFIG_PCIE_KIRIN is not set -# CONFIG_PCIE_HISI_STB is not set -# CONFIG_PCI_MESON is not set -# CONFIG_PCIE_AL is not set -# end of DesignWare PCI Core Support - -# -# Mobiveil PCIe Core Support -# -# CONFIG_PCIE_LAYERSCAPE_GEN4 is not set -# end of Mobiveil PCIe Core Support - -# -# Cadence PCIe controllers support -# -# CONFIG_PCIE_CADENCE_PLAT_HOST is not set -# CONFIG_PCI_J721E_HOST is not set -# end of Cadence PCIe controllers support -# end of PCI controller drivers - -# -# PCI Endpoint -# -# CONFIG_PCI_ENDPOINT is not set -# end of PCI Endpoint - -# -# PCI switch controller drivers -# -# CONFIG_PCI_SW_SWITCHTEC is not set -# end of PCI switch controller drivers - -# CONFIG_PCCARD is not set -# CONFIG_RAPIDIO is not set - -# -# Generic Driver Options -# -CONFIG_UEVENT_HELPER=y -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -CONFIG_DEVTMPFS=y -CONFIG_DEVTMPFS_MOUNT=y -CONFIG_STANDALONE=y -# CONFIG_PREVENT_FIRMWARE_BUILD is not set - -# -# Firmware loader -# -CONFIG_FW_LOADER=m -CONFIG_EXTRA_FIRMWARE="" -# CONFIG_FW_LOADER_USER_HELPER is not set -# CONFIG_FW_LOADER_COMPRESS is not set -# end of Firmware loader - -CONFIG_ALLOW_DEV_COREDUMP=y -# CONFIG_DEBUG_DRIVER is not set -# CONFIG_DEBUG_DEVRES is not set -# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set -# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set -CONFIG_GENERIC_CPU_AUTOPROBE=y -CONFIG_GENERIC_CPU_VULNERABILITIES=y -CONFIG_REGMAP=y -CONFIG_REGMAP_MMIO=y -CONFIG_GENERIC_ARCH_TOPOLOGY=y -# end of Generic Driver Options - -# -# Bus devices -# -# CONFIG_BRCMSTB_GISB_ARB is not set -# CONFIG_MOXTET is not set -# CONFIG_HISILICON_LPC is not set -# CONFIG_VEXPRESS_CONFIG is not set -# CONFIG_MHI_BUS is not set -# end of Bus devices - -# CONFIG_CONNECTOR is not set -# CONFIG_GNSS is not set -CONFIG_MTD=m -# CONFIG_MTD_TESTS is not set - -# -# Partition parsers -# -# CONFIG_MTD_AR7_PARTS is not set -CONFIG_MTD_CMDLINE_PARTS=m -CONFIG_MTD_OF_PARTS=m -# CONFIG_MTD_AFS_PARTS is not set -# CONFIG_MTD_REDBOOT_PARTS is not set -# end of Partition parsers - -# -# User Modules And Translation Layers -# -CONFIG_MTD_BLKDEVS=m -CONFIG_MTD_BLOCK=m -# CONFIG_MTD_BLOCK_RO is not set -# CONFIG_FTL is not set -# CONFIG_NFTL is not set -# CONFIG_INFTL is not set -# CONFIG_RFD_FTL is not set -# CONFIG_SSFDC is not set -# CONFIG_SM_FTL is not set -# CONFIG_MTD_OOPS is not set -# CONFIG_MTD_PARTITIONED_MASTER is not set - -# -# RAM/ROM/Flash chip drivers -# -CONFIG_MTD_CFI=m -# CONFIG_MTD_JEDECPROBE is not set -CONFIG_MTD_GEN_PROBE=m -CONFIG_MTD_CFI_ADV_OPTIONS=y -# CONFIG_MTD_CFI_NOSWAP is not set -# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set -CONFIG_MTD_CFI_LE_BYTE_SWAP=y -CONFIG_MTD_CFI_GEOMETRY=y -CONFIG_MTD_MAP_BANK_WIDTH_1=y -CONFIG_MTD_MAP_BANK_WIDTH_2=y -CONFIG_MTD_MAP_BANK_WIDTH_4=y -# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -CONFIG_MTD_MAP_BANK_WIDTH_16=y -CONFIG_MTD_MAP_BANK_WIDTH_32=y -CONFIG_MTD_CFI_I1=y -CONFIG_MTD_CFI_I2=y -# CONFIG_MTD_CFI_I4 is not set -# CONFIG_MTD_CFI_I8 is not set -# CONFIG_MTD_OTP is not set -# CONFIG_MTD_CFI_INTELEXT is not set -CONFIG_MTD_CFI_AMDSTD=m -# CONFIG_MTD_CFI_STAA is not set -CONFIG_MTD_CFI_UTIL=m -# CONFIG_MTD_RAM is not set -# CONFIG_MTD_ROM is not set -# CONFIG_MTD_ABSENT is not set -# end of RAM/ROM/Flash chip drivers - -# -# Mapping drivers for chip access -# -CONFIG_MTD_COMPLEX_MAPPINGS=y -CONFIG_MTD_PHYSMAP=m -# CONFIG_MTD_PHYSMAP_COMPAT is not set -# CONFIG_MTD_PHYSMAP_OF is not set -# CONFIG_MTD_PHYSMAP_GPIO_ADDR is not set -# CONFIG_MTD_PCI is not set -# CONFIG_MTD_INTEL_VR_NOR is not set -# CONFIG_MTD_PLATRAM is not set -# end of Mapping drivers for chip access - -# -# Self-contained MTD device drivers -# -# CONFIG_MTD_PMC551 is not set -# CONFIG_MTD_DATAFLASH is not set -# CONFIG_MTD_MCHP23K256 is not set -# CONFIG_MTD_SST25L is not set -# CONFIG_MTD_SLRAM is not set -CONFIG_MTD_PHRAM=m -# CONFIG_MTD_MTDRAM is not set -# CONFIG_MTD_BLOCK2MTD is not set - -# -# Disk-On-Chip Device Drivers -# -# CONFIG_MTD_DOCG3 is not set -# end of Self-contained MTD device drivers - -# -# NAND -# -CONFIG_MTD_NAND_CORE=m -# CONFIG_MTD_ONENAND is not set -CONFIG_MTD_NAND_ECC_SW_HAMMING=m -# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set -CONFIG_MTD_RAW_NAND=m -# CONFIG_MTD_NAND_ECC_SW_BCH is not set - -# -# Raw/parallel NAND flash controllers -# -# CONFIG_MTD_NAND_DENALI_PCI is not set -# CONFIG_MTD_NAND_DENALI_DT is not set -# CONFIG_MTD_NAND_CAFE is not set -# CONFIG_MTD_NAND_BRCMNAND is not set -# CONFIG_MTD_NAND_HISI504 is not set -# CONFIG_MTD_NAND_MXIC is not set -# CONFIG_MTD_NAND_GPIO is not set -# CONFIG_MTD_NAND_PLATFORM is not set -# CONFIG_MTD_NAND_CADENCE is not set -# CONFIG_MTD_NAND_ARASAN is not set - -# -# Misc -# -# CONFIG_MTD_NAND_NANDSIM is not set -# CONFIG_MTD_NAND_RICOH is not set -# CONFIG_MTD_NAND_DISKONCHIP is not set -# CONFIG_MTD_SPI_NAND is not set - -# -# ECC engine support -# -CONFIG_MTD_NAND_ECC=y -# end of ECC engine support -# end of NAND - -# -# LPDDR & LPDDR2 PCM memory drivers -# -# CONFIG_MTD_LPDDR is not set -# end of LPDDR & LPDDR2 PCM memory drivers - -# CONFIG_MTD_SPI_NOR is not set -CONFIG_MTD_UBI=m -CONFIG_MTD_UBI_WL_THRESHOLD=4096 -CONFIG_MTD_UBI_BEB_LIMIT=20 -# CONFIG_MTD_UBI_FASTMAP is not set -# CONFIG_MTD_UBI_GLUEBI is not set -# CONFIG_MTD_UBI_BLOCK is not set -# CONFIG_MTD_HYPERBUS is not set -CONFIG_DTC=y -CONFIG_OF=y -# CONFIG_OF_UNITTEST is not set -CONFIG_OF_FLATTREE=y -CONFIG_OF_EARLY_FLATTREE=y -CONFIG_OF_KOBJ=y -CONFIG_OF_ADDRESS=y -CONFIG_OF_IRQ=y -CONFIG_OF_NET=y -CONFIG_OF_RESERVED_MEM=y -# CONFIG_OF_OVERLAY is not set -# CONFIG_PARPORT is not set -CONFIG_BLK_DEV=y -# CONFIG_BLK_DEV_NULL_BLK is not set -# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set -CONFIG_BLK_DEV_LOOP=m -CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set -# CONFIG_BLK_DEV_DRBD is not set -# CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set -CONFIG_BLK_DEV_RAM=m -CONFIG_BLK_DEV_RAM_COUNT=16 -CONFIG_BLK_DEV_RAM_SIZE=65536 -# CONFIG_CDROM_PKTCDVD is not set -# CONFIG_ATA_OVER_ETH is not set -# CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set - -# -# NVME Support -# -# CONFIG_BLK_DEV_NVME is not set -# CONFIG_NVME_FC is not set -# CONFIG_NVME_TCP is not set -# end of NVME Support - -# -# Misc devices -# -# CONFIG_AD525X_DPOT is not set -# CONFIG_DUMMY_IRQ is not set -# CONFIG_PHANTOM is not set -# CONFIG_TIFM_CORE is not set -# CONFIG_ICS932S401 is not set -# CONFIG_ENCLOSURE_SERVICES is not set -# CONFIG_HP_ILO is not set -# CONFIG_APDS9802ALS is not set -# CONFIG_ISL29003 is not set -# CONFIG_ISL29020 is not set -# CONFIG_SENSORS_TSL2550 is not set -# CONFIG_SENSORS_BH1770 is not set -# CONFIG_SENSORS_APDS990X is not set -# CONFIG_HMC6352 is not set -# CONFIG_DS1682 is not set -# CONFIG_LATTICE_ECP3_CONFIG is not set -# CONFIG_SRAM is not set -# CONFIG_PCI_ENDPOINT_TEST is not set -# CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set -# CONFIG_C2PORT is not set - -# -# EEPROM support -# -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_AT25 is not set -# CONFIG_EEPROM_LEGACY is not set -# CONFIG_EEPROM_MAX6875 is not set -# CONFIG_EEPROM_93CX6 is not set -# CONFIG_EEPROM_93XX46 is not set -# CONFIG_EEPROM_IDT_89HPESX is not set -# CONFIG_EEPROM_EE1004 is not set -# end of EEPROM support - -# CONFIG_CB710_CORE is not set - -# -# Texas Instruments shared transport line discipline -# -# CONFIG_TI_ST is not set -# end of Texas Instruments shared transport line discipline - -# -# Altera FPGA firmware download module (requires I2C) -# -# CONFIG_ALTERA_STAPL is not set -# CONFIG_GENWQE is not set -# CONFIG_ECHO is not set -# CONFIG_MISC_ALCOR_PCI is not set -# CONFIG_MISC_RTSX_PCI is not set -# CONFIG_MISC_RTSX_USB is not set -# CONFIG_HABANA_AI is not set -# end of Misc devices - -# -# SCSI device support -# -CONFIG_SCSI_MOD=m -# CONFIG_RAID_ATTRS is not set -CONFIG_SCSI=m -CONFIG_SCSI_DMA=y -CONFIG_SCSI_PROC_FS=y - -# -# SCSI support type (disk, tape, CD-ROM) -# -CONFIG_BLK_DEV_SD=m -# CONFIG_CHR_DEV_ST is not set -# CONFIG_BLK_DEV_SR is not set -# CONFIG_CHR_DEV_SG is not set -# CONFIG_CHR_DEV_SCH is not set -# CONFIG_SCSI_CONSTANTS is not set -# CONFIG_SCSI_LOGGING is not set -# CONFIG_SCSI_SCAN_ASYNC is not set - -# -# SCSI Transports -# -# CONFIG_SCSI_SPI_ATTRS is not set -# CONFIG_SCSI_FC_ATTRS is not set -# CONFIG_SCSI_ISCSI_ATTRS is not set -# CONFIG_SCSI_SAS_ATTRS is not set -# CONFIG_SCSI_SAS_LIBSAS is not set -# CONFIG_SCSI_SRP_ATTRS is not set -# end of SCSI Transports - -CONFIG_SCSI_LOWLEVEL=y -# CONFIG_ISCSI_TCP is not set -# CONFIG_ISCSI_BOOT_SYSFS is not set -# CONFIG_SCSI_CXGB3_ISCSI is not set -# CONFIG_SCSI_CXGB4_ISCSI is not set -# CONFIG_SCSI_BNX2_ISCSI is not set -# CONFIG_BE2ISCSI is not set -# CONFIG_BLK_DEV_3W_XXXX_RAID is not set -# CONFIG_SCSI_HPSA is not set -# CONFIG_SCSI_3W_9XXX is not set -# CONFIG_SCSI_3W_SAS is not set -# CONFIG_SCSI_ACARD is not set -# CONFIG_SCSI_AACRAID is not set -# CONFIG_SCSI_AIC7XXX is not set -# CONFIG_SCSI_AIC79XX is not set -# CONFIG_SCSI_AIC94XX is not set -# CONFIG_SCSI_HISI_SAS is not set -# CONFIG_SCSI_MVSAS is not set -# CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_ADVANSYS is not set -# CONFIG_SCSI_ARCMSR is not set -# CONFIG_SCSI_ESAS2R is not set -# CONFIG_MEGARAID_NEWGEN is not set -# CONFIG_MEGARAID_LEGACY is not set -# CONFIG_MEGARAID_SAS is not set -# CONFIG_SCSI_MPT3SAS is not set -# CONFIG_SCSI_MPT2SAS is not set -# CONFIG_SCSI_SMARTPQI is not set -# CONFIG_SCSI_UFSHCD is not set -# CONFIG_SCSI_HPTIOP is not set -# CONFIG_SCSI_MYRB is not set -# CONFIG_SCSI_MYRS is not set -# CONFIG_SCSI_SNIC is not set -# CONFIG_SCSI_DMX3191D is not set -# CONFIG_SCSI_FDOMAIN_PCI is not set -# CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_IPS is not set -# CONFIG_SCSI_INITIO is not set -# CONFIG_SCSI_INIA100 is not set -# CONFIG_SCSI_STEX is not set -# CONFIG_SCSI_SYM53C8XX_2 is not set -# CONFIG_SCSI_IPR is not set -# CONFIG_SCSI_QLOGIC_1280 is not set -# CONFIG_SCSI_QLA_ISCSI is not set -# CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_AM53C974 is not set -# CONFIG_SCSI_WD719X is not set -# CONFIG_SCSI_DEBUG is not set -# CONFIG_SCSI_PMCRAID is not set -# CONFIG_SCSI_PM8001 is not set -# CONFIG_SCSI_DH is not set -# end of SCSI device support - -CONFIG_HAVE_PATA_PLATFORM=y -CONFIG_ATA=m -CONFIG_ATA_VERBOSE_ERROR=y -# CONFIG_ATA_FORCE is not set - -# -# Controllers with non-SFF native interface -# -# CONFIG_SATA_AHCI is not set -# CONFIG_SATA_AHCI_PLATFORM is not set -# CONFIG_AHCI_CEVA is not set -# CONFIG_AHCI_QORIQ is not set -# CONFIG_SATA_INIC162X is not set -# CONFIG_SATA_ACARD_AHCI is not set -# CONFIG_SATA_SIL24 is not set -CONFIG_ATA_SFF=y - -# -# SFF controllers with custom DMA interface -# -# CONFIG_PDC_ADMA is not set -# CONFIG_SATA_QSTOR is not set -# CONFIG_SATA_SX4 is not set -CONFIG_ATA_BMDMA=y - -# -# SATA SFF controllers with BMDMA -# -# CONFIG_ATA_PIIX is not set -# CONFIG_SATA_MV is not set -# CONFIG_SATA_NV is not set -# CONFIG_SATA_PROMISE is not set -# CONFIG_SATA_SIL is not set -# CONFIG_SATA_SIS is not set -# CONFIG_SATA_SVW is not set -# CONFIG_SATA_ULI is not set -# CONFIG_SATA_VIA is not set -# CONFIG_SATA_VITESSE is not set -# CONFIG_SATA_ZHAOXIN is not set - -# -# PATA SFF controllers with BMDMA -# -# CONFIG_PATA_ALI is not set -# CONFIG_PATA_AMD is not set -# CONFIG_PATA_ARTOP is not set -# CONFIG_PATA_ATIIXP is not set -# CONFIG_PATA_ATP867X is not set -# CONFIG_PATA_CMD64X is not set -# CONFIG_PATA_CYPRESS is not set -# CONFIG_PATA_EFAR is not set -# CONFIG_PATA_HPT366 is not set -# CONFIG_PATA_HPT37X is not set -# CONFIG_PATA_HPT3X2N is not set -# CONFIG_PATA_HPT3X3 is not set -# CONFIG_PATA_IT8213 is not set -# CONFIG_PATA_IT821X is not set -# CONFIG_PATA_JMICRON is not set -# CONFIG_PATA_MARVELL is not set -# CONFIG_PATA_NETCELL is not set -# CONFIG_PATA_NINJA32 is not set -# CONFIG_PATA_NS87415 is not set -# CONFIG_PATA_OLDPIIX is not set -# CONFIG_PATA_OPTIDMA is not set -# CONFIG_PATA_PDC2027X is not set -# CONFIG_PATA_PDC_OLD is not set -# CONFIG_PATA_RADISYS is not set -# CONFIG_PATA_RDC is not set -# CONFIG_PATA_SCH is not set -# CONFIG_PATA_SERVERWORKS is not set -# CONFIG_PATA_SIL680 is not set -# CONFIG_PATA_SIS is not set -# CONFIG_PATA_TOSHIBA is not set -# CONFIG_PATA_TRIFLEX is not set -# CONFIG_PATA_VIA is not set -# CONFIG_PATA_WINBOND is not set - -# -# PIO-only SFF controllers -# -# CONFIG_PATA_CMD640_PCI is not set -# CONFIG_PATA_MPIIX is not set -# CONFIG_PATA_NS87410 is not set -# CONFIG_PATA_OPTI is not set -# CONFIG_PATA_PLATFORM is not set -# CONFIG_PATA_RZ1000 is not set - -# -# Generic fallback / legacy drivers -# -# CONFIG_ATA_GENERIC is not set -# CONFIG_PATA_LEGACY is not set -CONFIG_MD=y -# CONFIG_BLK_DEV_MD is not set -# CONFIG_BCACHE is not set -# CONFIG_BLK_DEV_DM is not set -# CONFIG_TARGET_CORE is not set -# CONFIG_FUSION is not set - -# -# IEEE 1394 (FireWire) support -# -# CONFIG_FIREWIRE is not set -# CONFIG_FIREWIRE_NOSY is not set -# end of IEEE 1394 (FireWire) support - -CONFIG_NETDEVICES=y -CONFIG_MII=m -CONFIG_NET_CORE=y -CONFIG_BONDING=m -# CONFIG_DUMMY is not set -# CONFIG_WIREGUARD is not set -# CONFIG_EQUALIZER is not set -# CONFIG_NET_FC is not set -# CONFIG_NET_TEAM is not set -# CONFIG_MACVLAN is not set -# CONFIG_IPVLAN is not set -# CONFIG_VXLAN is not set -# CONFIG_GENEVE is not set -# CONFIG_BAREUDP is not set -# CONFIG_GTP is not set -# CONFIG_MACSEC is not set -# CONFIG_NETCONSOLE is not set -CONFIG_TUN=m -# CONFIG_TUN_VNET_CROSS_LE is not set -# CONFIG_VETH is not set -# CONFIG_NLMON is not set -# CONFIG_ARCNET is not set - -# -# Distributed Switch Architecture drivers -# -# end of Distributed Switch Architecture drivers - -CONFIG_ETHERNET=y -# CONFIG_NET_VENDOR_3COM is not set -# CONFIG_NET_VENDOR_ADAPTEC is not set -# CONFIG_NET_VENDOR_AGERE is not set -# CONFIG_NET_VENDOR_ALACRITECH is not set -# CONFIG_NET_VENDOR_ALTEON is not set -# CONFIG_ALTERA_TSE is not set -# CONFIG_NET_VENDOR_AMAZON is not set -# CONFIG_NET_VENDOR_AMD is not set -# CONFIG_NET_VENDOR_AQUANTIA is not set -# CONFIG_NET_VENDOR_ARC is not set -# CONFIG_NET_VENDOR_ATHEROS is not set -# CONFIG_NET_VENDOR_AURORA is not set -# CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set -CONFIG_NET_VENDOR_CADENCE=y -# CONFIG_MACB is not set -# CONFIG_NET_VENDOR_CAVIUM is not set -# CONFIG_NET_VENDOR_CHELSIO is not set -# CONFIG_NET_VENDOR_CISCO is not set -# CONFIG_NET_VENDOR_CORTINA is not set -# CONFIG_DNET is not set -# CONFIG_NET_VENDOR_DEC is not set -# CONFIG_NET_VENDOR_DLINK is not set -# CONFIG_NET_VENDOR_EMULEX is not set -# CONFIG_NET_VENDOR_EZCHIP is not set -# CONFIG_NET_VENDOR_GOOGLE is not set -# CONFIG_NET_VENDOR_HISILICON is not set -# CONFIG_NET_VENDOR_HUAWEI is not set -# CONFIG_NET_VENDOR_INTEL is not set -CONFIG_NET_VENDOR_NETSWIFT=y -# CONFIG_JME is not set -# CONFIG_NET_VENDOR_MARVELL is not set -# CONFIG_NET_VENDOR_MELLANOX is not set -# CONFIG_NET_VENDOR_MICREL is not set -# CONFIG_NET_VENDOR_MICROCHIP is not set -# CONFIG_NET_VENDOR_MICROSEMI is not set -# CONFIG_NET_VENDOR_MYRI is not set -# CONFIG_FEALNX is not set -# CONFIG_NET_VENDOR_NATSEMI is not set -# CONFIG_NET_VENDOR_NETERION is not set -# CONFIG_NET_VENDOR_NETRONOME is not set -# CONFIG_NET_VENDOR_NI is not set -# CONFIG_NET_VENDOR_NVIDIA is not set -# CONFIG_NET_VENDOR_OKI is not set -# CONFIG_ETHOC is not set -# CONFIG_NET_VENDOR_PACKET_ENGINES is not set -# CONFIG_NET_VENDOR_PENSANDO is not set -# CONFIG_NET_VENDOR_QLOGIC is not set -# CONFIG_NET_VENDOR_QUALCOMM is not set -# CONFIG_NET_VENDOR_RDC is not set -# CONFIG_NET_VENDOR_REALTEK is not set -# CONFIG_NET_VENDOR_RENESAS is not set -# CONFIG_NET_VENDOR_ROCKER is not set -# CONFIG_NET_VENDOR_SAMSUNG is not set -# CONFIG_NET_VENDOR_SEEQ is not set -# CONFIG_NET_VENDOR_SOLARFLARE is not set -# CONFIG_NET_VENDOR_SILAN is not set -# CONFIG_NET_VENDOR_SIS is not set -# CONFIG_NET_VENDOR_SMSC is not set -# CONFIG_NET_VENDOR_SOCIONEXT is not set -# CONFIG_NET_VENDOR_STMICRO is not set -# CONFIG_NET_VENDOR_SUN is not set -# CONFIG_NET_VENDOR_SYNOPSYS is not set -# CONFIG_NET_VENDOR_TEHUTI is not set -# CONFIG_NET_VENDOR_TI is not set -# CONFIG_NET_VENDOR_VIA is not set -# CONFIG_NET_VENDOR_WIZNET is not set -# CONFIG_NET_VENDOR_XILINX is not set -# CONFIG_FDDI is not set -# CONFIG_HIPPI is not set -CONFIG_PHYLIB=m -CONFIG_SWPHY=y -CONFIG_FIXED_PHY=m - -# -# MII PHY device drivers -# -# CONFIG_AMD_PHY is not set -# CONFIG_ADIN_PHY is not set -# CONFIG_AQUANTIA_PHY is not set -# CONFIG_AX88796B_PHY is not set -# CONFIG_BROADCOM_PHY is not set -# CONFIG_BCM54140_PHY is not set -# CONFIG_BCM7XXX_PHY is not set -# CONFIG_BCM84881_PHY is not set -# CONFIG_BCM87XX_PHY is not set -# CONFIG_CICADA_PHY is not set -# CONFIG_CORTINA_PHY is not set -# CONFIG_DAVICOM_PHY is not set -# CONFIG_ICPLUS_PHY is not set -# CONFIG_LXT_PHY is not set -# CONFIG_INTEL_XWAY_PHY is not set -# CONFIG_LSI_ET1011C_PHY is not set -# CONFIG_MARVELL_PHY is not set -# CONFIG_MARVELL_10G_PHY is not set -# CONFIG_MICREL_PHY is not set -# CONFIG_MICROCHIP_PHY is not set -# CONFIG_MICROCHIP_T1_PHY is not set -# CONFIG_MICROSEMI_PHY is not set -# CONFIG_NATIONAL_PHY is not set -# CONFIG_QSEMI_PHY is not set -# CONFIG_REALTEK_PHY is not set -# CONFIG_RENESAS_PHY is not set -# CONFIG_ROCKCHIP_PHY is not set -# CONFIG_SMSC_PHY is not set -# CONFIG_STE10XP is not set -# CONFIG_TERANETICS_PHY is not set -# CONFIG_DP83822_PHY is not set -# CONFIG_DP83TC811_PHY is not set -# CONFIG_DP83848_PHY is not set -# CONFIG_DP83867_PHY is not set -# CONFIG_DP83869_PHY is not set -# CONFIG_VITESSE_PHY is not set -# CONFIG_XILINX_GMII2RGMII is not set -# CONFIG_MICREL_KS8995MA is not set -CONFIG_MDIO_DEVICE=m -CONFIG_MDIO_BUS=m -CONFIG_OF_MDIO=m -CONFIG_MDIO_DEVRES=m -# CONFIG_MDIO_BITBANG is not set -# CONFIG_MDIO_BCM_UNIMAC is not set -# CONFIG_MDIO_HISI_FEMAC is not set -# CONFIG_MDIO_MVUSB is not set -# CONFIG_MDIO_MSCC_MIIM is not set -# CONFIG_MDIO_OCTEON is not set -# CONFIG_MDIO_IPQ4019 is not set -# CONFIG_MDIO_IPQ8064 is not set -# CONFIG_MDIO_THUNDER is not set - -# -# MDIO Multiplexers -# -# CONFIG_MDIO_BUS_MUX_GPIO is not set -# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set -# CONFIG_MDIO_BUS_MUX_MMIOREG is not set - -# -# PCS device drivers -# -# CONFIG_PCS_XPCS is not set -# end of PCS device drivers - -# CONFIG_PPP is not set -# CONFIG_SLIP is not set - -# -# Host-side USB support is needed for USB Network Adapter support -# -CONFIG_USB_NET_DRIVERS=m -# CONFIG_USB_CATC is not set -# CONFIG_USB_KAWETH is not set -# CONFIG_USB_PEGASUS is not set -# CONFIG_USB_RTL8150 is not set -# CONFIG_USB_RTL8152 is not set -# CONFIG_USB_LAN78XX is not set -CONFIG_USB_USBNET=m -# CONFIG_USB_NET_AX8817X is not set -# CONFIG_USB_NET_AX88179_178A is not set -CONFIG_USB_NET_CDCETHER=m -# CONFIG_USB_NET_CDC_EEM is not set -# CONFIG_USB_NET_CDC_NCM is not set -# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set -# CONFIG_USB_NET_CDC_MBIM is not set -# CONFIG_USB_NET_DM9601 is not set -# CONFIG_USB_NET_SR9700 is not set -# CONFIG_USB_NET_SR9800 is not set -# CONFIG_USB_NET_SMSC75XX is not set -# CONFIG_USB_NET_SMSC95XX is not set -# CONFIG_USB_NET_GL620A is not set -# CONFIG_USB_NET_NET1080 is not set -# CONFIG_USB_NET_PLUSB is not set -# CONFIG_USB_NET_MCS7830 is not set -CONFIG_USB_NET_RNDIS_HOST=m -# CONFIG_USB_NET_CDC_SUBSET is not set -# CONFIG_USB_NET_ZAURUS is not set -# CONFIG_USB_NET_CX82310_ETH is not set -# CONFIG_USB_NET_KALMIA is not set -# CONFIG_USB_NET_QMI_WWAN is not set -# CONFIG_USB_NET_INT51X1 is not set -# CONFIG_USB_IPHETH is not set -# CONFIG_USB_SIERRA_NET is not set -# CONFIG_USB_VL600 is not set -# CONFIG_USB_NET_CH9200 is not set -# CONFIG_USB_NET_AQC111 is not set -# CONFIG_WLAN is not set - -# -# Enable WiMAX (Networking options) to see the WiMAX drivers -# -# CONFIG_WAN is not set -# CONFIG_VMXNET3 is not set -# CONFIG_NETDEVSIM is not set -# CONFIG_NET_FAILOVER is not set -# CONFIG_ISDN is not set -# CONFIG_NVM is not set - -# -# Input device support -# -# CONFIG_INPUT is not set - -# -# Hardware I/O ports -# -# CONFIG_SERIO is not set -# CONFIG_GAMEPORT is not set -# end of Hardware I/O ports -# end of Input device support - -# -# Character devices -# -CONFIG_TTY=y -# CONFIG_VT is not set -CONFIG_UNIX98_PTYS=y -# CONFIG_LEGACY_PTYS is not set -# CONFIG_LDISC_AUTOLOAD is not set - -# -# Serial drivers -# -CONFIG_SERIAL_EARLYCON=y -CONFIG_SERIAL_8250=y -CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y -# CONFIG_SERIAL_8250_16550A_VARIANTS is not set -# CONFIG_SERIAL_8250_FINTEK is not set -CONFIG_SERIAL_8250_CONSOLE=y -# CONFIG_SERIAL_8250_PCI is not set -CONFIG_SERIAL_8250_NR_UARTS=4 -CONFIG_SERIAL_8250_RUNTIME_UARTS=4 -# CONFIG_SERIAL_8250_EXTENDED is not set -# CONFIG_SERIAL_8250_ASPEED_VUART is not set -CONFIG_SERIAL_8250_DWLIB=y -CONFIG_SERIAL_8250_FSL=y -CONFIG_SERIAL_8250_DW=y -# CONFIG_SERIAL_8250_RT288X is not set -# CONFIG_SERIAL_OF_PLATFORM is not set - -# -# Non-8250 serial port support -# -# CONFIG_SERIAL_AMBA_PL010 is not set -CONFIG_SERIAL_AMBA_PL011=y -CONFIG_SERIAL_AMBA_PL011_CONSOLE=y -# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set -# CONFIG_SERIAL_MAX3100 is not set -# CONFIG_SERIAL_MAX310X is not set -# CONFIG_SERIAL_UARTLITE is not set -CONFIG_SERIAL_CORE=y -CONFIG_SERIAL_CORE_CONSOLE=y -# CONFIG_SERIAL_JSM is not set -# CONFIG_SERIAL_SIFIVE is not set -# CONFIG_SERIAL_SCCNXP is not set -# CONFIG_SERIAL_SC16IS7XX is not set -# CONFIG_SERIAL_ALTERA_JTAGUART is not set -# CONFIG_SERIAL_ALTERA_UART is not set -# CONFIG_SERIAL_IFX6X60 is not set -# CONFIG_SERIAL_XILINX_PS_UART is not set -# CONFIG_SERIAL_ARC is not set -# CONFIG_SERIAL_RP2 is not set -# CONFIG_SERIAL_FSL_LPUART is not set -# CONFIG_SERIAL_FSL_LINFLEXUART is not set -# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set -# CONFIG_SERIAL_SPRD is not set -# end of Serial drivers - -CONFIG_SERIAL_MCTRL_GPIO=y -# CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_N_GSM is not set -# CONFIG_NOZOMI is not set -# CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set -# CONFIG_HVC_DCC is not set -# CONFIG_SERIAL_DEV_BUS is not set -# CONFIG_TTY_PRINTK is not set -# CONFIG_VIRTIO_CONSOLE is not set -# CONFIG_IPMI_HANDLER is not set -CONFIG_HW_RANDOM=m -# CONFIG_HW_RANDOM_TIMERIOMEM is not set -# CONFIG_HW_RANDOM_BA431 is not set -# CONFIG_HW_RANDOM_HISI is not set -# CONFIG_HW_RANDOM_CAVIUM is not set -# CONFIG_HW_RANDOM_CCTRNG is not set -# CONFIG_HW_RANDOM_XIPHERA is not set -# CONFIG_APPLICOM is not set -CONFIG_DEVMEM=y -# CONFIG_RAW_DRIVER is not set -CONFIG_DEVPORT=y -CONFIG_TCG_TPM=y -# CONFIG_TCG_TIS is not set -# CONFIG_TCG_TIS_SPI is not set -# CONFIG_TCG_TIS_I2C_ATMEL is not set -# CONFIG_TCG_TIS_I2C_INFINEON is not set -# CONFIG_TCG_TIS_I2C_NUVOTON is not set -# CONFIG_TCG_ATMEL is not set -# CONFIG_TCG_VTPM_PROXY is not set -# CONFIG_TCG_TIS_ST33ZP24_I2C is not set -# CONFIG_TCG_TIS_ST33ZP24_SPI is not set -# CONFIG_XILLYBUS is not set -# end of Character devices - -# CONFIG_RANDOM_TRUST_BOOTLOADER is not set - -# -# I2C support -# -CONFIG_I2C=m -CONFIG_I2C_BOARDINFO=y -CONFIG_I2C_COMPAT=y -CONFIG_I2C_CHARDEV=m -# CONFIG_I2C_MUX is not set -CONFIG_I2C_HELPER_AUTO=y - -# -# I2C Hardware Bus support -# - -# -# PC SMBus host controller drivers -# -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_HIX5HD2 is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_ISCH is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_NVIDIA_GPU is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set - -# -# I2C system bus drivers (mostly embedded / system-on-chip) -# -# CONFIG_I2C_CADENCE is not set -# CONFIG_I2C_CBUS_GPIO is not set -# CONFIG_I2C_DESIGNWARE_PLATFORM is not set -# CONFIG_I2C_DESIGNWARE_PCI is not set -# CONFIG_I2C_EMEV2 is not set -# CONFIG_I2C_GPIO is not set -# CONFIG_I2C_HISI is not set -# CONFIG_I2C_NOMADIK is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PCA_PLATFORM is not set -# CONFIG_I2C_RK3X is not set -# CONFIG_I2C_SIMTEC is not set -# CONFIG_I2C_THUNDERX is not set -# CONFIG_I2C_XILINX is not set - -# -# External I2C/SMBus adapter drivers -# -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_ROBOTFUZZ_OSIF is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_TINY_USB is not set - -# -# Other I2C/SMBus bus drivers -# -# end of I2C Hardware Bus support - -# CONFIG_I2C_STUB is not set -# CONFIG_I2C_SLAVE is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# end of I2C support - -# CONFIG_I3C is not set -CONFIG_SPI=y -# CONFIG_SPI_DEBUG is not set -CONFIG_SPI_MASTER=y -# CONFIG_SPI_MEM is not set - -# -# SPI Master Controller Drivers -# -# CONFIG_SPI_ALTERA is not set -# CONFIG_SPI_AXI_SPI_ENGINE is not set -# CONFIG_SPI_BITBANG is not set -# CONFIG_SPI_CADENCE is not set -# CONFIG_SPI_CADENCE_QUADSPI is not set -# CONFIG_SPI_DESIGNWARE is not set -# CONFIG_SPI_NXP_FLEXSPI is not set -# CONFIG_SPI_GPIO is not set -# CONFIG_SPI_FSL_SPI is not set -# CONFIG_SPI_OC_TINY is not set -# CONFIG_SPI_PL022 is not set -# CONFIG_SPI_PXA2XX is not set -# CONFIG_SPI_ROCKCHIP is not set -# CONFIG_SPI_SC18IS602 is not set -# CONFIG_SPI_SIFIVE is not set -# CONFIG_SPI_MXIC is not set -# CONFIG_SPI_THUNDERX is not set -# CONFIG_SPI_XCOMM is not set -# CONFIG_SPI_XILINX is not set -# CONFIG_SPI_ZYNQMP_GQSPI is not set -# CONFIG_SPI_AMD is not set - -# -# SPI Multiplexer support -# -# CONFIG_SPI_MUX is not set - -# -# SPI Protocol Masters -# -# CONFIG_SPI_SPIDEV is not set -# CONFIG_SPI_LOOPBACK_TEST is not set -# CONFIG_SPI_TLE62X0 is not set -# CONFIG_SPI_SLAVE is not set -# CONFIG_SPMI is not set -# CONFIG_HSI is not set -# CONFIG_PPS is not set - -# -# PTP clock support -# -# CONFIG_PTP_1588_CLOCK is not set - -# -# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. -# -# end of PTP clock support - -CONFIG_PINCTRL=y -# CONFIG_DEBUG_PINCTRL is not set -# CONFIG_PINCTRL_MCP23S08 is not set -# CONFIG_PINCTRL_SINGLE is not set -# CONFIG_PINCTRL_STMFX is not set -# CONFIG_PINCTRL_OCELOT is not set - -# -# Renesas pinctrl drivers -# -# end of Renesas pinctrl drivers - -CONFIG_GPIOLIB=y -CONFIG_GPIOLIB_FASTPATH_LIMIT=512 -CONFIG_OF_GPIO=y -# CONFIG_DEBUG_GPIO is not set -# CONFIG_GPIO_SYSFS is not set -CONFIG_GPIO_CDEV=y -# CONFIG_GPIO_CDEV_V1 is not set -CONFIG_GPIO_GENERIC=m - -# -# Memory mapped GPIO drivers -# -# CONFIG_GPIO_74XX_MMIO is not set -# CONFIG_GPIO_ALTERA is not set -# CONFIG_GPIO_CADENCE is not set -# CONFIG_GPIO_DWAPB is not set -# CONFIG_GPIO_FTGPIO010 is not set -CONFIG_GPIO_GENERIC_PLATFORM=m -# CONFIG_GPIO_GRGPIO is not set -# CONFIG_GPIO_HLWD is not set -# CONFIG_GPIO_LOGICVC is not set -# CONFIG_GPIO_MB86S7X is not set -# CONFIG_GPIO_PL061 is not set -# CONFIG_GPIO_SAMA5D2_PIOBU is not set -# CONFIG_GPIO_SIFIVE is not set -# CONFIG_GPIO_SYSCON is not set -# CONFIG_GPIO_XGENE is not set -# CONFIG_GPIO_XILINX is not set -# CONFIG_GPIO_AMD_FCH is not set -# end of Memory mapped GPIO drivers - -# -# I2C GPIO expanders -# -# CONFIG_GPIO_ADP5588 is not set -# CONFIG_GPIO_ADNP is not set -# CONFIG_GPIO_GW_PLD is not set -# CONFIG_GPIO_MAX7300 is not set -# CONFIG_GPIO_MAX732X is not set -# CONFIG_GPIO_PCA953X is not set -# CONFIG_GPIO_PCA9570 is not set -# CONFIG_GPIO_PCF857X is not set -# CONFIG_GPIO_TPIC2810 is not set -# end of I2C GPIO expanders - -# -# MFD GPIO expanders -# -# end of MFD GPIO expanders - -# -# PCI GPIO expanders -# -# CONFIG_GPIO_BT8XX is not set -# CONFIG_GPIO_PCI_IDIO_16 is not set -# CONFIG_GPIO_PCIE_IDIO_24 is not set -# CONFIG_GPIO_RDC321X is not set -# end of PCI GPIO expanders - -# -# SPI GPIO expanders -# -# CONFIG_GPIO_74X164 is not set -# CONFIG_GPIO_MAX3191X is not set -# CONFIG_GPIO_MAX7301 is not set -# CONFIG_GPIO_MC33880 is not set -# CONFIG_GPIO_PISOSR is not set -# CONFIG_GPIO_XRA1403 is not set -# end of SPI GPIO expanders - -# -# USB GPIO expanders -# -# end of USB GPIO expanders - -# CONFIG_GPIO_AGGREGATOR is not set -# CONFIG_GPIO_MOCKUP is not set -# CONFIG_W1 is not set -CONFIG_POWER_RESET=y -# CONFIG_POWER_RESET_BRCMSTB is not set -# CONFIG_POWER_RESET_GPIO is not set -# CONFIG_POWER_RESET_GPIO_RESTART is not set -# CONFIG_POWER_RESET_HISI is not set -# CONFIG_POWER_RESET_LTC2952 is not set -# CONFIG_POWER_RESET_RESTART is not set -# CONFIG_POWER_RESET_XGENE is not set -# CONFIG_POWER_RESET_SYSCON is not set -# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set -# CONFIG_SYSCON_REBOOT_MODE is not set -# CONFIG_NVMEM_REBOOT_MODE is not set -CONFIG_POWER_SUPPLY=y -# CONFIG_POWER_SUPPLY_DEBUG is not set -# CONFIG_PDA_POWER is not set -# CONFIG_TEST_POWER is not set -# CONFIG_CHARGER_ADP5061 is not set -# CONFIG_BATTERY_CW2015 is not set -# CONFIG_BATTERY_DS2780 is not set -# CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_SBS is not set -# CONFIG_CHARGER_SBS is not set -# CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set -# CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_LP8727 is not set -# CONFIG_CHARGER_GPIO is not set -# CONFIG_CHARGER_LT3651 is not set -# CONFIG_CHARGER_DETECTOR_MAX14656 is not set -# CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_BQ24257 is not set -# CONFIG_CHARGER_BQ24735 is not set -# CONFIG_CHARGER_BQ2515X is not set -# CONFIG_CHARGER_BQ25890 is not set -# CONFIG_CHARGER_BQ25980 is not set -# CONFIG_CHARGER_SMB347 is not set -# CONFIG_BATTERY_GAUGE_LTC2941 is not set -# CONFIG_CHARGER_RT9455 is not set -# CONFIG_CHARGER_BD99954 is not set -# CONFIG_HWMON is not set -# CONFIG_THERMAL is not set -# CONFIG_WATCHDOG is not set -CONFIG_SSB_POSSIBLE=y -# CONFIG_SSB is not set -CONFIG_BCMA_POSSIBLE=y -# CONFIG_BCMA is not set - -# -# Multifunction device drivers -# -# CONFIG_MFD_ACT8945A is not set -# CONFIG_MFD_ATMEL_FLEXCOM is not set -# CONFIG_MFD_ATMEL_HLCDC is not set -# CONFIG_MFD_BCM590XX is not set -# CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_AXP20X_I2C is not set -# CONFIG_MFD_MADERA is not set -# CONFIG_MFD_DA9052_SPI is not set -# CONFIG_MFD_DA9062 is not set -# CONFIG_MFD_DA9063 is not set -# CONFIG_MFD_DA9150 is not set -# CONFIG_MFD_DLN2 is not set -# CONFIG_MFD_GATEWORKS_GSC is not set -# CONFIG_MFD_MC13XXX_SPI is not set -# CONFIG_MFD_MC13XXX_I2C is not set -# CONFIG_MFD_MP2629 is not set -# CONFIG_MFD_HI6421_PMIC is not set -# CONFIG_MFD_HI655X_PMIC is not set -# CONFIG_HTC_PASIC3 is not set -# CONFIG_LPC_ICH is not set -# CONFIG_LPC_SCH is not set -# CONFIG_MFD_IQS62X is not set -# CONFIG_MFD_JANZ_CMODIO is not set -# CONFIG_MFD_KEMPLD is not set -# CONFIG_MFD_88PM800 is not set -# CONFIG_MFD_88PM805 is not set -# CONFIG_MFD_MAX14577 is not set -# CONFIG_MFD_MAX77650 is not set -# CONFIG_MFD_MAX77686 is not set -# CONFIG_MFD_MAX77693 is not set -# CONFIG_MFD_MAX8907 is not set -# CONFIG_MFD_MT6360 is not set -# CONFIG_MFD_MT6397 is not set -# CONFIG_MFD_MENF21BMC is not set -# CONFIG_EZX_PCAP is not set -# CONFIG_MFD_CPCAP is not set -# CONFIG_MFD_VIPERBOARD is not set -# CONFIG_MFD_RETU is not set -# CONFIG_MFD_PCF50633 is not set -# CONFIG_MFD_RDC321X is not set -# CONFIG_MFD_RT5033 is not set -# CONFIG_MFD_RK808 is not set -# CONFIG_MFD_RN5T618 is not set -# CONFIG_MFD_SI476X_CORE is not set -# CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set -# CONFIG_MFD_STMPE is not set -CONFIG_MFD_SYSCON=y -# CONFIG_MFD_TI_AM335X_TSCADC is not set -# CONFIG_MFD_LP3943 is not set -# CONFIG_MFD_TI_LMU is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS65010 is not set -# CONFIG_TPS6507X is not set -# CONFIG_MFD_TPS65086 is not set -# CONFIG_MFD_TPS65217 is not set -# CONFIG_MFD_TI_LP873X is not set -# CONFIG_MFD_TI_LP87565 is not set -# CONFIG_MFD_TPS65218 is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS65912_SPI is not set -# CONFIG_MFD_WL1273_CORE is not set -# CONFIG_MFD_LM3533 is not set -# CONFIG_MFD_TQMX86 is not set -# CONFIG_MFD_VX855 is not set -# CONFIG_MFD_ARIZONA_I2C is not set -# CONFIG_MFD_ARIZONA_SPI is not set -# CONFIG_MFD_WM831X_SPI is not set -# CONFIG_MFD_WM8994 is not set -# CONFIG_MFD_STMFX is not set -# CONFIG_MFD_INTEL_M10_BMC is not set -# end of Multifunction device drivers - -# CONFIG_REGULATOR is not set -# CONFIG_MEDIA_CEC_SUPPORT is not set -# CONFIG_MEDIA_SUPPORT is not set - -# -# Graphics support -# -# CONFIG_VGA_ARB is not set -# CONFIG_DRM is not set - -# -# ARM devices -# -# end of ARM devices - -# -# Frame buffer Devices -# -# CONFIG_FB is not set -# end of Frame buffer Devices - -# -# Backlight & LCD device support -# -# CONFIG_LCD_CLASS_DEVICE is not set -# CONFIG_BACKLIGHT_CLASS_DEVICE is not set -# end of Backlight & LCD device support -# end of Graphics support - -# CONFIG_SOUND is not set -CONFIG_USB_OHCI_LITTLE_ENDIAN=y -CONFIG_USB_SUPPORT=y -CONFIG_USB_COMMON=m -# CONFIG_USB_ULPI_BUS is not set -# CONFIG_USB_CONN_GPIO is not set -CONFIG_USB_ARCH_HAS_HCD=y -CONFIG_USB=m -# CONFIG_USB_PCI is not set -CONFIG_USB_ANNOUNCE_NEW_DEVICES=y - -# -# Miscellaneous USB options -# -CONFIG_USB_DEFAULT_PERSIST=y -# CONFIG_USB_FEW_INIT_RETRIES is not set -CONFIG_USB_DYNAMIC_MINORS=y -# CONFIG_USB_OTG_PRODUCTLIST is not set -# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set -CONFIG_USB_AUTOSUSPEND_DELAY=2 -# CONFIG_USB_MON is not set - -# -# USB Host Controller Drivers -# -# CONFIG_USB_C67X00_HCD is not set -# CONFIG_USB_XHCI_HCD is not set -# CONFIG_USB_EHCI_HCD is not set -# CONFIG_USB_OXU210HP_HCD is not set -# CONFIG_USB_ISP116X_HCD is not set -# CONFIG_USB_FOTG210_HCD is not set -# CONFIG_USB_MAX3421_HCD is not set -# CONFIG_USB_OHCI_HCD is not set -# CONFIG_USB_SL811_HCD is not set -# CONFIG_USB_R8A66597_HCD is not set -# CONFIG_USB_HCD_TEST_MODE is not set - -# -# USB Device Class drivers -# -# CONFIG_USB_ACM is not set -# CONFIG_USB_PRINTER is not set -# CONFIG_USB_WDM is not set -# CONFIG_USB_TMC is not set - -# -# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may -# - -# -# also be needed; see USB_STORAGE Help for more info -# -CONFIG_USB_STORAGE=m -# CONFIG_USB_STORAGE_DEBUG is not set -# CONFIG_USB_STORAGE_REALTEK is not set -# CONFIG_USB_STORAGE_DATAFAB is not set -# CONFIG_USB_STORAGE_FREECOM is not set -# CONFIG_USB_STORAGE_ISD200 is not set -# CONFIG_USB_STORAGE_USBAT is not set -# CONFIG_USB_STORAGE_SDDR09 is not set -# CONFIG_USB_STORAGE_SDDR55 is not set -# CONFIG_USB_STORAGE_JUMPSHOT is not set -# CONFIG_USB_STORAGE_ALAUDA is not set -# CONFIG_USB_STORAGE_KARMA is not set -# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set -# CONFIG_USB_STORAGE_ENE_UB6250 is not set -# CONFIG_USB_UAS is not set - -# -# USB Imaging devices -# -# CONFIG_USB_MDC800 is not set -# CONFIG_USB_MICROTEK is not set -# CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set -# CONFIG_USB_MUSB_HDRC is not set -# CONFIG_USB_DWC3 is not set -# CONFIG_USB_DWC2 is not set -# CONFIG_USB_ISP1760 is not set - -# -# USB port drivers -# -# CONFIG_USB_SERIAL is not set - -# -# USB Miscellaneous drivers -# -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EMI26 is not set -# CONFIG_USB_ADUTUX is not set -# CONFIG_USB_SEVSEG is not set -# CONFIG_USB_LEGOTOWER is not set -# CONFIG_USB_LCD is not set -# CONFIG_USB_CYPRESS_CY7C63 is not set -# CONFIG_USB_CYTHERM is not set -# CONFIG_USB_IDMOUSE is not set -# CONFIG_USB_FTDI_ELAN is not set -# CONFIG_USB_APPLEDISPLAY is not set -# CONFIG_APPLE_MFI_FASTCHARGE is not set -# CONFIG_USB_LD is not set -# CONFIG_USB_TRANCEVIBRATOR is not set -# CONFIG_USB_IOWARRIOR is not set -# CONFIG_USB_TEST is not set -# CONFIG_USB_EHSET_TEST_FIXTURE is not set -# CONFIG_USB_ISIGHTFW is not set -# CONFIG_USB_YUREX is not set -# CONFIG_USB_EZUSB_FX2 is not set -# CONFIG_USB_HUB_USB251XB is not set -# CONFIG_USB_HSIC_USB3503 is not set -# CONFIG_USB_HSIC_USB4604 is not set -# CONFIG_USB_LINK_LAYER_TEST is not set -# CONFIG_USB_CHAOSKEY is not set - -# -# USB Physical Layer drivers -# -# CONFIG_NOP_USB_XCEIV is not set -# CONFIG_USB_GPIO_VBUS is not set -# CONFIG_USB_ISP1301 is not set -# CONFIG_USB_ULPI is not set -# end of USB Physical Layer drivers - -# CONFIG_USB_GADGET is not set -# CONFIG_TYPEC is not set -# CONFIG_USB_ROLE_SWITCH is not set -# CONFIG_MMC is not set -# CONFIG_MEMSTICK is not set -# CONFIG_NEW_LEDS is not set -# CONFIG_ACCESSIBILITY is not set -# CONFIG_INFINIBAND is not set -CONFIG_EDAC_SUPPORT=y -# CONFIG_EDAC is not set -CONFIG_RTC_LIB=y -CONFIG_RTC_CLASS=y -# CONFIG_RTC_HCTOSYS is not set -# CONFIG_RTC_SYSTOHC is not set -# CONFIG_RTC_DEBUG is not set -# CONFIG_RTC_NVMEM is not set - -# -# RTC interfaces -# -CONFIG_RTC_INTF_SYSFS=y -CONFIG_RTC_INTF_PROC=y -CONFIG_RTC_INTF_DEV=y -# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -# CONFIG_RTC_DRV_TEST is not set - -# -# I2C RTC drivers -# -# CONFIG_RTC_DRV_ABB5ZES3 is not set -# CONFIG_RTC_DRV_ABEOZ9 is not set -# CONFIG_RTC_DRV_ABX80X is not set -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_HYM8563 is not set -# CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_ISL12026 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85063 is not set -# CONFIG_RTC_DRV_PCF85363 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_RV3028 is not set -# CONFIG_RTC_DRV_RV3032 is not set -# CONFIG_RTC_DRV_RV8803 is not set -# CONFIG_RTC_DRV_SD3078 is not set - -# -# SPI RTC drivers -# -# CONFIG_RTC_DRV_M41T93 is not set -# CONFIG_RTC_DRV_M41T94 is not set -# CONFIG_RTC_DRV_DS1302 is not set -# CONFIG_RTC_DRV_DS1305 is not set -# CONFIG_RTC_DRV_DS1343 is not set -# CONFIG_RTC_DRV_DS1347 is not set -# CONFIG_RTC_DRV_DS1390 is not set -# CONFIG_RTC_DRV_MAX6916 is not set -# CONFIG_RTC_DRV_R9701 is not set -# CONFIG_RTC_DRV_RX4581 is not set -# CONFIG_RTC_DRV_RX6110 is not set -# CONFIG_RTC_DRV_RS5C348 is not set -# CONFIG_RTC_DRV_MAX6902 is not set -# CONFIG_RTC_DRV_PCF2123 is not set -# CONFIG_RTC_DRV_MCP795 is not set -CONFIG_RTC_I2C_AND_SPI=m - -# -# SPI and I2C RTC drivers -# -# CONFIG_RTC_DRV_DS3232 is not set -# CONFIG_RTC_DRV_PCF2127 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set - -# -# Platform RTC drivers -# -# CONFIG_RTC_DRV_DS1286 is not set -# CONFIG_RTC_DRV_DS1511 is not set -# CONFIG_RTC_DRV_DS1553 is not set -# CONFIG_RTC_DRV_DS1685_FAMILY is not set -# CONFIG_RTC_DRV_DS1742 is not set -# CONFIG_RTC_DRV_DS2404 is not set -# CONFIG_RTC_DRV_EFI is not set -# CONFIG_RTC_DRV_STK17TA8 is not set -# CONFIG_RTC_DRV_M48T86 is not set -# CONFIG_RTC_DRV_M48T35 is not set -# CONFIG_RTC_DRV_M48T59 is not set -# CONFIG_RTC_DRV_MSM6242 is not set -# CONFIG_RTC_DRV_BQ4802 is not set -# CONFIG_RTC_DRV_RP5C01 is not set -# CONFIG_RTC_DRV_V3020 is not set -# CONFIG_RTC_DRV_ZYNQMP is not set - -# -# on-CPU RTC drivers -# -# CONFIG_RTC_DRV_PL030 is not set -# CONFIG_RTC_DRV_PL031 is not set -# CONFIG_RTC_DRV_CADENCE is not set -# CONFIG_RTC_DRV_FTRTC010 is not set -# CONFIG_RTC_DRV_R7301 is not set - -# -# HID Sensor RTC drivers -# -# CONFIG_DMADEVICES is not set - -# -# DMABUF options -# -# CONFIG_SYNC_FILE is not set -# CONFIG_DMABUF_MOVE_NOTIFY is not set -# CONFIG_DMABUF_HEAPS is not set -# end of DMABUF options - -# CONFIG_AUXDISPLAY is not set -CONFIG_UIO=m -# CONFIG_UIO_CIF is not set -# CONFIG_UIO_PDRV_GENIRQ is not set -# CONFIG_UIO_DMEM_GENIRQ is not set -# CONFIG_UIO_AEC is not set -# CONFIG_UIO_SERCOS3 is not set -# CONFIG_UIO_PCI_GENERIC is not set -# CONFIG_UIO_NETX is not set -# CONFIG_UIO_PRUSS is not set -# CONFIG_UIO_MF624 is not set -# CONFIG_VFIO is not set -# CONFIG_VIRT_DRIVERS is not set -# CONFIG_VIRTIO_MENU is not set -# CONFIG_VDPA is not set -# CONFIG_VHOST_MENU is not set - -# -# Microsoft Hyper-V guest support -# -# end of Microsoft Hyper-V guest support - -# CONFIG_GREYBUS is not set -# CONFIG_STAGING is not set -# CONFIG_GOLDFISH is not set -# CONFIG_CHROME_PLATFORMS is not set -# CONFIG_MELLANOX_PLATFORM is not set -CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y -CONFIG_HAVE_CLK_PREPARE=y -CONFIG_COMMON_CLK=y -# CONFIG_COMMON_CLK_MAX9485 is not set -# CONFIG_COMMON_CLK_SI5341 is not set -# CONFIG_COMMON_CLK_SI5351 is not set -# CONFIG_COMMON_CLK_SI514 is not set -# CONFIG_COMMON_CLK_SI544 is not set -# CONFIG_COMMON_CLK_SI570 is not set -# CONFIG_COMMON_CLK_CDCE706 is not set -# CONFIG_COMMON_CLK_CDCE925 is not set -# CONFIG_COMMON_CLK_CS2000_CP is not set -# CONFIG_CLK_QORIQ is not set -# CONFIG_COMMON_CLK_XGENE is not set -# CONFIG_COMMON_CLK_VC5 is not set -# CONFIG_COMMON_CLK_FIXED_MMIO is not set -# CONFIG_COMMON_CLK_HI3516CV300 is not set -# CONFIG_COMMON_CLK_HI3519 is not set -# CONFIG_COMMON_CLK_HI3660 is not set -# CONFIG_COMMON_CLK_HI3670 is not set -# CONFIG_COMMON_CLK_HI3798CV200 is not set -# CONFIG_COMMON_CLK_HI6220 is not set -# CONFIG_RESET_HISI is not set -# CONFIG_HWSPINLOCK is not set - -# -# Clock Source drivers -# -CONFIG_TIMER_OF=y -CONFIG_TIMER_PROBE=y -CONFIG_CLKSRC_MMIO=y -CONFIG_ARM_ARCH_TIMER=y -CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y -CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y -CONFIG_FSL_ERRATUM_A008585=y -CONFIG_HISILICON_ERRATUM_161010101=y -CONFIG_ARM64_ERRATUM_858921=y -CONFIG_ARM_TIMER_SP804=y -# CONFIG_MICROCHIP_PIT64B is not set -# end of Clock Source drivers - -# CONFIG_MAILBOX is not set -# CONFIG_IOMMU_SUPPORT is not set - -# -# Remoteproc drivers -# -# CONFIG_REMOTEPROC is not set -# end of Remoteproc drivers - -# -# Rpmsg drivers -# -# CONFIG_RPMSG_VIRTIO is not set -# end of Rpmsg drivers - -# CONFIG_SOUNDWIRE is not set - -# -# SOC (System On Chip) specific Drivers -# - -# -# Amlogic SoC drivers -# -# end of Amlogic SoC drivers - -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - -# -# Broadcom SoC drivers -# -# CONFIG_SOC_BRCMSTB is not set -# end of Broadcom SoC drivers - -# -# NXP/Freescale QorIQ SoC drivers -# -# CONFIG_QUICC_ENGINE is not set -# end of NXP/Freescale QorIQ SoC drivers - -# -# i.MX SoC drivers -# -# end of i.MX SoC drivers - -# -# Qualcomm SoC drivers -# -# end of Qualcomm SoC drivers - -# CONFIG_SOC_TI is not set - -# -# Xilinx SoC drivers -# -# CONFIG_XILINX_VCU is not set -# end of Xilinx SoC drivers -# end of SOC (System On Chip) specific Drivers - -# CONFIG_PM_DEVFREQ is not set -# CONFIG_EXTCON is not set -# CONFIG_MEMORY is not set -# CONFIG_IIO is not set -# CONFIG_NTB is not set -# CONFIG_VME_BUS is not set -# CONFIG_PWM is not set - -# -# IRQ chip support -# -CONFIG_IRQCHIP=y -CONFIG_ARM_GIC=y -CONFIG_ARM_GIC_MAX_NR=1 -CONFIG_ARM_GIC_V2M=y -CONFIG_ARM_GIC_V3=y -CONFIG_ARM_GIC_V3_ITS=y -CONFIG_ARM_GIC_V3_ITS_PCI=y -# CONFIG_AL_FIC is not set -CONFIG_HISILICON_IRQ_MBIGEN=y -CONFIG_PARTITION_PERCPU=y -# end of IRQ chip support - -# CONFIG_IPACK_BUS is not set -# CONFIG_RESET_CONTROLLER is not set - -# -# PHY Subsystem -# -CONFIG_GENERIC_PHY=y -# CONFIG_PHY_XGENE is not set -# CONFIG_BCM_KONA_USB2_PHY is not set -# CONFIG_PHY_CADENCE_TORRENT is not set -# CONFIG_PHY_CADENCE_DPHY is not set -# CONFIG_PHY_CADENCE_SALVO is not set -# CONFIG_PHY_FSL_IMX8MQ_USB is not set -# CONFIG_PHY_MIXEL_MIPI_DPHY is not set -# CONFIG_PHY_HI6220_USB is not set -# CONFIG_PHY_HI3660_USB is not set -# CONFIG_PHY_HISTB_COMBPHY is not set -# CONFIG_PHY_HISI_INNO_USB2 is not set -# CONFIG_PHY_PXA_28NM_HSIC is not set -# CONFIG_PHY_PXA_28NM_USB2 is not set -# CONFIG_PHY_MAPPHONE_MDM6600 is not set -# CONFIG_PHY_OCELOT_SERDES is not set -# end of PHY Subsystem - -# CONFIG_POWERCAP is not set -# CONFIG_MCB is not set -CONFIG_RAS=y -# CONFIG_USB4 is not set - -# -# Android -# -# CONFIG_ANDROID is not set -# end of Android - -# CONFIG_LIBNVDIMM is not set -# CONFIG_PMEM_LEGACY is not set -CONFIG_DAX=y -# CONFIG_NVMEM is not set - -# -# HW tracing support -# -# CONFIG_STM is not set -# CONFIG_INTEL_TH is not set -# end of HW tracing support - -# CONFIG_FPGA is not set -# CONFIG_FSI is not set -# CONFIG_TEE is not set -# CONFIG_SIOX is not set -# CONFIG_SLIMBUS is not set -# CONFIG_INTERCONNECT is not set -# CONFIG_COUNTER is not set -# end of Device Drivers - -# -# File systems -# -CONFIG_DCACHE_WORD_ACCESS=y -# CONFIG_VALIDATE_FS_PARSER is not set -CONFIG_FS_IOMAP=y -CONFIG_EXT2_FS=m -CONFIG_EXT2_FS_XATTR=y -# CONFIG_EXT2_FS_POSIX_ACL is not set -CONFIG_EXT2_FS_SECURITY=y -CONFIG_EXT3_FS=m -# CONFIG_EXT3_FS_POSIX_ACL is not set -CONFIG_EXT3_FS_SECURITY=y -CONFIG_EXT4_FS=y -# CONFIG_EXT4_FS_POSIX_ACL is not set -CONFIG_EXT4_FS_SECURITY=y -# CONFIG_EXT4_DEBUG is not set -CONFIG_JBD2=y -# CONFIG_JBD2_DEBUG is not set -CONFIG_FS_MBCACHE=y -# CONFIG_REISERFS_FS is not set -# CONFIG_JFS_FS is not set -# CONFIG_XFS_FS is not set -# CONFIG_GFS2_FS is not set -# CONFIG_BTRFS_FS is not set -# CONFIG_NILFS2_FS is not set -# CONFIG_F2FS_FS is not set -CONFIG_FS_DAX=y -CONFIG_FS_POSIX_ACL=y -CONFIG_EXPORTFS=y -# CONFIG_EXPORTFS_BLOCK_OPS is not set -CONFIG_FILE_LOCKING=y -# CONFIG_MANDATORY_FILE_LOCKING is not set -# CONFIG_FS_ENCRYPTION is not set -# CONFIG_FS_VERITY is not set -CONFIG_FSNOTIFY=y -CONFIG_DNOTIFY=y -CONFIG_INOTIFY_USER=y -CONFIG_FANOTIFY=y -# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set -# CONFIG_QUOTA is not set -# CONFIG_AUTOFS4_FS is not set -CONFIG_AUTOFS_FS=m -# CONFIG_FUSE_FS is not set -# CONFIG_OVERLAY_FS is not set - -# -# Caches -# -# CONFIG_FSCACHE is not set -# end of Caches - -# -# CD-ROM/DVD Filesystems -# -# CONFIG_ISO9660_FS is not set -# CONFIG_UDF_FS is not set -# end of CD-ROM/DVD Filesystems - -# -# DOS/FAT/EXFAT/NT Filesystems -# -CONFIG_FAT_FS=m -# CONFIG_MSDOS_FS is not set -CONFIG_VFAT_FS=m -CONFIG_FAT_DEFAULT_CODEPAGE=437 -CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -# CONFIG_FAT_DEFAULT_UTF8 is not set -# CONFIG_EXFAT_FS is not set -# CONFIG_NTFS_FS is not set -# end of DOS/FAT/EXFAT/NT Filesystems - -# -# Pseudo filesystems -# -CONFIG_PROC_FS=y -CONFIG_PROC_KCORE=y -CONFIG_PROC_SYSCTL=y -CONFIG_PROC_PAGE_MONITOR=y -# CONFIG_PROC_CHILDREN is not set -CONFIG_KERNFS=y -CONFIG_SYSFS=y -CONFIG_TMPFS=y -CONFIG_TMPFS_POSIX_ACL=y -CONFIG_TMPFS_XATTR=y -# CONFIG_TMPFS_INODE64 is not set -CONFIG_HUGETLBFS=y -CONFIG_HUGETLB_PAGE=y -CONFIG_MEMFD_CREATE=y -CONFIG_ARCH_HAS_GIGANTIC_PAGE=y -# CONFIG_CONFIGFS_FS is not set -# CONFIG_EFIVAR_FS is not set -# end of Pseudo filesystems - -CONFIG_MISC_FILESYSTEMS=y -# CONFIG_ORANGEFS_FS is not set -# CONFIG_ADFS_FS is not set -# CONFIG_AFFS_FS is not set -# CONFIG_ECRYPT_FS is not set -# CONFIG_HFS_FS is not set -# CONFIG_HFSPLUS_FS is not set -# CONFIG_BEFS_FS is not set -# CONFIG_BFS_FS is not set -# CONFIG_EFS_FS is not set -CONFIG_JFFS2_FS=m -CONFIG_JFFS2_FS_DEBUG=0 -CONFIG_JFFS2_FS_WRITEBUFFER=y -# CONFIG_JFFS2_FS_WBUF_VERIFY is not set -CONFIG_JFFS2_SUMMARY=y -CONFIG_JFFS2_FS_XATTR=y -CONFIG_JFFS2_FS_POSIX_ACL=y -CONFIG_JFFS2_FS_SECURITY=y -CONFIG_JFFS2_COMPRESSION_OPTIONS=y -CONFIG_JFFS2_ZLIB=y -CONFIG_JFFS2_LZO=y -CONFIG_JFFS2_RTIME=y -# CONFIG_JFFS2_RUBIN is not set -# CONFIG_JFFS2_CMODE_NONE is not set -CONFIG_JFFS2_CMODE_PRIORITY=y -# CONFIG_JFFS2_CMODE_SIZE is not set -# CONFIG_JFFS2_CMODE_FAVOURLZO is not set -# CONFIG_UBIFS_FS is not set -# CONFIG_CRAMFS is not set -CONFIG_SQUASHFS=m -CONFIG_SQUASHFS_FILE_CACHE=y -# CONFIG_SQUASHFS_FILE_DIRECT is not set -CONFIG_SQUASHFS_DECOMP_SINGLE=y -# CONFIG_SQUASHFS_DECOMP_MULTI is not set -# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set -CONFIG_SQUASHFS_XATTR=y -CONFIG_SQUASHFS_ZLIB=y -# CONFIG_SQUASHFS_LZ4 is not set -# CONFIG_SQUASHFS_LZO is not set -CONFIG_SQUASHFS_XZ=y -# CONFIG_SQUASHFS_ZSTD is not set -# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set -# CONFIG_SQUASHFS_EMBEDDED is not set -CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 -# CONFIG_VXFS_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_OMFS_FS is not set -# CONFIG_HPFS_FS is not set -# CONFIG_QNX4FS_FS is not set -# CONFIG_QNX6FS_FS is not set -# CONFIG_ROMFS_FS is not set -# CONFIG_PSTORE is not set -# CONFIG_SYSV_FS is not set -# CONFIG_UFS_FS is not set -# CONFIG_EROFS_FS is not set -CONFIG_NETWORK_FILESYSTEMS=y -# CONFIG_NFS_FS is not set -# CONFIG_NFSD is not set -# CONFIG_CEPH_FS is not set -CONFIG_CIFS=m -# CONFIG_CIFS_STATS2 is not set -# CONFIG_CIFS_ALLOW_INSECURE_LEGACY is not set -# CONFIG_CIFS_UPCALL is not set -# CONFIG_CIFS_XATTR is not set -CONFIG_CIFS_DEBUG=y -# CONFIG_CIFS_DEBUG2 is not set -# CONFIG_CIFS_DEBUG_DUMP_KEYS is not set -# CONFIG_CIFS_DFS_UPCALL is not set -# CONFIG_CODA_FS is not set -# CONFIG_AFS_FS is not set -# CONFIG_EULER_FS is not set -CONFIG_NLS=y -CONFIG_NLS_DEFAULT="iso8859-1" -CONFIG_NLS_CODEPAGE_437=m -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_936 is not set -# CONFIG_NLS_CODEPAGE_950 is not set -# CONFIG_NLS_CODEPAGE_932 is not set -# CONFIG_NLS_CODEPAGE_949 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_CODEPAGE_1250 is not set -# CONFIG_NLS_CODEPAGE_1251 is not set -# CONFIG_NLS_ASCII is not set -CONFIG_NLS_ISO8859_1=m -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_ISO8859_13 is not set -# CONFIG_NLS_ISO8859_14 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NLS_KOI8_U is not set -# CONFIG_NLS_MAC_ROMAN is not set -# CONFIG_NLS_MAC_CELTIC is not set -# CONFIG_NLS_MAC_CENTEURO is not set -# CONFIG_NLS_MAC_CROATIAN is not set -# CONFIG_NLS_MAC_CYRILLIC is not set -# CONFIG_NLS_MAC_GAELIC is not set -# CONFIG_NLS_MAC_GREEK is not set -# CONFIG_NLS_MAC_ICELAND is not set -# CONFIG_NLS_MAC_INUIT is not set -# CONFIG_NLS_MAC_ROMANIAN is not set -# CONFIG_NLS_MAC_TURKISH is not set -CONFIG_NLS_UTF8=m -# CONFIG_UNICODE is not set -# end of File systems - -# -# Security options -# -CONFIG_KEYS=y -CONFIG_KEYS_REQUEST_CACHE=y -# CONFIG_PERSISTENT_KEYRINGS is not set -# CONFIG_TRUSTED_KEYS is not set -# CONFIG_ENCRYPTED_KEYS is not set -# CONFIG_KEY_DH_OPERATIONS is not set -CONFIG_SECURITY_DMESG_RESTRICT=y -CONFIG_SECURITY=y -CONFIG_SECURITYFS=y -CONFIG_SECURITY_NETWORK=y -# CONFIG_SECURITY_NETWORK_XFRM is not set -# CONFIG_SECURITY_PATH is not set -CONFIG_LSM_MMAP_MIN_ADDR=32768 -CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y -CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set -# CONFIG_FORTIFY_SOURCE is not set -# CONFIG_STATIC_USERMODEHELPER is not set -CONFIG_SECURITY_SELINUX=y -CONFIG_SECURITY_SELINUX_BOOTPARAM=y -# CONFIG_SECURITY_SELINUX_DISABLE is not set -CONFIG_SECURITY_SELINUX_DEVELOP=y -CONFIG_SECURITY_SELINUX_AVC_STATS=y -CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0 -CONFIG_SECURITY_SELINUX_SIDTAB_HASH_BITS=9 -CONFIG_SECURITY_SELINUX_SID2STR_CACHE_SIZE=256 -CONFIG_SECURITY_SMACK=y -# CONFIG_SECURITY_SMACK_BRINGUP is not set -# CONFIG_SECURITY_SMACK_NETFILTER is not set -# CONFIG_SECURITY_SMACK_APPEND_SIGNALS is not set -# CONFIG_SECURITY_TOMOYO is not set -# CONFIG_SECURITY_APPARMOR is not set -# CONFIG_SECURITY_LOADPIN is not set -CONFIG_SECURITY_YAMA=y -# CONFIG_SECURITY_SAFESETID is not set -# CONFIG_SECURITY_LOCKDOWN_LSM is not set -CONFIG_INTEGRITY=y -# CONFIG_INTEGRITY_SIGNATURE is not set -CONFIG_INTEGRITY_AUDIT=y -# CONFIG_IMA is not set -# CONFIG_EVM is not set -# CONFIG_DEFAULT_SECURITY_SELINUX is not set -# CONFIG_DEFAULT_SECURITY_SMACK is not set -CONFIG_DEFAULT_SECURITY_DAC=y -CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" - -# -# Kernel hardening options -# - -# -# Memory initialization -# -CONFIG_INIT_STACK_NONE=y -# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set -# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set -# end of Memory initialization -# end of Kernel hardening options - -CONFIG_SECURITY_BOOT_INIT=y -# end of Security options - -CONFIG_CRYPTO=y - -# -# Crypto core or helper -# -CONFIG_CRYPTO_ALGAPI=y -CONFIG_CRYPTO_ALGAPI2=y -CONFIG_CRYPTO_AEAD=m -CONFIG_CRYPTO_AEAD2=y -CONFIG_CRYPTO_SKCIPHER=m -CONFIG_CRYPTO_SKCIPHER2=y -CONFIG_CRYPTO_HASH=y -CONFIG_CRYPTO_HASH2=y -CONFIG_CRYPTO_RNG=y -CONFIG_CRYPTO_RNG2=y -CONFIG_CRYPTO_AKCIPHER2=y -CONFIG_CRYPTO_AKCIPHER=y -CONFIG_CRYPTO_KPP2=y -CONFIG_CRYPTO_ACOMP2=y -CONFIG_CRYPTO_MANAGER=y -CONFIG_CRYPTO_MANAGER2=y -# CONFIG_CRYPTO_USER is not set -CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y -CONFIG_CRYPTO_GF128MUL=m -CONFIG_CRYPTO_NULL=m -CONFIG_CRYPTO_NULL2=y -# CONFIG_CRYPTO_PCRYPT is not set -# CONFIG_CRYPTO_CRYPTD is not set -# CONFIG_CRYPTO_AUTHENC is not set -# CONFIG_CRYPTO_TEST is not set - -# -# Public-key cryptography -# -CONFIG_CRYPTO_RSA=y -# CONFIG_CRYPTO_DH is not set -# CONFIG_CRYPTO_ECDH is not set -# CONFIG_CRYPTO_ECDSA is not set -# CONFIG_CRYPTO_ECRDSA is not set -# CONFIG_CRYPTO_SM2 is not set -# CONFIG_CRYPTO_CURVE25519 is not set - -# -# Authenticated Encryption with Associated Data -# -CONFIG_CRYPTO_CCM=m -CONFIG_CRYPTO_GCM=m -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_ECHAINIV is not set - -# -# Block modes -# -# CONFIG_CRYPTO_CBC is not set -# CONFIG_CRYPTO_CFB is not set -CONFIG_CRYPTO_CTR=m -# CONFIG_CRYPTO_CTS is not set -CONFIG_CRYPTO_ECB=m -# CONFIG_CRYPTO_LRW is not set -# CONFIG_CRYPTO_OFB is not set -# CONFIG_CRYPTO_PCBC is not set -# CONFIG_CRYPTO_XTS is not set -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_ADIANTUM is not set -# CONFIG_CRYPTO_ESSIV is not set - -# -# Hash modes -# -CONFIG_CRYPTO_CMAC=m -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set - -# -# Digest -# -CONFIG_CRYPTO_CRC32C=y -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_XXHASH is not set -# CONFIG_CRYPTO_BLAKE2B is not set -# CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_CRCT10DIF is not set -CONFIG_CRYPTO_GHASH=m -# CONFIG_CRYPTO_POLY1305 is not set -CONFIG_CRYPTO_MD4=m -CONFIG_CRYPTO_MD5=y -CONFIG_CRYPTO_MICHAEL_MIC=m -# CONFIG_CRYPTO_RMD128 is not set -# CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set -CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA256=y -CONFIG_CRYPTO_SHA512=m -# CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set -# CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TGR192 is not set -# CONFIG_CRYPTO_WP512 is not set - -# -# Ciphers -# -CONFIG_CRYPTO_AES=m -# CONFIG_CRYPTO_AES_TI is not set -# CONFIG_CRYPTO_ANUBIS is not set -CONFIG_CRYPTO_ARC4=m -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_KHAZAD is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_SEED is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TEA is not set -# CONFIG_CRYPTO_TWOFISH is not set - -# -# Compression -# -# CONFIG_CRYPTO_DEFLATE is not set -# CONFIG_CRYPTO_LZO is not set -# CONFIG_CRYPTO_842 is not set -# CONFIG_CRYPTO_LZ4 is not set -# CONFIG_CRYPTO_LZ4HC is not set -# CONFIG_CRYPTO_ZSTD is not set - -# -# Random Number Generation -# -# CONFIG_CRYPTO_ANSI_CPRNG is not set -CONFIG_CRYPTO_DRBG_MENU=m -CONFIG_CRYPTO_DRBG_HMAC=y -# CONFIG_CRYPTO_DRBG_HASH is not set -# CONFIG_CRYPTO_DRBG_CTR is not set -CONFIG_CRYPTO_DRBG=m -CONFIG_CRYPTO_JITTERENTROPY=y -CONFIG_CRYPTO_USER_API=m -# CONFIG_CRYPTO_USER_API_HASH is not set -# CONFIG_CRYPTO_USER_API_SKCIPHER is not set -# CONFIG_CRYPTO_USER_API_RNG is not set -CONFIG_CRYPTO_USER_API_AEAD=m -CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y -CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -CONFIG_CRYPTO_LIB_AES=m -CONFIG_CRYPTO_LIB_ARC4=m -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_DES=m -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_LIB_SHA256=y -# CONFIG_CRYPTO_HW is not set -CONFIG_ASYMMETRIC_KEY_TYPE=y -CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y -CONFIG_X509_CERTIFICATE_PARSER=y -# CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set -CONFIG_PKCS7_MESSAGE_PARSER=y -# CONFIG_PKCS7_TEST_KEY is not set -# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set -# CONFIG_PGP_LIBRARY is not set -# CONFIG_PGP_KEY_PARSER is not set -# CONFIG_PGP_PRELOAD is not set - -# -# Certificates for signature checking -# -CONFIG_MODULE_SIG_KEY="" -CONFIG_SYSTEM_TRUSTED_KEYRING=y -CONFIG_SYSTEM_TRUSTED_KEYS="" -CONFIG_SYSTEM_EXTRA_CERTIFICATE=y -CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=4096 -# CONFIG_SECONDARY_TRUSTED_KEYRING is not set -# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set -# CONFIG_PGP_PRELOAD_PUBLIC_KEYS is not set -# end of Certificates for signature checking - -CONFIG_BINARY_PRINTF=y - -# -# Library routines -# -# CONFIG_PACKING is not set -CONFIG_BITREVERSE=y -CONFIG_HAVE_ARCH_BITREVERSE=y -CONFIG_GENERIC_STRNCPY_FROM_USER=y -CONFIG_GENERIC_STRNLEN_USER=y -CONFIG_GENERIC_NET_UTILS=y -# CONFIG_CORDIC is not set -# CONFIG_PRIME_NUMBERS is not set -CONFIG_RATIONAL=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y -CONFIG_ARCH_HAS_FAST_MULTIPLIER=y -CONFIG_ARCH_USE_SYM_ANNOTATIONS=y -# CONFIG_INDIRECT_PIO is not set -CONFIG_CRC_CCITT=m -CONFIG_CRC16=y -# CONFIG_CRC_T10DIF is not set -# CONFIG_CRC_ITU_T is not set -CONFIG_CRC32=y -# CONFIG_CRC32_SELFTEST is not set -CONFIG_CRC32_SLICEBY8=y -# CONFIG_CRC32_SLICEBY4 is not set -# CONFIG_CRC32_SARWATE is not set -# CONFIG_CRC32_BIT is not set -# CONFIG_CRC64 is not set -# CONFIG_CRC4 is not set -# CONFIG_CRC7 is not set -CONFIG_LIBCRC32C=m -# CONFIG_CRC8 is not set -CONFIG_XXHASH=y -CONFIG_AUDIT_GENERIC=y -CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y -CONFIG_AUDIT_COMPAT_GENERIC=y -# CONFIG_RANDOM32_SELFTEST is not set -CONFIG_ZLIB_INFLATE=y -CONFIG_ZLIB_DEFLATE=m -CONFIG_LZO_COMPRESS=m -CONFIG_LZO_DECOMPRESS=m -CONFIG_XZ_DEC=y -# CONFIG_XZ_DEC_X86 is not set -# CONFIG_XZ_DEC_POWERPC is not set -# CONFIG_XZ_DEC_IA64 is not set -CONFIG_XZ_DEC_ARM=y -CONFIG_XZ_DEC_ARMTHUMB=y -# CONFIG_XZ_DEC_SPARC is not set -CONFIG_XZ_DEC_BCJ=y -# CONFIG_XZ_DEC_TEST is not set -CONFIG_DECOMPRESS_GZIP=y -CONFIG_DECOMPRESS_LZMA=y -CONFIG_GENERIC_ALLOCATOR=y -CONFIG_ASSOCIATIVE_ARRAY=y -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT_MAP=y -CONFIG_HAS_DMA=y -CONFIG_NEED_SG_DMA_LENGTH=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_DMA_DECLARE_COHERENT=y -CONFIG_ARCH_HAS_SETUP_DMA_OPS=y -CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y -CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y -CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y -CONFIG_SWIOTLB=y -CONFIG_DMA_NONCOHERENT_MMAP=y -CONFIG_DMA_COHERENT_POOL=y -CONFIG_DMA_REMAP=y -CONFIG_DMA_DIRECT_REMAP=y -# CONFIG_DMA_API_DEBUG is not set -CONFIG_SGL_ALLOC=y -CONFIG_CPU_RMAP=y -CONFIG_DQL=y -CONFIG_GLOB=y -# CONFIG_GLOB_SELFTEST is not set -CONFIG_NLATTR=y -CONFIG_CLZ_TAB=y -# CONFIG_IRQ_POLL is not set -CONFIG_MPILIB=y -CONFIG_LIBFDT=y -CONFIG_OID_REGISTRY=y -CONFIG_UCS2_STRING=y -CONFIG_HAVE_GENERIC_VDSO=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_GENERIC_VDSO_TIME_NS=y -CONFIG_FONT_SUPPORT=y -CONFIG_FONT_8x16=y -CONFIG_FONT_AUTOSELECT=y -CONFIG_SG_POOL=y -CONFIG_ARCH_HAS_PMEM_API=y -CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y -CONFIG_ARCH_STACKWALK=y -CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set -# end of Library routines - -# -# Kernel hacking -# - -# -# printk and dmesg options -# -CONFIG_PRINTK_TIME=y -# CONFIG_PRINTK_CALLER is not set -CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 -CONFIG_CONSOLE_LOGLEVEL_QUIET=4 -CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 -# CONFIG_BOOT_PRINTK_DELAY is not set -# CONFIG_DYNAMIC_DEBUG is not set -# CONFIG_DYNAMIC_DEBUG_CORE is not set -# CONFIG_SYMBOLIC_ERRNAME is not set -CONFIG_DEBUG_BUGVERBOSE=y -# end of printk and dmesg options - -# -# Compile-time checks and compiler options -# -CONFIG_DEBUG_INFO=y -# CONFIG_DEBUG_INFO_REDUCED is not set -# CONFIG_DEBUG_INFO_COMPRESSED is not set -# CONFIG_DEBUG_INFO_SPLIT is not set -# CONFIG_DEBUG_INFO_DWARF4 is not set -# CONFIG_DEBUG_INFO_BTF is not set -# CONFIG_GDB_SCRIPTS is not set -CONFIG_ENABLE_MUST_CHECK=y -CONFIG_FRAME_WARN=2048 -# CONFIG_STRIP_ASM_SYMS is not set -# CONFIG_READABLE_ASM is not set -# CONFIG_HEADERS_INSTALL is not set -# CONFIG_DEBUG_SECTION_MISMATCH is not set -CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_ARCH_WANT_FRAME_POINTERS=y -CONFIG_FRAME_POINTER=y -# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set -# end of Compile-time checks and compiler options - -# -# Generic Kernel Debugging Instruments -# -CONFIG_MAGIC_SYSRQ=y -CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 -# CONFIG_MAGIC_SYSRQ_SERIAL is not set -CONFIG_DEBUG_FS=y -CONFIG_DEBUG_FS_ALLOW_ALL=y -# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set -# CONFIG_DEBUG_FS_ALLOW_NONE is not set -CONFIG_HAVE_ARCH_KGDB=y -# CONFIG_KGDB is not set -CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y -# CONFIG_UBSAN is not set -# end of Generic Kernel Debugging Instruments - -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_MISC is not set - -# -# Memory Debugging -# -# CONFIG_PAGE_EXTENSION is not set -# CONFIG_DEBUG_PAGEALLOC is not set -# CONFIG_PAGE_OWNER is not set -# CONFIG_PAGE_POISONING is not set -# CONFIG_DEBUG_PAGE_REF is not set -# CONFIG_DEBUG_RODATA_TEST is not set -CONFIG_ARCH_HAS_DEBUG_WX=y -# CONFIG_DEBUG_WX is not set -CONFIG_GENERIC_PTDUMP=y -# CONFIG_PTDUMP_DEBUGFS is not set -# CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_STATS is not set -CONFIG_HAVE_DEBUG_KMEMLEAK=y -CONFIG_DEBUG_KMEMLEAK=y -CONFIG_DEBUG_KMEMLEAK_MEM_POOL_SIZE=2000 -# CONFIG_DEBUG_KMEMLEAK_TEST is not set -CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y -# CONFIG_DEBUG_KMEMLEAK_AUTO_SCAN is not set -CONFIG_DEBUG_STACK_USAGE=y -CONFIG_SCHED_STACK_END_CHECK=y -CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y -# CONFIG_DEBUG_VM is not set -# CONFIG_DEBUG_VM_PGTABLE is not set -CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y -# CONFIG_DEBUG_VIRTUAL is not set -# CONFIG_DEBUG_MEMORY_INIT is not set -# CONFIG_DEBUG_PER_CPU_MAPS is not set -CONFIG_HAVE_ARCH_KASAN=y -CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y -CONFIG_CC_HAS_KASAN_GENERIC=y -# end of Memory Debugging - -# CONFIG_DEBUG_SHIRQ is not set - -# -# Debug Oops, Lockups and Hangs -# -CONFIG_PANIC_ON_OOPS=y -CONFIG_PANIC_ON_OOPS_VALUE=1 -CONFIG_PANIC_TIMEOUT=0 -CONFIG_LOCKUP_DETECTOR=y -CONFIG_SOFTLOCKUP_DETECTOR=y -# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 - -# -# ARM64 NMI watchdog configuration -# -# end of ARM64 NMI watchdog configuration - -CONFIG_DETECT_HUNG_TASK=y -CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 -CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=1 -# CONFIG_WQ_WATCHDOG is not set -# CONFIG_TEST_LOCKUP is not set -# end of Debug Oops, Lockups and Hangs - -# -# Scheduler Debugging -# -# CONFIG_SCHED_DEBUG is not set -CONFIG_SCHED_INFO=y -# CONFIG_SCHEDSTATS is not set -# end of Scheduler Debugging - -# CONFIG_DEBUG_TIMEKEEPING is not set -# CONFIG_DEBUG_PREEMPT is not set - -# -# Lock Debugging (spinlocks, mutexes, etc...) -# -CONFIG_LOCK_DEBUGGING_SUPPORT=y -# CONFIG_PROVE_LOCKING is not set -# CONFIG_LOCK_STAT is not set -# CONFIG_DEBUG_RT_MUTEXES is not set -# CONFIG_DEBUG_SPINLOCK is not set -# CONFIG_DEBUG_MUTEXES is not set -# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set -# CONFIG_DEBUG_RWSEMS is not set -# CONFIG_DEBUG_LOCK_ALLOC is not set -CONFIG_DEBUG_ATOMIC_SLEEP=y -# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -# CONFIG_LOCK_TORTURE_TEST is not set -# CONFIG_WW_MUTEX_SELFTEST is not set -# CONFIG_SCF_TORTURE_TEST is not set -# CONFIG_CSD_LOCK_WAIT_DEBUG is not set -# end of Lock Debugging (spinlocks, mutexes, etc...) - -CONFIG_STACKTRACE=y -# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set -# CONFIG_DEBUG_KOBJECT is not set -CONFIG_HAVE_DEBUG_BUGVERBOSE=y - -# -# Debug kernel data structures -# -# CONFIG_DEBUG_LIST is not set -# CONFIG_DEBUG_PLIST is not set -CONFIG_DEBUG_SG=y -# CONFIG_DEBUG_NOTIFIERS is not set -# CONFIG_BUG_ON_DATA_CORRUPTION is not set -# end of Debug kernel data structures - -# CONFIG_DEBUG_CREDENTIALS is not set - -# -# RCU Debugging -# -# CONFIG_RCU_SCALE_TEST is not set -# CONFIG_RCU_TORTURE_TEST is not set -# CONFIG_RCU_REF_SCALE_TEST is not set -CONFIG_RCU_CPU_STALL_TIMEOUT=65 -# CONFIG_RCU_TRACE is not set -# CONFIG_RCU_EQS_DEBUG is not set -# CONFIG_RCU_STRICT_GRACE_PERIOD is not set -# end of RCU Debugging - -# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set -# CONFIG_LATENCYTOP is not set -CONFIG_NOP_TRACER=y -CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y -CONFIG_HAVE_DYNAMIC_FTRACE=y -CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y -CONFIG_HAVE_SYSCALL_TRACEPOINTS=y -CONFIG_HAVE_C_RECORDMCOUNT=y -CONFIG_TRACER_MAX_TRACE=y -CONFIG_TRACE_CLOCK=y -CONFIG_RING_BUFFER=y -CONFIG_EVENT_TRACING=y -CONFIG_CONTEXT_SWITCH_TRACER=y -CONFIG_TRACING=y -CONFIG_GENERIC_TRACER=y -CONFIG_TRACING_SUPPORT=y -CONFIG_FTRACE=y -# CONFIG_BOOTTIME_TRACING is not set -CONFIG_FUNCTION_TRACER=y -# CONFIG_FUNCTION_GRAPH_TRACER is not set -CONFIG_DYNAMIC_FTRACE=y -# CONFIG_FUNCTION_PROFILER is not set -# CONFIG_STACK_TRACER is not set -# CONFIG_IRQSOFF_TRACER is not set -# CONFIG_PREEMPT_TRACER is not set -CONFIG_SCHED_TRACER=y -# CONFIG_HWLAT_TRACER is not set -# CONFIG_FTRACE_SYSCALLS is not set -CONFIG_TRACER_SNAPSHOT=y -# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set -CONFIG_BRANCH_PROFILE_NONE=y -# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set -# CONFIG_PROFILE_ALL_BRANCHES is not set -# CONFIG_BLK_DEV_IO_TRACE is not set -CONFIG_KPROBE_EVENTS=y -# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set -CONFIG_DYNAMIC_EVENTS=y -CONFIG_PROBE_EVENTS=y -CONFIG_FTRACE_MCOUNT_RECORD=y -# CONFIG_SYNTH_EVENTS is not set -# CONFIG_HIST_TRIGGERS is not set -# CONFIG_TRACE_EVENT_INJECT is not set -# CONFIG_TRACEPOINT_BENCHMARK is not set -# CONFIG_RING_BUFFER_BENCHMARK is not set -# CONFIG_TRACE_EVAL_MAP_FILE is not set -# CONFIG_FTRACE_STARTUP_TEST is not set -# CONFIG_RING_BUFFER_STARTUP_TEST is not set -# CONFIG_PREEMPTIRQ_DELAY_TEST is not set -# CONFIG_KPROBE_EVENT_GEN_TEST is not set -# CONFIG_SAMPLES is not set -CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y -CONFIG_STRICT_DEVMEM=y -CONFIG_IO_STRICT_DEVMEM=y - -# -# arm64 Debugging -# -# CONFIG_PID_IN_CONTEXTIDR is not set -# CONFIG_DEBUG_EFI is not set -# CONFIG_ARM64_RELOC_TEST is not set -# CONFIG_CORESIGHT is not set -# end of arm64 Debugging - -# -# Kernel Testing and Coverage -# -# CONFIG_KUNIT is not set -# CONFIG_NOTIFIER_ERROR_INJECTION is not set -CONFIG_FUNCTION_ERROR_INJECTION=y -# CONFIG_FAULT_INJECTION is not set -CONFIG_ARCH_HAS_KCOV=y -CONFIG_CC_HAS_SANCOV_TRACE_PC=y -# CONFIG_KCOV is not set -# CONFIG_RUNTIME_TESTING_MENU is not set -# CONFIG_MEMTEST is not set -# end of Kernel Testing and Coverage -# end of Kernel hacking diff --git a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb index f22b3571eca..f15be3bb109 100644 --- a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb +++ b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb @@ -32,27 +32,27 @@ KERNEL_IMAGETYPE ?= "Image" # kernel-base becomes kernel-${KERNEL_VERSION} # kernel-image becomes kernel-image-${KERNEL_VERSION} PACKAGES = "${PN} ${KERNEL_PACKAGE_NAME} ${KERNEL_PACKAGE_NAME}-base ${KERNEL_PACKAGE_NAME}-vmlinux ${KERNEL_PACKAGE_NAME}-image ${KERNEL_PACKAGE_NAME}-dev ${KERNEL_PACKAGE_NAME}-modules" -FILES:${PN} = "" -FILES:${KERNEL_PACKAGE_NAME}-base = "${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.order ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.builtin ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.builtin.modinfo" -FILES:${KERNEL_PACKAGE_NAME}-image = "/boot/Image-${KERNEL_VERSION} /boot/vmlinux-${KERNEL_VERSION}" -FILES:${KERNEL_PACKAGE_NAME}-dev = "/boot/System.map* /boot/Module.symvers* /boot/config* ${KERNEL_SRC_PATH} ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/build" -FILES:${KERNEL_PACKAGE_NAME}-vmlinux = "/boot/vmlinux-${KERNEL_VERSION_NAME}" -FILES:${KERNEL_PACKAGE_NAME}-modules = "" -RDEPENDS:${KERNEL_PACKAGE_NAME} = "${KERNEL_PACKAGE_NAME}-base (= ${EXTENDPKGV})" +FILES_${PN} = "" +FILES_${KERNEL_PACKAGE_NAME}-base = "${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.order ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.builtin ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.builtin.modinfo" +FILES_${KERNEL_PACKAGE_NAME}-image = "/boot/Image-${KERNEL_VERSION} /boot/vmlinux-${KERNEL_VERSION}" +FILES_${KERNEL_PACKAGE_NAME}-dev = "/boot/System.map* /boot/Module.symvers* /boot/config* ${KERNEL_SRC_PATH} ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/build" +FILES_${KERNEL_PACKAGE_NAME}-vmlinux = "/boot/vmlinux-${KERNEL_VERSION_NAME}" +FILES_${KERNEL_PACKAGE_NAME}-modules = "" +RDEPENDS_${KERNEL_PACKAGE_NAME} = "${KERNEL_PACKAGE_NAME}-base (= ${EXTENDPKGV})" # Allow machines to override this dependency if kernel image files are # not wanted in images as standard -RDEPENDS:${KERNEL_PACKAGE_NAME}-base ?= "${KERNEL_PACKAGE_NAME}-image (= ${EXTENDPKGV})" -PKG:${KERNEL_PACKAGE_NAME}-image = "${KERNEL_PACKAGE_NAME}-image-${@legitimize_package_name(d.getVar('KERNEL_VERSION'))}" -RDEPENDS:${KERNEL_PACKAGE_NAME}-image += "${@oe.utils.conditional('KERNEL_IMAGETYPE', 'vmlinux', '${KERNEL_PACKAGE_NAME}-vmlinux (= ${EXTENDPKGV})', '', d)}" -PKG:${KERNEL_PACKAGE_NAME}-base = "${KERNEL_PACKAGE_NAME}-${@legitimize_package_name(d.getVar('KERNEL_VERSION'))}" -RPROVIDES:${KERNEL_PACKAGE_NAME}-base += "${KERNEL_PACKAGE_NAME}-${KERNEL_VERSION}" -ALLOW_EMPTY:${KERNEL_PACKAGE_NAME} = "1" -ALLOW_EMPTY:${KERNEL_PACKAGE_NAME}-base = "1" -ALLOW_EMPTY:${KERNEL_PACKAGE_NAME}-image = "1" -ALLOW_EMPTY:${KERNEL_PACKAGE_NAME}-modules = "1" -DESCRIPTION:${KERNEL_PACKAGE_NAME}-modules = "Kernel modules meta package" - -#PACKAGESPLITFUNCS:prepend = "split_kernel_packages " +RDEPENDS_${KERNEL_PACKAGE_NAME}-base ?= "${KERNEL_PACKAGE_NAME}-image (= ${EXTENDPKGV})" +PKG_${KERNEL_PACKAGE_NAME}-image = "${KERNEL_PACKAGE_NAME}-image-${@legitimize_package_name(d.getVar('KERNEL_VERSION'))}" +RDEPENDS_${KERNEL_PACKAGE_NAME}-image += "${@oe.utils.conditional('KERNEL_IMAGETYPE', 'vmlinux', '${KERNEL_PACKAGE_NAME}-vmlinux (= ${EXTENDPKGV})', '', d)}" +PKG_${KERNEL_PACKAGE_NAME}-base = "${KERNEL_PACKAGE_NAME}-${@legitimize_package_name(d.getVar('KERNEL_VERSION'))}" +RPROVIDES_${KERNEL_PACKAGE_NAME}-base += "${KERNEL_PACKAGE_NAME}-${KERNEL_VERSION}" +ALLOW_EMPTY_${KERNEL_PACKAGE_NAME} = "1" +ALLOW_EMPTY_${KERNEL_PACKAGE_NAME}-base = "1" +ALLOW_EMPTY_${KERNEL_PACKAGE_NAME}-image = "1" +ALLOW_EMPTY_${KERNEL_PACKAGE_NAME}-modules = "1" +DESCRIPTION_${KERNEL_PACKAGE_NAME}-modules = "Kernel modules meta package" + +#PACKAGESPLITFUNCS_prepend = "split_kernel_packages " inherit kernel-artifact-names inherit kernel-devicetree #INHIBIT_DEFAULT_DEPS = "1" @@ -62,13 +62,13 @@ COMPATIBLE_HOST = ".*-linux" PR = "r1" SRC_URI = "file://kernel-5.10 \ - file://kernel-defconfig \ + file://yocto-embedded-tools/config/arm64/defconfig-kernel \ " S = "${WORKDIR}/kernel-5.10" B = "${WORKDIR}/build" KERNEL_CONFIG_COMMAND ?= "oe_runmake_call -C ${S} CC="${KERNEL_CC}" LD="${KERNEL_LD}" O=${B} olddefconfig || oe_runmake -C ${S} O=${B} CC="${KERNEL_CC}" LD="${KERNEL_LD}" oldnoconfig" -KCONFIG_CONFIG_COMMAND:append = " LD='${KERNEL_LD}' HOSTLDFLAGS='${BUILD_LDFLAGS}'" +KCONFIG_CONFIG_COMMAND_append = " LD='${KERNEL_LD}' HOSTLDFLAGS='${BUILD_LDFLAGS}'" KERNEL_RELEASE ?= "${KERNEL_VERSION}" # The directory where built kernel lies in the kernel tree @@ -95,7 +95,7 @@ python do_symlink_kernsrc () { addtask symlink_kernsrc before do_patch do_configure after do_unpack do_configure() { - cp ../kernel-defconfig .config + cp ../yocto-embedded-tools/config/arm64/defconfig-kernel .config set -e unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS oe_runmake -C ${S} ARCH=arm64 mrproper -- Gitee From 2923608cb5b2bc2531970f7afeb73f446b654d4d Mon Sep 17 00:00:00 2001 From: lisimin Date: Thu, 16 Sep 2021 18:10:51 +0800 Subject: [PATCH 007/304] support get RPMDEPS installed at host Signed-off-by: lisimin --- meta-openeuler/classes/get_rpmdeps.bbclass | 2 +- meta-openeuler/conf/distro/openeuler.conf | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/meta-openeuler/classes/get_rpmdeps.bbclass b/meta-openeuler/classes/get_rpmdeps.bbclass index 28583665bb2..cd032815642 100644 --- a/meta-openeuler/classes/get_rpmdeps.bbclass +++ b/meta-openeuler/classes/get_rpmdeps.bbclass @@ -1,7 +1,7 @@ python set_rpmdeps() { import subprocess rpmdeps = d.getVar('RPMDEPS', True) - if not rpmdeps: + if not rpmdeps or rpmdeps == "default": rpmdeps = subprocess.Popen('rpm --eval="%{_rpmconfigdir}"', shell=True, stdout=subprocess.PIPE) stdout, stderr = rpmdeps.communicate() d.setVar('RPMDEPS', os.path.join(str(stdout, "utf-8").strip(), "rpmdeps")) diff --git a/meta-openeuler/conf/distro/openeuler.conf b/meta-openeuler/conf/distro/openeuler.conf index a199305016e..7c98f752e71 100644 --- a/meta-openeuler/conf/distro/openeuler.conf +++ b/meta-openeuler/conf/distro/openeuler.conf @@ -75,5 +75,6 @@ INHIBIT_PACKAGE_DEBUG_SPLIT = "1" DEPENDS_remove += "cmake-native ninja-native" #DL_DIR = "${LOCAL_FILES}" DL_DIR = "downloads" +export RPMDEPS = "default" INHERIT += "get_dl_dir get_rpmdeps" do_fetch[file-checksums] = "" -- Gitee From 4feee445fb133001ee1bc4b89437c1f90a6f6acd Mon Sep 17 00:00:00 2001 From: lisimin Date: Fri, 17 Sep 2021 16:36:37 +0800 Subject: [PATCH 008/304] build linux kernel zImage Signed-off-by: lisimin --- meta-openeuler/recipes-kernel/linux/linux-openeuler.bb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb index f15be3bb109..779707946e3 100644 --- a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb +++ b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb @@ -26,15 +26,15 @@ KERNEL_CLASSES ?= " kernel-uimage " inherit ${KERNEL_CLASSES} KERNEL_VERSION = "${@get_kernelversion_headers('${B}')}" -KERNEL_IMAGETYPE_FOR_MAKE = "Image" +KERNEL_IMAGETYPE_FOR_MAKE = "zImage" KERNEL_PACKAGE_NAME ??= "kernel" -KERNEL_IMAGETYPE ?= "Image" +KERNEL_IMAGETYPE ?= "zImage" # kernel-base becomes kernel-${KERNEL_VERSION} # kernel-image becomes kernel-image-${KERNEL_VERSION} PACKAGES = "${PN} ${KERNEL_PACKAGE_NAME} ${KERNEL_PACKAGE_NAME}-base ${KERNEL_PACKAGE_NAME}-vmlinux ${KERNEL_PACKAGE_NAME}-image ${KERNEL_PACKAGE_NAME}-dev ${KERNEL_PACKAGE_NAME}-modules" FILES_${PN} = "" FILES_${KERNEL_PACKAGE_NAME}-base = "${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.order ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.builtin ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.builtin.modinfo" -FILES_${KERNEL_PACKAGE_NAME}-image = "/boot/Image-${KERNEL_VERSION} /boot/vmlinux-${KERNEL_VERSION}" +FILES_${KERNEL_PACKAGE_NAME}-image = "/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION} /boot/vmlinux-${KERNEL_VERSION}" FILES_${KERNEL_PACKAGE_NAME}-dev = "/boot/System.map* /boot/Module.symvers* /boot/config* ${KERNEL_SRC_PATH} ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/build" FILES_${KERNEL_PACKAGE_NAME}-vmlinux = "/boot/vmlinux-${KERNEL_VERSION_NAME}" FILES_${KERNEL_PACKAGE_NAME}-modules = "" @@ -63,6 +63,7 @@ PR = "r1" SRC_URI = "file://kernel-5.10 \ file://yocto-embedded-tools/config/arm64/defconfig-kernel \ + file://yocto-embedded-tools/patches/arm64/0001-arm64-add-zImage-support-for-arm64.patch \ " S = "${WORKDIR}/kernel-5.10" B = "${WORKDIR}/build" -- Gitee From bd8ccbb58c7fa1ed292b0fa4e7cd92680ba34bc0 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Tue, 26 Oct 2021 12:08:26 +0800 Subject: [PATCH 009/304] modify hosttools and distro for security software compilation Signed-off-by: zhuyan --- meta-openeuler/conf/distro/openeuler.conf | 2 +- meta-openeuler/conf/local.conf.sample | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/meta-openeuler/conf/distro/openeuler.conf b/meta-openeuler/conf/distro/openeuler.conf index 7c98f752e71..af415eaf7cd 100644 --- a/meta-openeuler/conf/distro/openeuler.conf +++ b/meta-openeuler/conf/distro/openeuler.conf @@ -14,7 +14,7 @@ LOCALCONF_VERSION = "2" # Override these in poky based distros #OPENEULER_DEFAULT_DISTRO_FEATURES = "largefile opengl ptest multiarch wayland vulkan" -OPENEULER_DEFAULT_DISTRO_FEATURES = "" +OPENEULER_DEFAULT_DISTRO_FEATURES = "pam" #OPENEULER_DEFAULT_EXTRA_RDEPENDS = "packagegroup-core-boot" #OPENEULER_DEFAULT_EXTRA_RRECOMMENDS = "kernel-module-af-packet" diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index e5404a9edf6..4f6857da912 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -271,7 +271,7 @@ BB_DISKMON_DIRS ??= "\ # track the version of this file when it was generated. This can safely be ignored if # this doesn't mean anything to you. CONF_VERSION = "2" -HOSTTOOLS += "patchelf python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja xz" +HOSTTOOLS += "patchelf python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader autoupdate libtool libtoolize pkg-config" HOSTTOOLS_remove += "diffstat lz4c pzstd rpcgen" SANITY_REQUIRED_UTILITIES_remove += "diffstat chrpath" CONNECTIVITY_CHECK_URIS = "" @@ -298,3 +298,4 @@ https://.*/.* file:////usr1/openeuler/src \n" #STAMP = "${STAMPS_DIR}/${MULTIMACH_TARGET_SYS}/${PN}/${EXTENDPE}${PV}" #WORKDIR = "${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}/${PN}/${EXTENDPE}${PV}" LOCAL_SYSROOT_DL_DIR = "/usr1/openeuler/gcc/" +LOCAL_FILES = "/usr1/openeuler/src/" -- Gitee From def1dce78fc7bb2c9d4fe2ecaba8fc3f9edd2f06 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Tue, 26 Oct 2021 12:08:27 +0800 Subject: [PATCH 010/304] add autotools.bbclass Signed-off-by: zhuyan --- meta-openeuler/classes/autotools.bbclass | 286 +++++++++++++++++++++++ 1 file changed, 286 insertions(+) create mode 100644 meta-openeuler/classes/autotools.bbclass diff --git a/meta-openeuler/classes/autotools.bbclass b/meta-openeuler/classes/autotools.bbclass new file mode 100644 index 00000000000..ae70509f1fc --- /dev/null +++ b/meta-openeuler/classes/autotools.bbclass @@ -0,0 +1,286 @@ +def autotools_xxxx(d): + if d.getVar('INHIBIT_AUTOTOOLS_DEPS'): + return '' + + pn = d.getVar('PN') + deps = '' + + if pn in ['autoconf-native', 'automake-native']: + return deps + deps += 'autoconf-native automake-native ' + + if not pn in ['libtool', 'libtool-native'] and not pn.endswith("libtool-cross"): + if not bb.data.inherits_class('native', d) \ + and not bb.data.inherits_class('nativesdk', d) \ + and not bb.data.inherits_class('cross', d) \ + and not d.getVar('INHIBIT_DEFAULT_DEPS'): + image_name = "%s%s" % (d.getVar('MACHINE_ARCH'), d.getVar('OPENEULER_KERNEL_TAG')) + #if image_name in ['arm32a15eb-4.4', 'arm32a9eb-4.4', 'arm32a9eb-tiny-4.4', 'arm64eb-4.4']: + #deps += ' ' + #else: + #deps += 'libtool-cross ' + + return deps + 'gnu-config-native ' + +DEPENDS_prepend = "${@autotools_xxxx(d)} " + +inherit siteinfo + +# Space separated list of shell scripts with variables defined to supply test +# results for autoconf tests we cannot run at build time. +# The value of this variable is filled in in a prefunc because it depends on +# the contents of the sysroot. +export CONFIG_SITE = "${@siteinfo_get_files(d)}" +acpaths ?= "default" +EXTRA_AUTORECONF_DEFINE = " AUTOPOINT=echo " + +export lt_cv_sys_lib_dlsearch_path_spec = "${libdir} ${base_libdir}" + +# When building tools for use at build-time it's recommended for the build +# system to use these variables when cross-compiling. +# (http://sources.redhat.com/autobook/autobook/autobook_270.html) +export CPP_FOR_BUILD = "${BUILD_CPP}" +export CPPFLAGS_FOR_BUILD = "${BUILD_CPPFLAGS}" + +export CC_FOR_BUILD = "${BUILD_CC}" +export CFLAGS_FOR_BUILD = "${BUILD_CFLAGS}" + +export CXX_FOR_BUILD = "${BUILD_CXX}" +export CXXFLAGS_FOR_BUILD="${BUILD_CXXFLAGS}" + +export LD_FOR_BUILD = "${BUILD_LD}" +export LDFLAGS_FOR_BUILD = "${BUILD_LDFLAGS}" + +def append_libtool_sysroot(d): + # Only supply libtool sysroot option for non-native packages + return "" + +CONFIGUREOPTS = " --build=${BUILD_SYS} \ + --host=${HOST_SYS} \ + --target=${TARGET_SYS} \ + --prefix=${prefix} \ + --exec_prefix=${exec_prefix} \ + --bindir=${bindir} \ + --sbindir=${sbindir} \ + --libexecdir=${libexecdir} \ + --datadir=${datadir} \ + --sysconfdir=${sysconfdir} \ + --sharedstatedir=${sharedstatedir} \ + --localstatedir=${localstatedir} \ + --libdir=${libdir} \ + --includedir=${includedir} \ + --oldincludedir=${oldincludedir} \ + --infodir=${infodir} \ + --mandir=${mandir} \ + --disable-silent-rules \ + ${CONFIGUREOPT_DEPTRACK} \ + ${@append_libtool_sysroot(d)}" +CONFIGUREOPT_DEPTRACK ?= "--disable-dependency-tracking" + +CACHED_CONFIGUREVARS ?= "" + +AUTOTOOLS_SCRIPT_PATH ?= "${S}" +CONFIGURE_SCRIPT ?= "${AUTOTOOLS_SCRIPT_PATH}/configure" + +AUTOTOOLS_AUXDIR ?= "${AUTOTOOLS_SCRIPT_PATH}" + +oe_runconf () { + # Use relative path to avoid buildpaths in files + cfgscript_name="`basename ${CONFIGURE_SCRIPT}`" + cfgscript=`python3 -c "import os; print(os.path.relpath(os.path.dirname('${CONFIGURE_SCRIPT}'), '.'))"`/$cfgscript_name + if [ -x "$cfgscript" ] ; then + bbnote "Running $cfgscript ${CONFIGUREOPTS} ${EXTRA_OECONF} $@" + if ! CONFIG_SHELL=/bin/bash ${CACHED_CONFIGUREVARS} $cfgscript ${CONFIGUREOPTS} ${EXTRA_OECONF} "$@"; then + bbnote "The following config.log files may provide further information." + bbnote `find ${B} -ignore_readdir_race -type f -name config.log` + bbfatal_log "configure failed" + fi + else + bbfatal "no configure script found at $cfgscript" + fi +} + +CONFIGURESTAMPFILE = "${WORKDIR}/configure.sstate" + +autotools_preconfigure() { + if [ -n "${CONFIGURESTAMPFILE}" -a -e "${CONFIGURESTAMPFILE}" ]; then + if [ "`cat ${CONFIGURESTAMPFILE}`" != "${BB_TASKHASH}" ]; then + if [ "${S}" != "${B}" ]; then + echo "Previously configured separate build directory detected, cleaning ${B}" + rm -rf ${B} + mkdir -p ${B} + else + # At least remove the .la files since automake won't automatically + # regenerate them even if CFLAGS/LDFLAGS are different + cd ${S} + if [ "${CLEANBROKEN}" != "1" -a \( -e Makefile -o -e makefile -o -e GNUmakefile \) ]; then + oe_runmake clean + fi + find ${S} -ignore_readdir_race -name \*.la -delete + fi + fi + fi +} + +autotools_postconfigure(){ + if [ -n "${CONFIGURESTAMPFILE}" ]; then + mkdir -p `dirname ${CONFIGURESTAMPFILE}` + echo ${BB_TASKHASH} > ${CONFIGURESTAMPFILE} + fi +} + +EXTRACONFFUNCS ??= "" + +EXTRA_OECONF_append = " ${PACKAGECONFIG_CONFARGS}" + +do_configure[prefuncs] += "autotools_preconfigure autotools_aclocals ${EXTRACONFFUNCS}" +#do_compile[prefuncs] += "autotools_aclocals" +#do_install[prefuncs] += "autotools_aclocals" +do_configure[postfuncs] += "autotools_postconfigure" + +ACLOCALDIR = "${STAGING_DATADIR}/aclocal" +ACLOCALEXTRAPATH = "" +ACLOCALEXTRAPATH_class-target = " -I ${STAGING_DATADIR_NATIVE}/aclocal/" +ACLOCALEXTRAPATH_class-nativesdk = " -I ${STAGING_DATADIR_NATIVE}/aclocal/" + +python autotools_aclocals () { + d.setVar("CONFIG_SITE", siteinfo_get_files(d, sysrootcache=True)) +} + +CONFIGURE_FILES = "${S}/configure.in ${S}/configure.ac ${S}/config.h.in ${S}/acinclude.m4 Makefile.am" + +autotools_do_configure() { + # WARNING: gross hack follows: + # An autotools built package generally needs these scripts, however only + # automake or libtoolize actually install the current versions of them. + # This is a problem in builds that do not use libtool or automake, in the case + # where we -need- the latest version of these scripts. e.g. running a build + # for a package whose autotools are old, on an x86_64 machine, which the old + # config.sub does not support. Work around this by installing them manually + # regardless. + + PRUNE_M4="" + + for ac in `find ${S} -ignore_readdir_race -name configure.in -o -name configure.ac`; do + rm -f `dirname $ac`/configure + done + if [ -e ${AUTOTOOLS_SCRIPT_PATH}/configure.in -o -e ${AUTOTOOLS_SCRIPT_PATH}/configure.ac ]; then + olddir=`pwd` + cd ${AUTOTOOLS_SCRIPT_PATH} + mkdir -p ${ACLOCALDIR} + if [ x"${acpaths}" = xdefault ]; then + acpaths= + for i in `find ${AUTOTOOLS_SCRIPT_PATH} -ignore_readdir_race -maxdepth 2 -name \*.m4|grep -v 'aclocal.m4'| \ + grep -v 'acinclude.m4' | sed -e 's,\(.*/\).*$,\1,'|sort -u`; do + acpaths="$acpaths -I $i" + done + else + acpaths="${acpaths}" + fi + acpaths="$acpaths -I ${ACLOCALDIR}" + if [ -d ${STAGING_DATADIR_NATIVE}/aclocal ]; then + acpaths="$acpaths ${ACLOCALEXTRAPATH}" + fi + AUTOV=`automake --version | sed -e '1{s/.* //;s/\.[0-9]\+$//};q'` + automake --version + echo "AUTOV is $AUTOV" + if [ -d ${STAGING_DATADIR_NATIVE}/aclocal-$AUTOV ]; then + ACLOCAL="$ACLOCAL --automake-acdir=${STAGING_DATADIR_NATIVE}/aclocal-$AUTOV" + fi + # autoreconf is too shy to overwrite aclocal.m4 if it doesn't look + # like it was auto-generated. Work around this by blowing it away + # by hand, unless the package specifically asked not to run aclocal. + if ! echo ${EXTRA_AUTORECONF_DEFINE} | grep -q "ACLOCAL"; then + rm -f aclocal.m4 + fi + if [ -e configure.in ]; then + CONFIGURE_AC=configure.in + else + CONFIGURE_AC=configure.ac + fi + sed -i '/AC_CANONICAL_TARGET/atest -n $target_alias && test "$target_alias" = "$host_alias" && test "$program_prefix$program_suffix$program_transform_name" = "${target_alias}-NONEs,x,x," && program_prefix=NONE' ${CONFIGURE_AC} + if grep -q "^[[:space:]]*AM_GLIB_GNU_GETTEXT" $CONFIGURE_AC; then + if grep -q "sed.*POTFILES" $CONFIGURE_AC; then + : do nothing -- we still have an old unmodified configure.ac + else + bbnote Executing glib-gettextize --force --copy + echo "no" | glib-gettextize --force --copy + fi + elif [ "${BPN}" != "gettext" ] && grep -q "^[[:space:]]*AM_GNU_GETTEXT" $CONFIGURE_AC; then + # We'd call gettextize here if it wasn't so broken... + cp /usr/share/gettext/config.rpath ${AUTOTOOLS_AUXDIR}/ + if [ -d ${S}/po/ ]; then + cp -f /usr/share/gettext/po/Makefile.in.in ${S}/po/ + if [ ! -e ${S}/po/remove-potcdate.sin ]; then + cp /usr/share/gettext/po/remove-potcdate.sin ${S}/po/ + fi + fi + PRUNE_M4="$PRUNE_M4 gettext.m4 iconv.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 nls.m4 po.m4 progtest.m4" + fi + mkdir -p m4 + if grep -q "^[[:space:]]*[AI][CT]_PROG_INTLTOOL" $CONFIGURE_AC; then + if ! echo "${DEPENDS}" | grep -q intltool-native; then + bbwarn "Missing DEPENDS on intltool-native" + fi + PRUNE_M4="$PRUNE_M4 intltool.m4" + bbnote Executing intltoolize --copy --force --automake + intltoolize --copy --force --automake + fi + + for i in $PRUNE_M4; do + find ${S} -ignore_readdir_race -name $i -delete + done + + tmp_site=`pwd`/tmp.site + rm -f ${tmp_site} + for f in $CONFIG_SITE + do + bbnote Adding script ${f} to site file + cat $f >> ${tmp_site} + done + export CONFIG_SITE=${tmp_site} + + bbnote Executing ACLOCAL=\"$ACLOCAL\" ${EXTRA_AUTORECONF_DEFINE} autoreconf --verbose --install --force ${EXTRA_AUTORECONF} $acpaths + ACLOCAL="$ACLOCAL" ${EXTRA_AUTORECONF_DEFINE} autoreconf -Wcross --verbose --install --force ${EXTRA_AUTORECONF} $acpaths || die "autoreconf execution failed." + cp -f ${RECIPE_SYSROOT_NATIVE}/usr/share/gnu-config/config.guess . + cp -f ${RECIPE_SYSROOT_NATIVE}/usr/share/gnu-config/config.sub . + cd $olddir + fi + test ! -f ${S}/aclocal.m4 || sed -i "/MSGMERGE_FOR_MSGFMT_OPTION/{s|--for-msgfmt||g}" ${S}/aclocal.m4 + test ! -f ${S}/configure || sed -i "/MSGMERGE_FOR_MSGFMT_OPTION/{s|--for-msgfmt||g}" ${S}/configure + if [ -e ${CONFIGURE_SCRIPT} ]; then + oe_runconf + else + bbnote "nothing to configure" + fi +} + +autotools_do_compile() { + for libtool_file in `find ${B} -ignore_readdir_race -name libtool`; do + sed -i 's/macro_version=2.4.2/macro_version=2.4.6/g' $libtool_file + sed -i 's/macro_revision=1.3337/macro_revision=2.4.6/g' $libtool_file + sed -i 's/VERSION=2.4.2/VERSION=2.4.6/g' $libtool_file + sed -i 's/package_revision=2.4.2/package_revision=2.4.6/g' $libtool_file + sed -i 's/package_revision=1.3337/package_revision=2.4.6/g' $libtool_file + if [ ${BUILD_SYS} != ${TARGET_SYS} ]; then + sed -i 's|lt_sysroot=|lt_sysroot=${RECIPE_SYSROOT}|' $libtool_file + fi + sed -i '/fake/{ n; s/add_dir=-L$libdir/add_dir="-L$lt_sysroot$libdir"/; }' $libtool_file + sed -i '/fake/{ n; s/add_dir="-L$libdir"/add_dir="-L$lt_sysroot$libdir"/; }' $libtool_file + done + oe_runmake +} + +autotools_do_install() { + oe_runmake 'DESTDIR=${D}' install + # Info dir listing isn't interesting at this point so remove it if it exists. + if [ -e "${D}${infodir}/dir" ]; then + rm -f ${D}${infodir}/dir + fi +} + +inherit siteconfig + +EXPORT_FUNCTIONS do_configure do_compile do_install + +B = "${WORKDIR}/build" -- Gitee From ca9f5189dd17cf47be1ef513abca65492fbb3551 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Tue, 26 Oct 2021 12:08:28 +0800 Subject: [PATCH 011/304] add recipe for audit Signed-off-by: zhuyan --- .../recipes-core/audit/audit_3.0.bb | 99 +++++++++++ .../audit/files/audit-volatile.conf | 1 + .../recipes-core/audit/files/audit.rules | 65 +++++++ .../recipes-core/audit/files/auditd | 162 ++++++++++++++++++ .../recipes-core/audit/files/auditd.conf | 40 +++++ .../recipes-core/audit/files/auditd.service | 29 ++++ 6 files changed, 396 insertions(+) create mode 100644 meta-openeuler/recipes-core/audit/audit_3.0.bb create mode 100644 meta-openeuler/recipes-core/audit/files/audit-volatile.conf create mode 100644 meta-openeuler/recipes-core/audit/files/audit.rules create mode 100644 meta-openeuler/recipes-core/audit/files/auditd create mode 100644 meta-openeuler/recipes-core/audit/files/auditd.conf create mode 100644 meta-openeuler/recipes-core/audit/files/auditd.service diff --git a/meta-openeuler/recipes-core/audit/audit_3.0.bb b/meta-openeuler/recipes-core/audit/audit_3.0.bb new file mode 100644 index 00000000000..90288d847c3 --- /dev/null +++ b/meta-openeuler/recipes-core/audit/audit_3.0.bb @@ -0,0 +1,99 @@ +SUMMARY = "User space tools for kernel auditing" +DESCRIPTION = "The audit package contains the user space utilities for \ +storing and searching the audit records generated by the audit subsystem \ +in the Linux kernel." +HOMEPAGE = "http://people.redhat.com/sgrubb/audit/" +SECTION = "base" +LICENSE = "GPLv2+ & LGPLv2+" + +#inherit autotools python3native update-rc.d systemd +inherit autotools + +LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" +SRC_URI = "file://audit/audit-${PV}.tar.gz" + + +UPDATERCPN = "auditd" +INITSCRIPT_NAME = "auditd" +INITSCRIPT_PARAMS = "defaults" + +SYSTEMD_PACKAGES = "auditd" +SYSTEMD_SERVICE_auditd = "auditd.service" + +#DEPENDS += "libcap-ng linux-libc-headers libpam" +DEPENDS += "libcap-ng libpam" + +EXTRA_OECONF += " --enable-gssapi-krb5=no \ + --with-libcap-ng=yes \ + --with-python3=no \ + --libdir=${base_libdir} \ + --sbindir=${base_sbindir} \ + --without-python \ + --without-golang \ + --disable-zos-remote \ + --with-arm=yes \ + --with-aarch64=yes \ + " + +EXTRA_OECONF_append += "${@ " --build=x86_64-linux --host=${HOST_ARCH}-euler-linux --target=${HOST_ARCH}-euler-linux " if "${TCLIBC}"=="musl" else "" }" + +EXTRA_OEMAKE += " \ + STDINC='${STAGING_INCDIR}' \ + " + +UPDATERCD = "" + +SUMMARY_audispd-plugins = "Plugins for the audit event dispatcher" +DESCRIPTION_audispd-plugins = "The audispd-plugins package provides plugins for the real-time \ +interface to the audit system, audispd. These plugins can do things \ +like relay events to remote machines or analyze events for suspicious \ +behavior." + +PACKAGES =+ "audispd-plugins" +PACKAGES += "auditd" + +FILES_${PN} = "${sysconfdir}/libaudit.conf ${base_libdir}/libaudit.so.1* ${base_libdir}/libauparse.so.*" +FILES_auditd += "${bindir}/* ${base_sbindir}/* ${sysconfdir}/* ${datadir}/audit/*" +FILES_audispd-plugins += "${sysconfdir}/audit/audisp-remote.conf \ + ${sysconfdir}/audit/plugins.d/au-remote.conf \ + ${sbindir}/audisp-remote ${localstatedir}/spool/audit \ + " +FILES_${PN}-dbg += "${libdir}/python${PYTHON_BASEVERSION}/*/.debug" +#FILES_${PN}-python = "${libdir}/python${PYTHON_BASEVERSION}" +FILES_${PN}-dev += "${base_libdir}/*.so ${base_libdir}/*.la ${base_libdir}/pkgconfig/*" + +CONFFILES_auditd += "${sysconfdir}/audit/audit.rules" + +do_install_append() { + rm -f ${D}/${libdir}/python${PYTHON_BASEVERSION}/site-packages/*.a + rm -f ${D}/${libdir}/python${PYTHON_BASEVERSION}/site-packages/*.la + + # reuse auditd config + [ ! -e ${D}/etc/default ] && mkdir ${D}/etc/default + mv ${D}/etc/sysconfig/auditd ${D}/etc/default + rmdir ${D}/etc/sysconfig/ + + # replace init.d + install -D -m 0750 ${THISDIR}/files/auditd ${D}/etc/init.d/auditd + rm -rf ${D}/etc/rc.d + + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + # install systemd unit files + install -d ${D}${systemd_unitdir}/system + install -m 0644 ${THISDIR}/files/auditd.service ${D}${systemd_unitdir}/system + + install -d ${D}${sysconfdir}/tmpfiles.d/ + install -m 0644 ${THISDIR}/files/audit-volatile.conf ${D}${sysconfdir}/tmpfiles.d/ + fi + + # audit-2.5 doesn't install any rules by default, so we do that here + mkdir -p ${D}/etc/audit ${D}/etc/audit/rules.d + cp ${S}/rules/10-base-config.rules ${D}/etc/audit/rules.d/audit.rules + + chmod 750 ${D}/etc/audit ${D}/etc/audit/rules.d + chmod 640 ${D}/etc/audit/auditd.conf ${D}/etc/audit/rules.d/audit.rules + + # Based on the audit.spec "Copy default rules into place on new installation" + cp ${D}/etc/audit/rules.d/audit.rules ${D}/etc/audit/audit.rules + rm -rf ${D}/lib/pkgconfig +} diff --git a/meta-openeuler/recipes-core/audit/files/audit-volatile.conf b/meta-openeuler/recipes-core/audit/files/audit-volatile.conf new file mode 100644 index 00000000000..9cbe1547a3e --- /dev/null +++ b/meta-openeuler/recipes-core/audit/files/audit-volatile.conf @@ -0,0 +1 @@ +d /var/log/audit 0750 root root - diff --git a/meta-openeuler/recipes-core/audit/files/audit.rules b/meta-openeuler/recipes-core/audit/files/audit.rules new file mode 100644 index 00000000000..09ccf53281e --- /dev/null +++ b/meta-openeuler/recipes-core/audit/files/audit.rules @@ -0,0 +1,65 @@ +### First rule - delete all +-D + +## Increase the buffers to survive stress events. +## Make this bigger for busy systems +-b 8192 + +## This determine how long to wait in burst of events +--backlog_wait_time 60000 + +## Set failure mode to syslog +-f 1 + +-a always,exit -F arch=b32 -S adjtimex -S settimeofday -S stime -k time-change +-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time-change +-a always,exit -F arch=b32 -S clock_settime -S clock_settime -k time-change +-a always,exit -F arch=b64 -S clock_settime -k time-change +-w /etc/localtime -p wa -k time-change +-w /etc/group -p wa -k identity +-w /etc/passwd -p wa -k identity +-w /etc/gshadow -p wa -k identity +-w /etc/shadow -p wa -k identity +-w /etc/security/opasswd -p wa -k identity +-a always,exit -F arch=b64 -S sethostname -S setdomainname -k system-locale +-a always,exit -F arch=b32 -S sethostname -S setdomainname -k system-locale +-w /etc/issue -p wa -k system-locale +-w /etc/issue.net -p wa -k system-locale +-w /etc/hosts -p wa -k system-locale +-w /etc/network -p wa -k system-locale +-w /etc/sysconfig/network -p wa -k system-locale +-w /etc/sysconfig/network-scripts -p wa -k system-locale +-w /etc/selinux/ -p wa -k MAC-policy +-w /var/log/lastlog -p wa -k logins +-w /var/log/tallylog -p wa -k logins +-w /var/log/btmp -p wa -k session +-w /var/log/faillog2 -p wa -k logins +-w /var/run/utmp -p wa -k session +-w /var/log/wtmp -p wa -k session +-a always,exit -F arch=b32 -S chmod -S fchmod -S fchmodat -F auid!=4294967295 -k perm_mod +-a always,exit -F arch=b64 -S fchmod -S fchmodat -F auid!=4294967295 -k perm_mod +-a always,exit -F arch=b32 -S chown -S fchown -S fchownat -S lchown -S lchown32 -S fchown32 -S chown32 -F auid!=4294967295 -k perm_mod +-a always,exit -F arch=b64 -S fchown -S fchownat -F auid!=4294967295 -k perm_mod +-a always,exit -F arch=b32 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -F auid!=4294967295 -k perm_mod +-a always,exit -F arch=b64 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -F auid!=4294967295 -k perm_mod +-a always,exit -F arch=b32 -S creat -S open -S openat -S truncate -S ftruncate -S truncate64 -F exit=-EACCES -F auid!=4294967295 -k access +-a always,exit -F arch=b64 -S openat -S truncate -S ftruncate -F exit=-EACCES -F auid!=4294967295 -k access +-a always,exit -F arch=b32 -S creat -S open -S openat -S truncate -S ftruncate -S truncate64 -F exit=-EPERM -F auid!=4294967295 -k access +-a always,exit -F arch=b64 -S openat -S truncate -S ftruncate -F exit=-EPERM -F auid!=4294967295 -k access +-a always,exit -F path=/sbin/mount.nfs -F perm=x -F auid!=4294967295 -k privileged +-a always,exit -F path=/bin/su -F perm=x -F auid!=4294967295 -k privileged +-a always,exit -F path=/sbin/ifenslave -F perm=x -F auid!=4294967295 -k privileged +-a always,exit -F path=/usr/bin/traceroute6 -F perm=x -F auid!=4294967295 -k privileged +-a always,exit -F path=/usr/sbin/unix_chkpwd -F perm=x -F auid!=4294967295 -k privileged +-a always,exit -F path=/usr/bin/su -F perm=x -F auid!=4294967295 -k privileged +-a always,exit -F path=/usr/bin/passwd -F perm=x -F auid!=4294967295 -k privileged +-a always,exit -F path=/usr/bin/crontab -F perm=x -F auid!=4294967295 -k privileged +-a always,exit -F path=/usr/libexec/ssh-keysign -F perm=x -F auid!=4294967295 -k privileged +-a always,exit -F path=/bin/ping6 -F perm=x -F auid!=4294967295 -k privileged +-a always,exit -F path=/usr/bin/lsof -F perm=x -F auid!=4294967295 -k privileged +-a always,exit -F path=/bin/mount -F perm=x -F auid!=4294967295 -k privileged +-a always,exit -F path=/bin/umount -F perm=x -F auid!=4294967295 -k privileged +-a always,exit -F arch=b32 -S unlink -S unlinkat -S rename -S renameat -S rmdir -F auid!=4294967295 -k delete +-a always,exit -F arch=b64 -S unlinkat -S renameat -S renameat2 -F auid>=500 -F auid!=4294967295 -k delete +-w /etc/sudoers -p wa -k scope +-e 2 diff --git a/meta-openeuler/recipes-core/audit/files/auditd b/meta-openeuler/recipes-core/audit/files/auditd new file mode 100644 index 00000000000..9abf2f9f367 --- /dev/null +++ b/meta-openeuler/recipes-core/audit/files/auditd @@ -0,0 +1,162 @@ +#! /bin/sh +### BEGIN INIT INFO +# Provides: auditd +# Required-Start: $local_fs +# Required-Stop: $local_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Audit Daemon +# Description: Collects audit information from Linux 2.6 Kernels. +### END INIT INFO + +# Author: Philipp Matthias Hahn +# Based on Debians /etc/init.d/skeleton and Auditds init.d/auditd.init + +# June, 2012: Adopted for yocto + +# PATH should only include /usr/* if it runs after the mountnfs.sh script +PATH=/sbin:/bin:/usr/sbin:/usr/bin +DESC="audit daemon" +NAME=auditd +DAEMON=/sbin/auditd +PIDFILE=/var/run/"$NAME".pid +SCRIPTNAME=/etc/init.d/"$NAME" + +# Exit if the package is not installed +[ -x "$DAEMON" ] || exit 0 + +# Read configuration variable file if it is present +[ -r /etc/default/"$NAME" ] && . /etc/default/"$NAME" + +. /etc/default/rcS + +. /etc/init.d/functions + +# +# Function that starts the daemon/service +# +do_start() +{ + # Return + # 0 if daemon has been started + # 1 if daemon was already running + # 2 if daemon could not be started + start-stop-daemon -K --quiet --pidfile "$PIDFILE" --exec "$DAEMON" --test > /dev/null \ + && return 1 + start-stop-daemon -S --quiet --pidfile "$PIDFILE" --exec "$DAEMON" -- \ + $EXTRAOPTIONS \ + || return 2 + if [ -f /etc/audit/audit.rules ] + then + /sbin/auditctl -R /etc/audit/audit.rules >/dev/null + fi +} + +# +# Function that stops the daemon/service +# +do_stop() +{ + # Return + # 0 if daemon has been stopped + # 1 if daemon was already stopped + # 2 if daemon could not be stopped + # other if a failure occurred + start-stop-daemon -K --quiet --pidfile "$PIDFILE" --name "$NAME" + RETVAL="$?" + [ "$RETVAL" = 2 ] && return 2 + # Many daemons don't delete their pidfiles when they exit. + rm -f "$PIDFILE" + rm -f /var/run/audit_events + # Remove watches so shutdown works cleanly + case "$AUDITD_CLEAN_STOP" in + no|NO) ;; + *) /sbin/auditctl -D >/dev/null ;; + esac + return "$RETVAL" +} + +# +# Function that sends a SIGHUP to the daemon/service +# +do_reload() { + start-stop-daemon -K --signal HUP --quiet --pidfile $PIDFILE --name $NAME + return 0 +} + +if [ ! -e /var/log/audit ]; then + mkdir -p /var/log/audit + [ -x /sbin/restorecon ] && /sbin/restorecon -F $(readlink -f /var/log/audit) +fi + +case "$1" in + start) + [ "$VERBOSE" != no ] && echo "Starting $DESC" "$NAME" + do_start + case "$?" in + 0|1) [ "$VERBOSE" != no ] && echo 0 ;; + 2) [ "$VERBOSE" != no ] && echo 1 ;; + esac + ;; + stop) + [ "$VERBOSE" != no ] && echo "Stopping $DESC" "$NAME" + do_stop + case "$?" in + 0|1) [ "$VERBOSE" != no ] && echo 0 ;; + 2) [ "$VERBOSE" != no ] && echo 1 ;; + esac + ;; + reload|force-reload) + echo "Reloading $DESC" "$NAME" + do_reload + echo $? + ;; + restart) + echo "Restarting $DESC" "$NAME" + do_stop + case "$?" in + 0|1) + for i in $(seq 1 10) + do + ps aux | grep -w $DAEMON | grep -vw grep > /dev/null + if [ $? -ne 0 ]; then + break + else + sleep 1 + fi + done + do_start + case "$?" in + 0) echo 0 ;; + 1) echo 1 ;; # Old process is still running + *) echo 1 ;; # Failed to start + esac + ;; + *) + # Failed to stop + echo 1 + ;; + esac + ;; + rotate) + echo "Rotating $DESC logs" "$NAME" + start-stop-daemon -K --signal USR1 --quiet --pidfile "$PIDFILE" --name "$NAME" + echo $? + ;; + status) + pidofproc "$DAEMON" >/dev/null + status=$? + if [ $status -eq 0 ]; then + echo "$NAME is running." + else + echo "$NAME is not running." + fi + exit $status + ;; + *) + echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload|rotate|status}" >&2 + exit 3 + ;; +esac + +: diff --git a/meta-openeuler/recipes-core/audit/files/auditd.conf b/meta-openeuler/recipes-core/audit/files/auditd.conf new file mode 100644 index 00000000000..5cf17b868b5 --- /dev/null +++ b/meta-openeuler/recipes-core/audit/files/auditd.conf @@ -0,0 +1,40 @@ +# +# This file controls the configuration of the audit daemon +# + +local_events = yes +write_logs = yes +log_file = /var/log/audit/audit.log +log_group = root +log_format = ENRICHED +flush = INCREMENTAL_ASYNC +freq = 50 +max_log_file = 5 +num_logs = 5 +priority_boost = 4 +name_format = NONE +##name = mydomain +max_log_file_action = ROTATE +space_left = 2 +space_left_action = SYSLOG +verify_email = yes +action_mail_acct = root +admin_space_left = 1 +admin_space_left_action = SUSPEND +disk_full_action = SUSPEND +disk_error_action = SUSPEND +use_libwrap = yes +##tcp_listen_port = 60 +tcp_listen_queue = 5 +tcp_max_per_addr = 1 +##tcp_client_ports = 1024-65535 +tcp_client_max_idle = 0 +transport = TCP +krb5_principal = auditd +##krb5_key_file = /etc/audit/audit.key +distribute_network = no +q_depth = 400 +overflow_action = SYSLOG +max_restarts = 10 +plugin_dir = /etc/audit/plugins.d +log_format = RAW diff --git a/meta-openeuler/recipes-core/audit/files/auditd.service b/meta-openeuler/recipes-core/audit/files/auditd.service new file mode 100644 index 00000000000..10ca9f0f0ee --- /dev/null +++ b/meta-openeuler/recipes-core/audit/files/auditd.service @@ -0,0 +1,29 @@ +[Unit] +Description=Security Auditing Service +DefaultDependencies=no +After=local-fs.target systemd-tmpfiles-setup.service +Before=sysinit.target shutdown.target +Conflicts=shutdown.target +ConditionKernelCommandLine=!audit=0 + +[Service] +Type=forking +PIDFile=/run/auditd.pid +ExecStart=/sbin/auditd +## To use augenrules, uncomment the next line and comment/delete the auditctl line. +## NOTE: augenrules expect any rules to be added to /etc/audit/rules.d/ +#ExecStartPost=-/sbin/augenrules --load +ExecStartPost=-/sbin/auditctl -R /etc/audit/audit.rules +ExecReload=/bin/kill -HUP $MAINPID +# By default we don't clear the rules on exit. +# To enable this, uncomment the next line. +#ExecStopPost=/sbin/auditctl -R /etc/audit/audit-stop.rules + +### Security Settings ### +MemoryDenyWriteExecute=true +LockPersonality=true +ProtectControlGroups=true +ProtectKernelModules=true + +[Install] +WantedBy=multi-user.target -- Gitee From de0d819179ca2c8ab5315590afbf2753fc4640d3 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Tue, 26 Oct 2021 12:08:29 +0800 Subject: [PATCH 012/304] add recipe for cracklib Signed-off-by: zhuyan --- .../recipes-core/cracklib/cracklib_2.9.7.bb | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 meta-openeuler/recipes-core/cracklib/cracklib_2.9.7.bb diff --git a/meta-openeuler/recipes-core/cracklib/cracklib_2.9.7.bb b/meta-openeuler/recipes-core/cracklib/cracklib_2.9.7.bb new file mode 100644 index 00000000000..204d0ed2b54 --- /dev/null +++ b/meta-openeuler/recipes-core/cracklib/cracklib_2.9.7.bb @@ -0,0 +1,28 @@ +SUMMARY = "Password strength checker library" +HOMEPAGE = "http://sourceforge.net/projects/cracklib" + +LICENSE = "LGPLv2.1+" + +SRC_URI = "file://cracklib/cracklib-${PV}.tar.gz" + +LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=e3eda01d9815f8d24aae2dbd89b68b06" + +DEPENDS = "cracklib-native zlib" +DEPENDS_class-native = "zlib" + +EXTRA_OECONF = "--without-python --libdir=${base_libdir}" + +UPSTREAM_CHECK_URI = "http://sourceforge.net/projects/cracklib/files/cracklib/" +UPSTREAM_CHECK_REGEX = "/cracklib/(?P(\d+[\.\-_]*)+)/" + +inherit autotools gettext + +BBCLASSEXTEND = "native" + +do_install_append_class-target() { + create-cracklib-dict -o ${D}${datadir}/cracklib/pw_dict ${D}${datadir}/cracklib/cracklib-small +} + +do_compile_prepend() { + sed -i "s|GETTEXT_MACRO_VERSION =.*|GETTEXT_MACRO_VERSION = ${HOST_GETTEXT_VER}|" ${B}/po/Makefile +} -- Gitee From c3533d9922bc0ec7dfcec89fb59149513f18d14c Mon Sep 17 00:00:00 2001 From: zhuyan Date: Tue, 26 Oct 2021 12:08:30 +0800 Subject: [PATCH 013/304] add recipe for libcap-ng Signed-off-by: zhuyan --- .../recipes-core/libcap-ng/libcap-ng.inc | 19 +++++++++++++++++ .../libcap-ng/libcap-ng_0.7.11.bb | 21 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc create mode 100644 meta-openeuler/recipes-core/libcap-ng/libcap-ng_0.7.11.bb diff --git a/meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc b/meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc new file mode 100644 index 00000000000..69409f0c851 --- /dev/null +++ b/meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc @@ -0,0 +1,19 @@ +SUMMARY = "An alternate posix capabilities library" +DESCRIPTION = "The libcap-ng library is intended to make programming \ +with POSIX capabilities much easier than the traditional libcap library." +HOMEPAGE = "http://freecode.com/projects/libcap-ng" +SECTION = "base" +LICENSE = "GPLv2+ & LGPLv2.1+" +LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f \ + file://COPYING.LIB;md5=e3eda01d9815f8d24aae2dbd89b68b06" + +SRC_URI = "file://libcap-ng/libcap-ng-${PV}.tar.gz" + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" +S = "${WORKDIR}/${BPN}-${PV}" + +SRC_URI[md5sum] = "5883ed10b621c87e29a05cff36d2928e" +SRC_URI[sha256sum] = "85815c711862d01a440db471f12fba462c9949e923966f5859607e652d9c0ae9" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-openeuler/recipes-core/libcap-ng/libcap-ng_0.7.11.bb b/meta-openeuler/recipes-core/libcap-ng/libcap-ng_0.7.11.bb new file mode 100644 index 00000000000..c4d7bbf8db2 --- /dev/null +++ b/meta-openeuler/recipes-core/libcap-ng/libcap-ng_0.7.11.bb @@ -0,0 +1,21 @@ +require libcap-ng.inc + + +inherit lib_package autotools +DEPENDS_remove += "libtool-cross" + +EXTRA_OECONF += "--without-python --without-python3" + +BBCLASSEXTEND = "native nativesdk" + +INHIBIT_PACKAGE_DEBUG_SPLIT = "1" + +do_install_append() { + # Moving libcap-ng to base_libdir + if [ ! ${D}${libdir} -ef ${D}${base_libdir} ]; then + mkdir -p ${D}/${base_libdir}/ + mv -f ${D}${libdir}/libcap-ng.so.* ${D}${base_libdir}/ + relpath=${@os.path.relpath("${base_libdir}", "${libdir}")} + ln -sf ${relpath}/libcap-ng.so.0.0.0 ${D}${libdir}/libcap-ng.so + fi +} -- Gitee From cc63b2a69e06a617a385f6dbebcd1a22ddf6ed24 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Tue, 26 Oct 2021 12:08:31 +0800 Subject: [PATCH 014/304] add recipe for libpwquality Signed-off-by: zhuyan --- .../libpwquality/libpwquality_1.4.4.bb | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 meta-openeuler/recipes-core/libpwquality/libpwquality_1.4.4.bb diff --git a/meta-openeuler/recipes-core/libpwquality/libpwquality_1.4.4.bb b/meta-openeuler/recipes-core/libpwquality/libpwquality_1.4.4.bb new file mode 100644 index 00000000000..1f5f84cf651 --- /dev/null +++ b/meta-openeuler/recipes-core/libpwquality/libpwquality_1.4.4.bb @@ -0,0 +1,38 @@ +DESCRIPTION = "Library for password quality checking and generating random passwords" +HOMEPAGE = "https://github.com/libpwquality/libpwquality" +SECTION = "devel/lib" +LICENSE = "GPLv2" + +PARALLEL_MAKE = "-j 1" + +LIC_FILES_CHKSUM = "file://COPYING;md5=6bd2f1386df813a459a0c34fde676fc2" + +SRC_URI += "file://libpwquality/libpwquality-1.4.4.tar.bz2" + +#S = "${WORKDIR}/${SRCNAME}-${PV}" + +DEPENDS = "cracklib" + +inherit autotools gettext + +#B = "${S}" + +export PYTHON_DIR +export BUILD_SYS +export HOST_SYS + +EXTRA_OECONF += "--enable-python-bindings=no \ + --libdir=${base_libdir} \ +" + +do_install_append() { + rm -r ${D}/lib/pkgconfig +} + +PACKAGECONFIG ??= "pam" +PACKAGECONFIG[pam] = "--enable-pam, --disable-pam, libpam" +FILES_${PN} += "${base_libdir}/security/pam_pwquality.so" +FILES_${PN}-dbg += "${base_libdir}/security/.debug" +FILES_${PN}-staticdev += "${base_libdir}/security/pam_pwquality.a" +FILES_${PN}-dev += "${base_libdir}/security/pam_pwquality.la" + -- Gitee From 52dd086948948932ac02e24772aa6abb013d9fb8 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Tue, 26 Oct 2021 12:08:32 +0800 Subject: [PATCH 015/304] add recipe for openssh Signed-off-by: zhuyan --- .../openssh/config/common/sshd_check_keys | 78 ++++++++ .../recipes-core/openssh/openssh/init | 90 ++++++++++ .../recipes-core/openssh/openssh/ssh_config | 50 ++++++ .../recipes-core/openssh/openssh/sshd | 10 ++ .../recipes-core/openssh/openssh/sshd.socket | 10 ++ .../openssh/openssh/sshd@.service | 13 ++ .../recipes-core/openssh/openssh/sshd_config | 134 ++++++++++++++ .../openssh/openssh/sshd_config_readonly | 116 ++++++++++++ .../openssh/openssh/sshdgenkeys.service | 8 + .../openssh/openssh/volatiles.99_sshd | 2 + .../recipes-core/openssh/openssh_8.2p1.bb | 168 ++++++++++++++++++ 11 files changed, 679 insertions(+) create mode 100644 meta-openeuler/recipes-core/openssh/openssh/config/common/sshd_check_keys create mode 100644 meta-openeuler/recipes-core/openssh/openssh/init create mode 100644 meta-openeuler/recipes-core/openssh/openssh/ssh_config create mode 100644 meta-openeuler/recipes-core/openssh/openssh/sshd create mode 100644 meta-openeuler/recipes-core/openssh/openssh/sshd.socket create mode 100644 meta-openeuler/recipes-core/openssh/openssh/sshd@.service create mode 100644 meta-openeuler/recipes-core/openssh/openssh/sshd_config create mode 100644 meta-openeuler/recipes-core/openssh/openssh/sshd_config_readonly create mode 100644 meta-openeuler/recipes-core/openssh/openssh/sshdgenkeys.service create mode 100644 meta-openeuler/recipes-core/openssh/openssh/volatiles.99_sshd create mode 100644 meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb diff --git a/meta-openeuler/recipes-core/openssh/openssh/config/common/sshd_check_keys b/meta-openeuler/recipes-core/openssh/openssh/config/common/sshd_check_keys new file mode 100644 index 00000000000..1931dc71537 --- /dev/null +++ b/meta-openeuler/recipes-core/openssh/openssh/config/common/sshd_check_keys @@ -0,0 +1,78 @@ +#! /bin/sh + +generate_key() { + local FILE=$1 + local TYPE=$2 + local DIR="$(dirname "$FILE")" + + mkdir -p "$DIR" + ssh-keygen -q -f "${FILE}.tmp" -N '' -t $TYPE + + # Atomically rename file public key + mv -f "${FILE}.tmp.pub" "${FILE}.pub" + + # This sync does double duty: Ensuring that the data in the temporary + # private key file is on disk before the rename, and ensuring that the + # public key rename is completed before the private key rename, since we + # switch on the existence of the private key to trigger key generation. + # This does mean it is possible for the public key to exist, but be garbage + # but this is OK because in that case the private key won't exist and the + # keys will be regenerated. + # + # In the event that sync understands arguments that limit what it tries to + # fsync(), we provided them. If it does not, it will simply call sync() + # which is just as well + sync "${FILE}.pub" "$DIR" "${FILE}.tmp" + + mv "${FILE}.tmp" "$FILE" + + # sync to ensure the atomic rename is committed + sync "$DIR" +} + +# /etc/default/ssh may set SYSCONFDIR and SSHD_OPTS +if test -f /etc/default/ssh; then + . /etc/default/ssh +fi + +[ -z "$SYSCONFDIR" ] && SYSCONFDIR=/etc/ssh +mkdir -p $SYSCONFDIR + +# parse sshd options +set -- ${SSHD_OPTS} -- +sshd_config=/etc/ssh/sshd_config +while true ; do + case "$1" in + -f*) if [ "$1" = "-f" ] ; then + sshd_config="$2" + shift + else + sshd_config="${1#-f}" + fi + shift + ;; + --) shift; break;; + *) shift;; + esac +done + +HOST_KEYS=$(sed -n 's/^[ \t]*HostKey[ \t]\+\(.*\)/\1/p' "${sshd_config}") +[ -z "${HOST_KEYS}" ] && HOST_KEYS="$SYSCONFDIR/ssh_host_rsa_key $SYSCONFDIR/ssh_host_ecdsa_key $SYSCONFDIR/ssh_host_ed25519_key" + +for key in ${HOST_KEYS} ; do + [ -f $key ] && continue + case $key in + *_rsa_key) + echo " generating ssh RSA host key..." + generate_key $key rsa + ;; + *_ecdsa_key) + echo " generating ssh ECDSA host key..." + generate_key $key ecdsa + ;; + *_ed25519_key) + echo " generating ssh ED25519 host key..." + generate_key $key ed25519 + ;; + esac +done diff --git a/meta-openeuler/recipes-core/openssh/openssh/init b/meta-openeuler/recipes-core/openssh/openssh/init new file mode 100644 index 00000000000..8887e3af130 --- /dev/null +++ b/meta-openeuler/recipes-core/openssh/openssh/init @@ -0,0 +1,90 @@ +#! /bin/sh +set -e + +PIDFILE=/var/run/sshd.pid + +# source function library +. /etc/init.d/functions + +# /etc/init.d/ssh: start and stop the OpenBSD "secure shell" daemon + +test -x /usr/sbin/sshd || exit 0 +( /usr/sbin/sshd -\? 2>&1 | grep -q OpenSSH ) 2>/dev/null || exit 0 + +# /etc/default/ssh may set SYSCONFDIR and SSHD_OPTS +if test -f /etc/default/ssh; then + . /etc/default/ssh +fi + +[ -z "$SYSCONFDIR" ] && SYSCONFDIR=/etc/ssh +mkdir -p $SYSCONFDIR + +check_for_no_start() { + # forget it if we're trying to start, and /etc/ssh/sshd_not_to_be_run exists + if [ -e $SYSCONFDIR/sshd_not_to_be_run ]; then + echo "OpenBSD Secure Shell server not in use ($SYSCONFDIR/sshd_not_to_be_run)" + exit 0 + fi +} + +check_privsep_dir() { + # Create the PrivSep empty dir if necessary + if [ ! -d /var/run/sshd ]; then + mkdir /var/run/sshd + chmod 0755 /var/run/sshd + fi +} + +check_config() { + /usr/sbin/sshd $SSHD_OPTS -t || exit 1 +} + +export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" + +case "$1" in + start) + check_for_no_start + echo "Starting OpenBSD Secure Shell server: sshd" + @LIBEXECDIR@/sshd_check_keys + check_privsep_dir + start-stop-daemon -S -p $PIDFILE -x /usr/sbin/sshd -- $SSHD_OPTS + echo "done." + ;; + stop) + echo -n "Stopping OpenBSD Secure Shell server: sshd" + start-stop-daemon -K -p $PIDFILE -x /usr/sbin/sshd + echo "." + ;; + + reload|force-reload) + check_for_no_start + @LIBEXECDIR@/sshd_check_keys + check_config + echo -n "Reloading OpenBSD Secure Shell server's configuration" + start-stop-daemon -K -p $PIDFILE -s 1 -x /usr/sbin/sshd + echo "." + ;; + + restart) + @LIBEXECDIR@/sshd_check_keys + check_config + echo -n "Restarting OpenBSD Secure Shell server: sshd" + start-stop-daemon -K -p $PIDFILE --oknodo -x /usr/sbin/sshd + check_for_no_start + check_privsep_dir + sleep 2 + start-stop-daemon -S -p $PIDFILE -x /usr/sbin/sshd -- $SSHD_OPTS + echo "." + ;; + + status) + status /usr/sbin/sshd + exit $? + ;; + + *) + echo "Usage: /etc/init.d/ssh {start|stop|status|reload|force-reload|restart}" + exit 1 +esac + +exit 0 diff --git a/meta-openeuler/recipes-core/openssh/openssh/ssh_config b/meta-openeuler/recipes-core/openssh/openssh/ssh_config new file mode 100644 index 00000000000..b9c6242a7e5 --- /dev/null +++ b/meta-openeuler/recipes-core/openssh/openssh/ssh_config @@ -0,0 +1,50 @@ +# $OpenBSD: ssh_config,v 1.33 2017/05/07 23:12:57 djm Exp $ + +# This is the ssh client system-wide configuration file. See +# ssh_config(5) for more information. This file provides defaults for +# users, and the values can be changed in per-user configuration files +# or on the command line. + +# Configuration data is parsed as follows: +# 1. command line options +# 2. user-specific file +# 3. system-wide file +# Any configuration value is only changed the first time it is set. +# Thus, host-specific definitions should be at the beginning of the +# configuration file, and defaults at the end. + +# Site-wide defaults for some commonly used options. For a comprehensive +# list of available options, their meanings and defaults, please see the +# ssh_config(5) man page. + +Host * +ForwardAgent no +ForwardX11 no +# RhostsRSAAuthentication no +# RSAAuthentication yes +# PasswordAuthentication yes +# HostbasedAuthentication no +# GSSAPIAuthentication no +# GSSAPIDelegateCredentials no +# BatchMode no +# CheckHostIP yes +# AddressFamily any +# ConnectTimeout 0 +# StrictHostKeyChecking ask +# IdentityFile ~/.ssh/id_rsa +# IdentityFile ~/.ssh/id_dsa +# IdentityFile ~/.ssh/id_ecdsa +# IdentityFile ~/.ssh/id_ed25519 +# Port 22 +Protocol 2 +# Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc +# MACs hmac-md5,hmac-sha1,umac-64@openssh.com +# EscapeChar ~ +# Tunnel no +# TunnelDevice any:any +# PermitLocalCommand no +# VisualHostKey no +# ProxyCommand ssh -q -W %h:%p gateway.example.com +# RekeyLimit 1G 1h +StrictHostKeyChecking ask +VerifyHostKeyDNS ask diff --git a/meta-openeuler/recipes-core/openssh/openssh/sshd b/meta-openeuler/recipes-core/openssh/openssh/sshd new file mode 100644 index 00000000000..4882e58b480 --- /dev/null +++ b/meta-openeuler/recipes-core/openssh/openssh/sshd @@ -0,0 +1,10 @@ +#%PAM-1.0 + +auth include common-auth +account required pam_nologin.so +account include common-account +password include common-password +session optional pam_keyinit.so force revoke +session include common-session +session required pam_loginuid.so + diff --git a/meta-openeuler/recipes-core/openssh/openssh/sshd.socket b/meta-openeuler/recipes-core/openssh/openssh/sshd.socket new file mode 100644 index 00000000000..12c39b26b59 --- /dev/null +++ b/meta-openeuler/recipes-core/openssh/openssh/sshd.socket @@ -0,0 +1,10 @@ +[Unit] +Conflicts=sshd.service + +[Socket] +ExecStartPre=@BASE_BINDIR@/mkdir -p /var/run/sshd +ListenStream=22 +Accept=yes + +[Install] +WantedBy=sockets.target diff --git a/meta-openeuler/recipes-core/openssh/openssh/sshd@.service b/meta-openeuler/recipes-core/openssh/openssh/sshd@.service new file mode 100644 index 00000000000..9d83dfb2bb1 --- /dev/null +++ b/meta-openeuler/recipes-core/openssh/openssh/sshd@.service @@ -0,0 +1,13 @@ +[Unit] +Description=OpenSSH Per-Connection Daemon +Wants=sshdgenkeys.service +After=sshdgenkeys.service + +[Service] +Environment="SSHD_OPTS=" +EnvironmentFile=-/etc/default/ssh +ExecStart=-@SBINDIR@/sshd -i $SSHD_OPTS +ExecReload=@BASE_BINDIR@/kill -HUP $MAINPID +StandardInput=socket +StandardError=syslog +KillMode=process diff --git a/meta-openeuler/recipes-core/openssh/openssh/sshd_config b/meta-openeuler/recipes-core/openssh/openssh/sshd_config new file mode 100644 index 00000000000..f0a3d2073a4 --- /dev/null +++ b/meta-openeuler/recipes-core/openssh/openssh/sshd_config @@ -0,0 +1,134 @@ +# $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $ + +# This is the sshd server system-wide configuration file. See +# sshd_config(5) for more information. + +# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin + +# The strategy used for options in the default sshd_config shipped with +# OpenSSH is to specify options with their default value where +# possible, but leave them commented. Uncommented options override the +# default value. + +#Port 22 +#AddressFamily any +#ListenAddress 0.0.0.0 +#ListenAddress :: + +#HostKey /etc/ssh/ssh_host_rsa_key +#HostKey /etc/ssh/ssh_host_ecdsa_key +#HostKey /etc/ssh/ssh_host_ed25519_key + +# Ciphers and keying +#RekeyLimit default none + +# Logging +#SyslogFacility AUTH +#LogLevel INFO + +# Authentication: + +LoginGraceTime 120 +#PermitRootLogin prohibit-password +#StrictModes yes +MaxAuthTries 3 +#MaxSessions 10 + +#PubkeyAuthentication yes + +# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2 +# but this is overridden so installations will only check .ssh/authorized_keys +AuthorizedKeysFile .ssh/authorized_keys + +#AuthorizedPrincipalsFile none + +#AuthorizedKeysCommand none +#AuthorizedKeysCommandUser nobody + +# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts +#HostbasedAuthentication no +# Change to yes if you don't trust ~/.ssh/known_hosts for +# HostbasedAuthentication +#IgnoreUserKnownHosts no +# Don't read the user's ~/.rhosts and ~/.shosts files +#IgnoreRhosts yes + +# To disable tunneled clear text passwords, change to no here! +#PasswordAuthentication yes +#PermitEmptyPasswords no + +# Change to no to disable s/key passwords +#ChallengeResponseAuthentication yes + +# Kerberos options +#KerberosAuthentication no +#KerberosOrLocalPasswd yes +#KerberosTicketCleanup yes +#KerberosGetAFSToken no + +# GSSAPI options +#GSSAPIAuthentication no +#GSSAPICleanupCredentials yes + +# Set this to 'yes' to enable PAM authentication, account processing, +# and session processing. If this is enabled, PAM authentication will +# be allowed through the ChallengeResponseAuthentication and +# PasswordAuthentication. Depending on your PAM configuration, +# PAM authentication via ChallengeResponseAuthentication may bypass +# the setting of "PermitRootLogin without-password". +# If you just want the PAM account and session checks to run without +# PAM authentication, then enable this but set PasswordAuthentication +# and ChallengeResponseAuthentication to 'no'. +UsePAM yes + +#AllowAgentForwarding yes +#AllowTcpForwarding yes +#GatewayPorts no +#X11Forwarding no +#X11DisplayOffset 10 +#X11UseLocalhost yes +#PermitTTY yes +#PrintMotd yes +#PrintLastLog yes +#TCPKeepAlive yes +PermitUserEnvironment no +#Compression delayed +ClientAliveInterval 300 +ClientAliveCountMax 0 +#UseDNS no +#PidFile /var/run/sshd.pid +#MaxStartups 10:30:100 +#PermitTunnel no +#ChrootDirectory none +#VersionAddendum none + +# no default banner path +#Banner none + +# override default of no subsystems +Subsystem sftp internal-sftp -l INFO + +# Example of overriding settings on a per-user basis +#Match User anoncvs +# X11Forwarding no +# AllowTcpForwarding no +# PermitTTY no +# ForceCommand cvs server +Protocol 2 +PubkeyAuthentication yes +IgnoreRhosts yes +StrictModes yes +Banner /etc/issue.net +SyslogFacility AUTH +LogLevel VERBOSE +PermitEmptyPasswords no +X11Forwarding no +PrintLastLog yes +HostbasedAuthentication no +MaxStartups 10:30:100 +PasswordAuthentication no +AllowTcpForwarding no +AllowAgentForwarding no +IgnoreUserKnownHosts yes +PermitRootLogin no +MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com diff --git a/meta-openeuler/recipes-core/openssh/openssh/sshd_config_readonly b/meta-openeuler/recipes-core/openssh/openssh/sshd_config_readonly new file mode 100644 index 00000000000..5368a2ff5b9 --- /dev/null +++ b/meta-openeuler/recipes-core/openssh/openssh/sshd_config_readonly @@ -0,0 +1,116 @@ +# $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $ + +# This is the sshd server system-wide configuration file. See +# sshd_config(5) for more information. + +# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin + +# The strategy used for options in the default sshd_config shipped with +# OpenSSH is to specify options with their default value where +# possible, but leave them commented. Uncommented options override the +# default value. + +#Port 22 +#AddressFamily any +#ListenAddress 0.0.0.0 +#ListenAddress :: + + +# Ciphers and keying +#RekeyLimit default none + +# Logging +#SyslogFacility AUTH +#LogLevel INFO + +# Authentication: + +#LoginGraceTime 2m +#PermitRootLogin prohibit-password +#StrictModes yes +#MaxAuthTries 6 +#MaxSessions 10 + +#PubkeyAuthentication yes + +# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2 +# but this is overridden so installations will only check .ssh/authorized_keys +AuthorizedKeysFile .ssh/authorized_keys + +#AuthorizedPrincipalsFile none + +#AuthorizedKeysCommand none +#AuthorizedKeysCommandUser nobody + +# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts +#HostbasedAuthentication no +# Change to yes if you don't trust ~/.ssh/known_hosts for +# HostbasedAuthentication +#IgnoreUserKnownHosts no +# Don't read the user's ~/.rhosts and ~/.shosts files +#IgnoreRhosts yes + +# To disable tunneled clear text passwords, change to no here! +#PasswordAuthentication yes +#PermitEmptyPasswords no + +# Change to no to disable s/key passwords +#ChallengeResponseAuthentication yes + +# Kerberos options +#KerberosAuthentication no +#KerberosOrLocalPasswd yes +#KerberosTicketCleanup yes +#KerberosGetAFSToken no + +# GSSAPI options +#GSSAPIAuthentication no +#GSSAPICleanupCredentials yes + +# Set this to 'yes' to enable PAM authentication, account processing, +# and session processing. If this is enabled, PAM authentication will +# be allowed through the ChallengeResponseAuthentication and +# PasswordAuthentication. Depending on your PAM configuration, +# PAM authentication via ChallengeResponseAuthentication may bypass +# the setting of "PermitRootLogin without-password". +# If you just want the PAM account and session checks to run without +# PAM authentication, then enable this but set PasswordAuthentication +# and ChallengeResponseAuthentication to 'no'. +UsePAM yes + +#AllowAgentForwarding yes +#AllowTcpForwarding yes +#GatewayPorts no +#X11Forwarding no +#X11DisplayOffset 10 +#X11UseLocalhost yes +#PermitTTY yes +#PrintMotd yes +#PrintLastLog yes +#TCPKeepAlive yes +#PermitUserEnvironment no +#Compression delayed +#ClientAliveInterval 0 +#ClientAliveCountMax 3 +#UseDNS no +#PidFile /var/run/sshd.pid +#MaxStartups 10:30:100 +#PermitTunnel no +#ChrootDirectory none +#VersionAddendum none + +# no default banner path +#Banner none + +# override default of no subsystems +Subsystem sftp /usr/libexec/sftp-server + +# Example of overriding settings on a per-user basis +#Match User anoncvs +# X11Forwarding no +# AllowTcpForwarding no +# PermitTTY no +# ForceCommand cvs server +HostKey /var/run/ssh/ssh_host_rsa_key +HostKey /var/run/ssh/ssh_host_ecdsa_key +HostKey /var/run/ssh/ssh_host_ed25519_key diff --git a/meta-openeuler/recipes-core/openssh/openssh/sshdgenkeys.service b/meta-openeuler/recipes-core/openssh/openssh/sshdgenkeys.service new file mode 100644 index 00000000000..603c33787f1 --- /dev/null +++ b/meta-openeuler/recipes-core/openssh/openssh/sshdgenkeys.service @@ -0,0 +1,8 @@ +[Unit] +Description=OpenSSH Key Generation +RequiresMountsFor=/var /run + +[Service] +ExecStart=@LIBEXECDIR@/sshd_check_keys +Type=oneshot +RemainAfterExit=yes diff --git a/meta-openeuler/recipes-core/openssh/openssh/volatiles.99_sshd b/meta-openeuler/recipes-core/openssh/openssh/volatiles.99_sshd new file mode 100644 index 00000000000..a0d2af3c652 --- /dev/null +++ b/meta-openeuler/recipes-core/openssh/openssh/volatiles.99_sshd @@ -0,0 +1,2 @@ +d root root 0755 /var/run/sshd none +f root root 0644 /var/log/lastlog none diff --git a/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb b/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb new file mode 100644 index 00000000000..91125344602 --- /dev/null +++ b/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb @@ -0,0 +1,168 @@ +SUMMARY = "A suite of security-related network utilities based on \ +the SSH protocol including the ssh client and sshd server" +DESCRIPTION = "Secure rlogin/rsh/rcp/telnet replacement (OpenSSH) \ +Ssh (Secure Shell) is a program for logging into a remote machine \ +and for executing commands on a remote machine." +HOMEPAGE = "http://www.openssh.com/" +SECTION = "console/network" +LICENSE = "BSD & ISC & MIT" + +DEPENDS = "zlib" +#DEPENDS = "zlib openssl virtual/crypt" +DEPENDS += "${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'libpam', '', d)}" + +#inherit manpages useradd update-rc.d update-alternatives systemd + +# remove base-passwd from all image +DEPENDS_remove_class-target += "base-passwd" +USERADDSETSCENEDEPS_remove_class-target += "${MLPREFIX}base-passwd:do_populate_sysroot_setscene" + +USERADD_PACKAGES = "${PN}-sshd" +USERADD_PARAM_${PN}-sshd = "--system --no-create-home --home-dir /var/run/sshd --shell /bin/false --user-group sshd" +INITSCRIPT_PACKAGES = "${PN}-sshd" +INITSCRIPT_NAME_${PN}-sshd = "sshd" +INITSCRIPT_PARAMS_${PN}-sshd = "defaults 9" + +SYSTEMD_PACKAGES = "${PN}-sshd" +SYSTEMD_SERVICE_${PN}-sshd = "sshd.socket" + +inherit autotools-brokensep + +LIC_FILES_CHKSUM="file://LICENCE;md5=18d9e5a8b3dd1790d73502f50426d4d3" +EXTRA_AUTORECONF_DEFINE = " ACLOCAL=echo " + +PACKAGECONFIG ??= "" +PACKAGECONFIG[kerberos] = "--with-kerberos5,--without-kerberos5,krb5" +PACKAGECONFIG[ldns] = "--with-ldns,--without-ldns,ldns" +PACKAGECONFIG[libedit] = "--with-libedit,--without-libedit,libedit" +PACKAGECONFIG[manpages] = "--with-mantype=man,--with-mantype=cat" + +# login path is hardcoded in sshd +EXTRA_OECONF = "'LOGIN_PROGRAM=${base_bindir}/login' \ + ${@bb.utils.contains('DISTRO_FEATURES', 'pam', '--with-pam', '--without-pam', d)} \ + --without-zlib-version-check \ + --with-privsep-path=${localstatedir}/run/sshd \ + --sysconfdir=${sysconfdir}/ssh \ + --with-xauth=${bindir}/xauth \ + --disable-strip \ + --without-openssl \ + " + +# musl doesn't implement wtmp/utmp +EXTRA_OECONF_append_libc-musl = " --disable-wtmp" + +# Since we do not depend on libbsd, we do not want configure to use it +# just because it finds libutil.h. But, specifying --disable-libutil +# causes compile errors, so... +CACHED_CONFIGUREVARS += "ac_cv_header_bsd_libutil_h=no ac_cv_header_libutil_h=no" + +# passwd path is hardcoded in sshd +CACHED_CONFIGUREVARS += "ac_cv_path_PATH_PASSWD_PROG=${bindir}/passwd" + +# We don't want to depend on libblockfile +CACHED_CONFIGUREVARS += "ac_cv_header_maillock_h=no" + +# copy SRC_URI files +SRC_URI = "file://openssh/openssh-8.2p1.tar.gz \ +file://ssh_config \ +file://init \ +file://sshd.socket \ +file://sshd@.service \ +file://sshdgenkeys.service \ +file://volatiles.99_sshd \ +file://config/common/sshd_check_keys \ +" + + +PAM_SRC_URI = "file://sshd" +SRC_URI_EXTRA = "file://ssh_config \ + file://init \ + ${@bb.utils.contains('DISTRO_FEATURES', 'pam', '${PAM_SRC_URI}', '', d)} \ + file://sshd.socket \ + file://sshd@.service \ + file://sshdgenkeys.service \ + file://volatiles.99_sshd \ + file://config/common/sshd_check_keys \ + " + +do_configure_prepend () { + export LD="${CC}" + install -m 0644 ${WORKDIR}/ssh_config ${B}/ +} + +do_install_append () { + if [ "${@bb.utils.filter('DISTRO_FEATURES', 'pam', d)}" ]; then +# install -D -m 0644 ${WORKDIR}/openssh-8.2p1/sshd ${D}${sysconfdir}/pam.d/sshd + sed -i -e 's:#UsePAM no:UsePAM yes:' ${D}${sysconfdir}/ssh/sshd_config + fi + + if [ "${@bb.utils.filter('DISTRO_FEATURES', 'x11', d)}" ]; then + sed -i -e 's:#X11Forwarding no:X11Forwarding yes:' ${D}${sysconfdir}/ssh/sshd_config + fi + + install -d ${D}${sysconfdir}/init.d + install -m 0750 ${WORKDIR}/init ${D}${sysconfdir}/init.d/sshd + rm -f ${D}${bindir}/slogin ${D}${datadir}/Ssh.bin + rmdir ${D}${localstatedir}/run/sshd ${D}${localstatedir}/run ${D}${localstatedir} + install -d ${D}/${sysconfdir}/default/volatiles + install -m 644 ${WORKDIR}/volatiles.99_sshd ${D}/${sysconfdir}/default/volatiles/99_sshd + install -m 0755 ${S}/contrib/ssh-copy-id ${D}${bindir} + + # Create config files for read-only rootfs + install -d ${D}${sysconfdir}/ssh + install -m 644 ${D}${sysconfdir}/ssh/sshd_config ${D}${sysconfdir}/ssh/sshd_config_readonly + sed -i '/HostKey/d' ${D}${sysconfdir}/ssh/sshd_config_readonly + echo "HostKey /var/run/ssh/ssh_host_rsa_key" >> ${D}${sysconfdir}/ssh/sshd_config_readonly + echo "HostKey /var/run/ssh/ssh_host_ecdsa_key" >> ${D}${sysconfdir}/ssh/sshd_config_readonly + echo "HostKey /var/run/ssh/ssh_host_ed25519_key" >> ${D}${sysconfdir}/ssh/sshd_config_readonly + + install -d ${D}${systemd_unitdir}/system + install -c -m 0644 ${WORKDIR}/sshd.socket ${D}${systemd_unitdir}/system + install -c -m 0644 ${WORKDIR}/sshd@.service ${D}${systemd_unitdir}/system + install -c -m 0644 ${WORKDIR}/sshdgenkeys.service ${D}${systemd_unitdir}/system + sed -i -e 's,@BASE_BINDIR@,${base_bindir},g' \ + -e 's,@SBINDIR@,${sbindir},g' \ + -e 's,@BINDIR@,${bindir},g' \ + -e 's,@LIBEXECDIR@,${libexecdir}/${BPN},g' \ + ${D}${systemd_unitdir}/system/sshd.socket ${D}${systemd_unitdir}/system/*.service + + sed -i -e 's,@LIBEXECDIR@,${libexecdir}/${BPN},g' \ + ${D}${sysconfdir}/init.d/sshd + + install -D -m 0755 ${WORKDIR}/config/common/sshd_check_keys ${D}${libexecdir}/${BPN}/sshd_check_keys + chmod -s ${D}/usr/libexec/ssh-keysign + chmod 0600 ${D}${sysconfdir}/ssh/sshd_config + rm -rf ${D}/lib/ +} + +ALLOW_EMPTY_${PN} = "0" + +PACKAGES =+ "${PN}-keygen ${PN}-scp ${PN}-ssh ${PN}-sshd ${PN}-sftp ${PN}-misc ${PN}-sftp-server" +FILES_${PN}-scp = "${bindir}/scp.${BPN}" +FILES_${PN}-ssh = "${bindir}/ssh.${BPN} ${sysconfdir}/ssh/ssh_config" +FILES_${PN}-sshd = "${sbindir}/sshd ${sysconfdir}/init.d/sshd ${systemd_unitdir}/system" +FILES_${PN}-sshd += "${sysconfdir}/ssh/moduli ${sysconfdir}/ssh/sshd_config ${sysconfdir}/ssh/sshd_config_readonly ${sysconfdir}/default/volatiles/99_sshd ${sysconfdir}/pam.d/sshd" +FILES_${PN}-sshd += "${libexecdir}/${BPN}/sshd_check_keys" +FILES_${PN}-sftp = "${bindir}/sftp" +FILES_${PN}-sftp-server = "${libexecdir}/sftp-server" +FILES_${PN}-misc = "${bindir}/ssh* ${libexecdir}/ssh*" +FILES_${PN}-keygen = "${bindir}/ssh-keygen" + +RDEPENDS_${PN} += "${PN}-scp ${PN}-ssh ${PN}-sshd ${PN}-keygen" +RDEPENDS_${PN}-sshd += "${PN}-keygen ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam-plugin-keyinit pam-plugin-loginuid', '', d)}" +#RRECOMMENDS_${PN}-sshd_append_class-target = " rng-tools" + +RPROVIDES_${PN}-ssh = "ssh" +RPROVIDES_${PN}-sshd = "sshd" + +RCONFLICTS_${PN} = "dropbear" +RCONFLICTS_${PN}-sshd = "dropbear" + +CONFFILES_${PN}-sshd = "${sysconfdir}/ssh/sshd_config" +CONFFILES_${PN}-ssh = "${sysconfdir}/ssh/ssh_config" + +ALTERNATIVE_PRIORITY = "90" +ALTERNATIVE_${PN}-scp = "scp" +ALTERNATIVE_${PN}-ssh = "ssh" + +BBCLASSEXTEND += "nativesdk" -- Gitee From 6ceaa6ff3ed3bc2e3a6e00ed0af415073d8ec6f0 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Fri, 17 Sep 2021 17:11:46 +0800 Subject: [PATCH 016/304] add recipe for openssl Signed-off-by: Wayne Ren --- .../openssl/files/environment.d-openssl.sh | 1 + .../recipes-core/openssl/openssl.inc | 226 ++++++++++++++++++ ...sysroot-and-debug-prefix-map-from-co.patch | 76 ++++++ .../0001-skip-test_symbol_presence.patch | 46 ++++ ...ort-for-io_pgetevents_time64-syscall.patch | 62 +++++ ...ort-for-io_pgetevents_time64-syscall.patch | 99 ++++++++ .../recipes-core/openssl/openssl/afalg.patch | 31 +++ .../recipes-core/openssl/openssl/find.pl | 54 +++++ .../openssl/openssl/reproducible.patch | 32 +++ .../recipes-core/openssl/openssl/run-ptest | 12 + .../recipes-core/openssl/openssl_1.1.1f.bb | 177 ++++++++++++++ 11 files changed, 816 insertions(+) create mode 100644 meta-openeuler/recipes-core/openssl/files/environment.d-openssl.sh create mode 100644 meta-openeuler/recipes-core/openssl/openssl.inc create mode 100644 meta-openeuler/recipes-core/openssl/openssl/0001-buildinfo-strip-sysroot-and-debug-prefix-map-from-co.patch create mode 100644 meta-openeuler/recipes-core/openssl/openssl/0001-skip-test_symbol_presence.patch create mode 100644 meta-openeuler/recipes-core/openssl/openssl/0003-Add-support-for-io_pgetevents_time64-syscall.patch create mode 100644 meta-openeuler/recipes-core/openssl/openssl/0004-Fixup-support-for-io_pgetevents_time64-syscall.patch create mode 100644 meta-openeuler/recipes-core/openssl/openssl/afalg.patch create mode 100644 meta-openeuler/recipes-core/openssl/openssl/find.pl create mode 100644 meta-openeuler/recipes-core/openssl/openssl/reproducible.patch create mode 100644 meta-openeuler/recipes-core/openssl/openssl/run-ptest create mode 100644 meta-openeuler/recipes-core/openssl/openssl_1.1.1f.bb diff --git a/meta-openeuler/recipes-core/openssl/files/environment.d-openssl.sh b/meta-openeuler/recipes-core/openssl/files/environment.d-openssl.sh new file mode 100644 index 00000000000..d05a93b0f0d --- /dev/null +++ b/meta-openeuler/recipes-core/openssl/files/environment.d-openssl.sh @@ -0,0 +1 @@ +export OPENSSL_CONF="$OECORE_NATIVE_SYSROOT/usr/lib/ssl/openssl.cnf" diff --git a/meta-openeuler/recipes-core/openssl/openssl.inc b/meta-openeuler/recipes-core/openssl/openssl.inc new file mode 100644 index 00000000000..3a25c10dd2f --- /dev/null +++ b/meta-openeuler/recipes-core/openssl/openssl.inc @@ -0,0 +1,226 @@ +SUMMARY = "Secure Socket Layer" +DESCRIPTION = "Secure Socket Layer (SSL) binary and related cryptographic tools." +HOMEPAGE = "http://www.openssl.org/" +BUGTRACKER = "http://www.openssl.org/news/vulnerabilities.html" +SECTION = "libs/network" + +# "openssl | SSLeay" dual license +LICENSE = "openssl" + +DEPENDS = "perl-native-runtime nettle" +DEPENDS_append_class-target = " openssl-native" +#DEPENDS_append_class-target = " linux-libc-headers" + +SRC_URI = "file://openssl/openssl-1.1.1f.tar.gz" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d343e62fc9c833710bbbed25f27364c8" + +S = "${WORKDIR}/openssl-${PV}" + +PACKAGECONFIG[perl] = ",,," + +#AR_append = " r" +# Avoid binaries being marked as requiring an executable stack since it +# doesn't(which causes and this causes issues with SELinux +inherit utils +CFLAG = "${@oe.utils.conditional('SITEINFO_ENDIANNESS', 'le', '-DL_ENDIAN', '-DB_ENDIAN', d)} \ + -DTERMIO ${CFLAGS} -Wall -Wa,--noexecstack" + +# -02 does not work on mipsel: ssh hangs when it tries to read /dev/urandom +CFLAG_mtx-1 := "${@'${CFLAG}'.replace('-O2', '')}" +CFLAG_mtx-2 := "${@'${CFLAG}'.replace('-O2', '')}" + +export DIRS = "crypto ssl apps" +export EX_LIBS = "-lgcc -ldl" +export AS = "${CC} -c" + +inherit pkgconfig siteinfo multilib_header ptest + +PACKAGES =+ "libcrypto libssl ${PN}-misc openssl-conf" +FILES_libcrypto = "${base_libdir}/libcrypto${SOLIBS}" +FILES_libssl = "${libdir}/libssl.so.*" +FILES_${PN} =+ " ${libdir}/ssl/*" +FILES_${PN}-misc = "${libdir}/ssl/misc ${bindir}/c_rehash" +RDEPENDS_${PN}-misc = "${@bb.utils.contains('PACKAGECONFIG', 'perl', 'perl', '', d)}" +FILES_${PN}-dev += "${base_libdir}/libcrypto${SOLIBSDEV}" + +# Add the openssl.cnf file to the openssl-conf package. Make the libcrypto +# package RRECOMMENDS on this package. This will enable the configuration +# file to be installed for both the base openssl package and the libcrypto +# package since the base openssl package depends on the libcrypto package. +FILES_openssl-conf = "${libdir}/ssl/openssl.cnf" +CONFFILES_openssl-conf = "${libdir}/ssl/openssl.cnf" +RRECOMMENDS_libcrypto += "openssl-conf" +RDEPENDS_${PN}-ptest += "${PN}-misc make perl perl-module-filehandle bc" + +# Remove this to enable SSLv3. SSLv3 is defaulted to disabled due to the POODLE +# vulnerability +EXTRA_OECONF = " -no-ssl3" + +do_configure_prepend_darwin () { + sed -i -e '/version-script=openssl\.ld/d' Configure +} + +do_configure () { + cd util + perl perlpath.pl ${STAGING_BINDIR_NATIVE} + cd .. + ln -sf apps/openssl.pod crypto/crypto.pod ssl/ssl.pod doc/ + + os=${HOST_OS} + case $os in + linux-uclibc |\ + linux-uclibceabi |\ + linux-gnueabi |\ + linux-uclibcspe |\ + linux-gnuspe |\ + linux-musl*) + os=linux + ;; + *) + ;; + esac + if [ "${libdir}" != "/usr/libilp32" ]; then + target="$os-${HOST_ARCH}" + else + target="${HOST_OS}-${HOST_ARCH}" + fi + case $target in + linux-arm) + target=linux-armv4 + ;; + linux-armeb) + target=linux-elf-armeb + ;; + linux-aarch64*) + target=linux-generic64 + ;; + linux-gnuilp32-aarch64*) + target=linux-aarch64-ilp32 + ;; + linux-sh3) + target=debian-sh3 + ;; + linux-sh4) + target=debian-sh4 + ;; + linux-i486) + target=debian-i386-i486 + ;; + linux-i586 | linux-viac3) + target=debian-i386-i586 + ;; + linux-i686) + target=debian-i386-i686/cmov + ;; + linux-gnux32-x86_64) + target=linux-x32 + ;; + linux-gnu64-x86_64) + target=linux-x86_64 + ;; + linux-mips) + target=debian-mips + ;; + linux-mipsel) + target=debian-mipsel + ;; + linux-*-mips64) + target=linux-mips + ;; + linux-microblaze*) + target=linux-generic32 + ;; + linux-powerpc) + target=linux-ppc + ;; + linux-powerpc64) + target=linux-ppc64 + ;; + linux-supersparc) + target=linux-sparcv8 + ;; + linux-sparc) + target=linux-sparcv8 + ;; + darwin-i386) + target=darwin-i386-cc + ;; + esac + # inject machine-specific flags + sed -i -e "s|^\(\"$target\",\s*\"[^:]\+\):\([^:]\+\)|\1:${CFLAG}|g" Configure + useprefix=${prefix} + if [ "x$useprefix" = "x" ]; then + useprefix=/ + fi + perl ./Configure ${EXTRA_OECONF} shared --prefix=$useprefix --openssldir=${libdir}/ssl --libdir=`basename ${libdir}` $target +} + +do_compile_prepend_class-target () { + sed -i 's/\((OPENSSL=\)".*"/\1"openssl"/' Makefile +} + +do_compile () { + oe_runmake +} + +do_compile_ptest () { + oe_runmake buildtest +} + +do_install () { + # Create ${D}/${prefix} to fix parallel issues + mkdir -p ${D}/${prefix}/ + + oe_runmake INSTALL_PREFIX="${D}" MANDIR="${mandir}" install + + oe_libinstall -so libcrypto ${D}${libdir} + oe_libinstall -so libssl ${D}${libdir} + + # Moving libcrypto to /lib + if [ ! ${D}${libdir} -ef ${D}${base_libdir} ]; then + mkdir -p ${D}/${base_libdir}/ + mv ${D}${libdir}/libcrypto* ${D}${base_libdir}/ + sed -i s#libdir=\$\{exec_prefix\}\/lib#libdir=${base_libdir}# ${D}/${libdir}/pkgconfig/libcrypto.pc + fi + + install -d ${D}${includedir} + cp --dereference -R include/openssl ${D}${includedir} + + if [ "${libdir}" != "/usr/libilp32" ]; then + oe_multilib_header openssl/opensslconf.h + fi + + if [ "${@bb.utils.contains('PACKAGECONFIG', 'perl', 'perl', '', d)}" = "perl" ]; then + install -m 0755 ${S}/tools/c_rehash ${D}${bindir} + sed -i -e '1s,.*,#!${bindir}/env perl,' ${D}${bindir}/c_rehash + sed -i -e '1s,.*,#!${bindir}/env perl,' ${D}${libdir}/ssl/misc/CA.pl + sed -i -e '1s,.*,#!${bindir}/env perl,' ${D}${libdir}/ssl/misc/tsget + # The c_rehash utility isn't installed by the normal installation process. + else + rm -f ${D}${bindir}/c_rehash + rm -f ${D}${libdir}/ssl/misc/CA.pl ${D}${libdir}/ssl/misc/tsget + fi +} + +do_install_ptest () { + cp -r Makefile test ${D}${PTEST_PATH} + cp -r certs ${D}${PTEST_PATH} + mkdir -p ${D}${PTEST_PATH}/apps + ln -sf /usr/lib/ssl/misc/CA.sh ${D}${PTEST_PATH}/apps + ln -sf /usr/lib/ssl/openssl.cnf ${D}${PTEST_PATH}/apps + ln -sf /usr/bin/openssl ${D}${PTEST_PATH}/apps + cp apps/server2.pem ${D}${PTEST_PATH}/apps + mkdir -p ${D}${PTEST_PATH}/util + install util/opensslwrap.sh ${D}${PTEST_PATH}/util + install util/shlib_wrap.sh ${D}${PTEST_PATH}/util +} + +do_install_append_virtclass-native() { + create_wrapper ${D}${bindir}/openssl \ + OPENSSL_CONF=${libdir}/ssl/openssl.cnf \ + SSL_CERT_DIR=${libdir}/ssl/certs \ + SSL_CERT_FILE=${libdir}/ssl/cert.pem \ + OPENSSL_ENGINES=${libdir}/ssl/engines +} + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-openeuler/recipes-core/openssl/openssl/0001-buildinfo-strip-sysroot-and-debug-prefix-map-from-co.patch b/meta-openeuler/recipes-core/openssl/openssl/0001-buildinfo-strip-sysroot-and-debug-prefix-map-from-co.patch new file mode 100644 index 00000000000..1d8821578a3 --- /dev/null +++ b/meta-openeuler/recipes-core/openssl/openssl/0001-buildinfo-strip-sysroot-and-debug-prefix-map-from-co.patch @@ -0,0 +1,76 @@ +From 3e1d00481093e10775eaf69d619c45b32a4aa7dc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Martin=20Hundeb=C3=B8ll?= +Date: Tue, 6 Nov 2018 14:50:47 +0100 +Subject: [PATCH] buildinfo: strip sysroot and debug-prefix-map from compiler + info +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The openssl build system generates buildinf.h containing the full +compiler command line used to compile objects. This breaks +reproducibility, as the compile command is baked into libcrypto, where +it is used when running `openssl version -f`. + +Add stripped build variables for the compiler and cflags lines, and use +those when generating buildinfo.h. + +This is based on a similar patch for older openssl versions: +https://patchwork.openembedded.org/patch/147229/ + +Upstream-Status: Inappropriate [OE specific] +Signed-off-by: Martin Hundeb酶ll + + +Update to fix buildpaths qa issue for '-fmacro-prefix-map'. + +Signed-off-by: Kai Kang +--- + Configurations/unix-Makefile.tmpl | 10 +++++++++- + crypto/build.info | 2 +- + 2 files changed, 10 insertions(+), 2 deletions(-) + +diff --git a/Configurations/unix-Makefile.tmpl b/Configurations/unix-Makefile.tmpl +index 16af4d2087..54c162784c 100644 +--- a/Configurations/unix-Makefile.tmpl ++++ b/Configurations/unix-Makefile.tmpl +@@ -317,13 +317,22 @@ BIN_LDFLAGS={- join(' ', $target{bin_lflags} || (), + '$(CNF_LDFLAGS)', '$(LDFLAGS)') -} + BIN_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS) + +-# CPPFLAGS_Q is used for one thing only: to build up buildinf.h ++# *_Q variables are used for one thing only: to build up buildinf.h + CPPFLAGS_Q={- $cppflags1 =~ s|([\\"])|\\$1|g; + $cppflags2 =~ s|([\\"])|\\$1|g; + $lib_cppflags =~ s|([\\"])|\\$1|g; + join(' ', $lib_cppflags || (), $cppflags2 || (), + $cppflags1 || ()) -} + ++CFLAGS_Q={- for (@{$config{CFLAGS}}) { ++ s|-fdebug-prefix-map=[^ ]+|-fdebug-prefix-map=|g; ++ s|-fmacro-prefix-map=[^ ]+|-fmacro-prefix-map=|g; ++ } ++ join(' ', @{$config{CFLAGS}}) -} ++ ++CC_Q={- $config{CC} =~ s|--sysroot=[^ ]+|--sysroot=recipe-sysroot|g; ++ join(' ', $config{CC}) -} ++ + PERLASM_SCHEME= {- $target{perlasm_scheme} -} + + # For x86 assembler: Set PROCESSOR to 386 if you want to support +diff --git a/crypto/build.info b/crypto/build.info +index b515b7318e..8c9cee2a09 100644 +--- a/crypto/build.info ++++ b/crypto/build.info +@@ -10,7 +10,7 @@ EXTRA= ../ms/uplink-x86.pl ../ms/uplink.c ../ms/applink.c \ + ppccpuid.pl pariscid.pl alphacpuid.pl arm64cpuid.pl armv4cpuid.pl + + DEPEND[cversion.o]=buildinf.h +-GENERATE[buildinf.h]=../util/mkbuildinf.pl "$(CC) $(LIB_CFLAGS) $(CPPFLAGS_Q)" "$(PLATFORM)" ++GENERATE[buildinf.h]=../util/mkbuildinf.pl "$(CC_Q) $(CFLAGS_Q) $(CPPFLAGS_Q)" "$(PLATFORM)" + DEPEND[buildinf.h]=../configdata.pm + + GENERATE[uplink-x86.s]=../ms/uplink-x86.pl $(PERLASM_SCHEME) +-- +2.19.1 + diff --git a/meta-openeuler/recipes-core/openssl/openssl/0001-skip-test_symbol_presence.patch b/meta-openeuler/recipes-core/openssl/openssl/0001-skip-test_symbol_presence.patch new file mode 100644 index 00000000000..f6032dca144 --- /dev/null +++ b/meta-openeuler/recipes-core/openssl/openssl/0001-skip-test_symbol_presence.patch @@ -0,0 +1,46 @@ +From a9401b2289656c5a36dd1b0ecebf0d23e291ce70 Mon Sep 17 00:00:00 2001 +From: Hongxu Jia +Date: Tue, 2 Oct 2018 23:58:24 +0800 +Subject: [PATCH] skip test_symbol_presence + +We cannot skip `01-test_symbol_presence.t' by configuring option `no-shared' +as INSTALL told us the shared libraries will not be built. + +[INSTALL snip] + Notes on shared libraries + ------------------------- + + For most systems the OpenSSL Configure script knows what is needed to + build shared libraries for libcrypto and libssl. On these systems + the shared libraries will be created by default. This can be suppressed and + only static libraries created by using the "no-shared" option. On systems + where OpenSSL does not know how to build shared libraries the "no-shared" + option will be forced and only static libraries will be created. +[INSTALL snip] + +Hence directly modification the case to skip it. + +Upstream-Status: Inappropriate [OE Specific] + +Signed-off-by: Hongxu Jia +--- + test/recipes/01-test_symbol_presence.t | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/test/recipes/01-test_symbol_presence.t b/test/recipes/01-test_symbol_presence.t +index 7f2a2d7..0b93745 100644 +--- a/test/recipes/01-test_symbol_presence.t ++++ b/test/recipes/01-test_symbol_presence.t +@@ -14,8 +14,7 @@ use OpenSSL::Test::Utils; + + setup("test_symbol_presence"); + +-plan skip_all => "Only useful when building shared libraries" +- if disabled("shared"); ++plan skip_all => "The case needs debug symbols then we just disable it"; + + my @libnames = ("crypto", "ssl"); + my $testcount = scalar @libnames; +-- +2.7.4 + diff --git a/meta-openeuler/recipes-core/openssl/openssl/0003-Add-support-for-io_pgetevents_time64-syscall.patch b/meta-openeuler/recipes-core/openssl/openssl/0003-Add-support-for-io_pgetevents_time64-syscall.patch new file mode 100644 index 00000000000..bfd878a0e23 --- /dev/null +++ b/meta-openeuler/recipes-core/openssl/openssl/0003-Add-support-for-io_pgetevents_time64-syscall.patch @@ -0,0 +1,62 @@ +From 5b5e2985f355c8e99c196d9ce5d02c15bebadfbc Mon Sep 17 00:00:00 2001 +From: Alistair Francis +Date: Thu, 29 Aug 2019 13:56:21 -0700 +Subject: [PATCH] Add support for io_pgetevents_time64 syscall + +32-bit architectures that are y2038 safe don't include syscalls that use +32-bit time_t. Instead these architectures have suffixed syscalls that +always use a 64-bit time_t. In the case of the io_getevents syscall the +syscall has been replaced with the io_pgetevents_time64 syscall instead. + +This patch changes the io_getevents() function to use the correct +syscall based on the avaliable syscalls and the time_t size. We will +only use the new 64-bit time_t syscall if the architecture is using a +64-bit time_t. This is to avoid having to deal with 32/64-bit +conversions and relying on a 64-bit timespec struct on 32-bit time_t +platforms. As of Linux 5.3 there are no 32-bit time_t architectures +without __NR_io_getevents. In the future if a 32-bit time_t architecture +wants to use the 64-bit syscalls we can handle the conversion. + +This fixes build failures on 32-bit RISC-V. + +Signed-off-by: Alistair Francis + +Reviewed-by: Richard Levitte +Reviewed-by: Paul Dale +(Merged from https://github.com/openssl/openssl/pull/9819) +Upstream-Status: Accepted +--- + engines/e_afalg.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/engines/e_afalg.c b/engines/e_afalg.c +index dacbe358cb..99516cb1bb 100644 +--- a/engines/e_afalg.c ++++ b/engines/e_afalg.c +@@ -125,7 +125,23 @@ static ossl_inline int io_getevents(aio_context_t ctx, long min, long max, + struct io_event *events, + struct timespec *timeout) + { ++#if defined(__NR_io_getevents) + return syscall(__NR_io_getevents, ctx, min, max, events, timeout); ++#elif defined(__NR_io_pgetevents_time64) ++ /* Let's only support the 64 suffix syscalls for 64-bit time_t. ++ * This simplifies the code for us as we don't need to use a 64-bit ++ * version of timespec with a 32-bit time_t and handle converting ++ * between 64-bit and 32-bit times and check for overflows. ++ */ ++ if (sizeof(timeout->tv_sec) == 8) ++ return syscall(__NR_io_pgetevents_time64, ctx, min, max, events, timeout, NULL); ++ else { ++ errno = ENOSYS; ++ return -1; ++ } ++#else ++# error "We require either the io_getevents syscall or __NR_io_pgetevents_time64." ++#endif + } + + static void afalg_waitfd_cleanup(ASYNC_WAIT_CTX *ctx, const void *key, +-- +2.30.1 + diff --git a/meta-openeuler/recipes-core/openssl/openssl/0004-Fixup-support-for-io_pgetevents_time64-syscall.patch b/meta-openeuler/recipes-core/openssl/openssl/0004-Fixup-support-for-io_pgetevents_time64-syscall.patch new file mode 100644 index 00000000000..c16d490aec0 --- /dev/null +++ b/meta-openeuler/recipes-core/openssl/openssl/0004-Fixup-support-for-io_pgetevents_time64-syscall.patch @@ -0,0 +1,99 @@ +From e5499a3cac1e823c3e0697e8667e952317b70cc8 Mon Sep 17 00:00:00 2001 +From: Alistair Francis +Date: Thu, 4 Mar 2021 12:10:11 -0500 +Subject: [PATCH] Fixup support for io_pgetevents_time64 syscall + +This is a fixup for the original commit 5b5e2985f355c8e99c196d9ce5d02c15bebadfbc +"Add support for io_pgetevents_time64 syscall" that didn't correctly +work for 32-bit architecutres with a 64-bit time_t that aren't RISC-V. + +For a full discussion of the issue see: +https://github.com/openssl/openssl/commit/5b5e2985f355c8e99c196d9ce5d02c15bebadfbc + +Signed-off-by: Alistair Francis + +Reviewed-by: Tomas Mraz +Reviewed-by: Paul Dale +(Merged from https://github.com/openssl/openssl/pull/14432) +Upstream-Status: Accepted +--- + engines/e_afalg.c | 55 ++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 42 insertions(+), 13 deletions(-) + +diff --git a/engines/e_afalg.c b/engines/e_afalg.c +index 9480d7c24b..4e9d67db2d 100644 +--- a/engines/e_afalg.c ++++ b/engines/e_afalg.c +@@ -124,27 +124,56 @@ static ossl_inline int io_read(aio_context_t ctx, long n, struct iocb **iocb) + return syscall(__NR_io_submit, ctx, n, iocb); + } + ++/* A version of 'struct timespec' with 32-bit time_t and nanoseconds. */ ++struct __timespec32 ++{ ++ __kernel_long_t tv_sec; ++ __kernel_long_t tv_nsec; ++}; ++ + static ossl_inline int io_getevents(aio_context_t ctx, long min, long max, + struct io_event *events, + struct timespec *timeout) + { ++#if defined(__NR_io_pgetevents_time64) ++ /* Check if we are a 32-bit architecture with a 64-bit time_t */ ++ if (sizeof(*timeout) != sizeof(struct __timespec32)) { ++ int ret = syscall(__NR_io_pgetevents_time64, ctx, min, max, events, ++ timeout, NULL); ++ if (ret == 0 || errno != ENOSYS) ++ return ret; ++ } ++#endif ++ + #if defined(__NR_io_getevents) +- return syscall(__NR_io_getevents, ctx, min, max, events, timeout); +-#elif defined(__NR_io_pgetevents_time64) +- /* Let's only support the 64 suffix syscalls for 64-bit time_t. +- * This simplifies the code for us as we don't need to use a 64-bit +- * version of timespec with a 32-bit time_t and handle converting +- * between 64-bit and 32-bit times and check for overflows. +- */ +- if (sizeof(timeout->tv_sec) == 8) +- return syscall(__NR_io_pgetevents_time64, ctx, min, max, events, timeout, NULL); ++ if (sizeof(*timeout) == sizeof(struct __timespec32)) ++ /* ++ * time_t matches our architecture length, we can just use ++ * __NR_io_getevents ++ */ ++ return syscall(__NR_io_getevents, ctx, min, max, events, timeout); + else { +- errno = ENOSYS; +- return -1; ++ /* ++ * We don't have __NR_io_pgetevents_time64, but we are using a ++ * 64-bit time_t on a 32-bit architecture. If we can fit the ++ * timeout value in a 32-bit time_t, then let's do that ++ * and then use the __NR_io_getevents syscall. ++ */ ++ if (timeout && timeout->tv_sec == (long)timeout->tv_sec) { ++ struct __timespec32 ts32; ++ ++ ts32.tv_sec = (__kernel_long_t) timeout->tv_sec; ++ ts32.tv_nsec = (__kernel_long_t) timeout->tv_nsec; ++ ++ return syscall(__NR_io_getevents, ctx, min, max, events, ts32); ++ } else { ++ return syscall(__NR_io_getevents, ctx, min, max, events, NULL); ++ } + } +-#else +-# error "We require either the io_getevents syscall or __NR_io_pgetevents_time64." + #endif ++ ++ errno = ENOSYS; ++ return -1; + } + + static void afalg_waitfd_cleanup(ASYNC_WAIT_CTX *ctx, const void *key, +-- +2.30.1 + diff --git a/meta-openeuler/recipes-core/openssl/openssl/afalg.patch b/meta-openeuler/recipes-core/openssl/openssl/afalg.patch new file mode 100644 index 00000000000..ce816086a46 --- /dev/null +++ b/meta-openeuler/recipes-core/openssl/openssl/afalg.patch @@ -0,0 +1,31 @@ +Don't refuse to build afalgeng if cross-compiling or the host kernel is too old. + +Upstream-Status: Submitted [hhttps://github.com/openssl/openssl/pull/7688] +Signed-off-by: Ross Burton + +diff --git a/Configure b/Configure +index 3baa8ce..9ef52ed 100755 +--- a/Configure ++++ b/Configure +@@ -1550,20 +1550,7 @@ unless ($disabled{"crypto-mdebug-backtrace"}) + unless ($disabled{afalgeng}) { + $config{afalgeng}=""; + if (grep { $_ eq 'afalgeng' } @{$target{enable}}) { +- my $minver = 4*10000 + 1*100 + 0; +- if ($config{CROSS_COMPILE} eq "") { +- my $verstr = `uname -r`; +- my ($ma, $mi1, $mi2) = split("\\.", $verstr); +- ($mi2) = $mi2 =~ /(\d+)/; +- my $ver = $ma*10000 + $mi1*100 + $mi2; +- if ($ver < $minver) { +- disable('too-old-kernel', 'afalgeng'); +- } else { +- push @{$config{engdirs}}, "afalg"; +- } +- } else { +- disable('cross-compiling', 'afalgeng'); +- } ++ push @{$config{engdirs}}, "afalg"; + } else { + disable('not-linux', 'afalgeng'); + } diff --git a/meta-openeuler/recipes-core/openssl/openssl/find.pl b/meta-openeuler/recipes-core/openssl/openssl/find.pl new file mode 100644 index 00000000000..257d6276c82 --- /dev/null +++ b/meta-openeuler/recipes-core/openssl/openssl/find.pl @@ -0,0 +1,54 @@ +warn "Legacy library @{[(caller(0))[6]]} will be removed from the Perl core distribution in the next major release. Please install it from the CPAN distribution Perl4::CoreLibs. It is being used at @{[(caller)[1]]}, line @{[(caller)[2]]}.\n"; + +# This library is deprecated and unmaintained. It is included for +# compatibility with Perl 4 scripts which may use it, but it will be +# removed in a future version of Perl. Please use the File::Find module +# instead. + +# Usage: +# require "find.pl"; +# +# &find('/foo','/bar'); +# +# sub wanted { ... } +# where wanted does whatever you want. $dir contains the +# current directory name, and $_ the current filename within +# that directory. $name contains "$dir/$_". You are cd'ed +# to $dir when the function is called. The function may +# set $prune to prune the tree. +# +# For example, +# +# find / -name .nfs\* -mtime +7 -exec rm -f {} \; -o -fstype nfs -prune +# +# corresponds to this +# +# sub wanted { +# /^\.nfs.*$/ && +# (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && +# int(-M _) > 7 && +# unlink($_) +# || +# ($nlink || (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_))) && +# $dev < 0 && +# ($prune = 1); +# } +# +# Set the variable $dont_use_nlink if you're using AFS, since AFS cheats. + +use File::Find (); + +*name = *File::Find::name; +*prune = *File::Find::prune; +*dir = *File::Find::dir; +*topdir = *File::Find::topdir; +*topdev = *File::Find::topdev; +*topino = *File::Find::topino; +*topmode = *File::Find::topmode; +*topnlink = *File::Find::topnlink; + +sub find { + &File::Find::find(\&wanted, @_); +} + +1; diff --git a/meta-openeuler/recipes-core/openssl/openssl/reproducible.patch b/meta-openeuler/recipes-core/openssl/openssl/reproducible.patch new file mode 100644 index 00000000000..35441f304d4 --- /dev/null +++ b/meta-openeuler/recipes-core/openssl/openssl/reproducible.patch @@ -0,0 +1,32 @@ +The value for perl_archname can vary depending on the host, e.g. +x86_64-linux-gnu-thread-multi or x86_64-linux-thread-multi which +makes the ptest package non-reproducible. Its unused other than +these references so drop it. + +RP 2020/2/6 + +Upstream-Status: Pending +Signed-off-by: Richard Purdie + +Index: openssl-1.1.1d/Configure +=================================================================== +--- openssl-1.1.1d.orig/Configure ++++ openssl-1.1.1d/Configure +@@ -286,7 +286,7 @@ if (defined env($local_config_envname)) + # Save away perl command information + $config{perl_cmd} = $^X; + $config{perl_version} = $Config{version}; +-$config{perl_archname} = $Config{archname}; ++#$config{perl_archname} = $Config{archname}; + + $config{prefix}=""; + $config{openssldir}=""; +@@ -2517,7 +2517,7 @@ _____ + @{$config{perlargv}}), "\n"; + print "\nPerl information:\n\n"; + print ' ',$config{perl_cmd},"\n"; +- print ' ',$config{perl_version},' for ',$config{perl_archname},"\n"; ++ print ' ',$config{perl_version},"\n"; + } + if ($dump || $options) { + my $longest = 0; diff --git a/meta-openeuler/recipes-core/openssl/openssl/run-ptest b/meta-openeuler/recipes-core/openssl/openssl/run-ptest new file mode 100644 index 00000000000..d62d309ee14 --- /dev/null +++ b/meta-openeuler/recipes-core/openssl/openssl/run-ptest @@ -0,0 +1,12 @@ +#!/bin/sh + +set -e + +# Optional arguments are 'list' to lists all tests, or the test name (base name +# ie test_evp, not 03_test_evp.t). + +export TOP=. +# OPENSSL_ENGINES is relative from the test binaries +export OPENSSL_ENGINES=../engines + +perl ./test/run_tests.pl $* | perl -0pe 's#(.*) \.*.ok#PASS: \1#g; s#(.*) \.*.skipped: (.*)#SKIP: \1 (\2)#g; s#(.*) \.*.\nDubious#FAIL: \1#;' diff --git a/meta-openeuler/recipes-core/openssl/openssl_1.1.1f.bb b/meta-openeuler/recipes-core/openssl/openssl_1.1.1f.bb new file mode 100644 index 00000000000..a1976e48212 --- /dev/null +++ b/meta-openeuler/recipes-core/openssl/openssl_1.1.1f.bb @@ -0,0 +1,177 @@ +require openssl.inc +SUMMARY = "Secure Socket Layer" +DESCRIPTION = "Secure Socket Layer (SSL) binary and related cryptographic tools." +HOMEPAGE = "http://www.openssl.org/" +BUGTRACKER = "http://www.openssl.org/news/vulnerabilities.html" +SECTION = "libs/network" + +# "openssl" here actually means both OpenSSL and SSLeay licenses apply +# (see meta/files/common-licenses/OpenSSL to which "openssl" is SPDXLICENSEMAPped) +LICENSE = "openssl" + +DEPENDS = "hostperl-runtime-native" + +inherit lib_package multilib_header +MULTILIB_SCRIPTS = "${PN}-bin:${bindir}/c_rehash" + +PACKAGECONFIG ?= "" +PACKAGECONFIG_class-native = "" +PACKAGECONFIG_class-nativesdk = "" + +PACKAGECONFIG[cryptodev-linux] = "enable-devcryptoeng,disable-devcryptoeng,cryptodev-linux" + +#| ./libcrypto.so: undefined reference to `getcontext' +#| ./libcrypto.so: undefined reference to `setcontext' +#| ./libcrypto.so: undefined reference to `makecontext' +EXTRA_OECONF_append_libc-musl = " no-async" +EXTRA_OECONF_append_libc-musl_powerpc64 = " no-asm" + +# This prevents openssl from using getrandom() which is not available on older glibc versions +# (native versions can be built with newer glibc, but then relocated onto a system with older glibc) +EXTRA_OECONF_class-native = "--with-rand-seed=devrandom" +EXTRA_OECONF_class-nativesdk = "--with-rand-seed=devrandom" + +# Relying on hardcoded built-in paths causes openssl-native to not be relocateable from sstate. +CFLAGS_append_class-native = " -DOPENSSLDIR=/not/builtin -DENGINESDIR=/not/builtin" +CFLAGS_append_class-nativesdk = " -DOPENSSLDIR=/not/builtin -DENGINESDIR=/not/builtin" +CFLAGS_append += "${LDFLAGS}" + +EXTRA_OECONF_arm32a15eb += " -no-asm" + +do_configure () { + os=${HOST_OS} + case $os in + linux-gnueabi |\ + linux-gnuspe |\ + linux-musleabi |\ + linux-muslspe |\ + linux-musl ) + os=linux + ;; + *) + ;; + esac + target="$os-${HOST_ARCH}" + case $target in + linux-arm*) + target=linux-armv4 + ;; + linux-aarch64*) + target=linux-aarch64 + ;; + linux-i?86 | linux-viac3) + target=linux-x86 + ;; + linux-gnux32-x86_64 | linux-muslx32-x86_64 ) + target=linux-x32 + ;; + linux-gnu64-x86_64) + target=linux-x86_64 + ;; + linux-mips | linux-mipsel) + # specifying TARGET_CC_ARCH prevents openssl from (incorrectly) adding target architecture flags + target="linux-mips32 ${TARGET_CC_ARCH}" + ;; + linux-gnun32-mips*) + target=linux-mips64 + ;; + linux-*-mips64 | linux-mips64 | linux-*-mips64el | linux-mips64el) + target=linux64-mips64 + ;; + linux-microblaze* | linux-nios2* | linux-sh3 | linux-sh4 | linux-arc*) + target=linux-generic32 + ;; + linux-powerpc) + target=linux-ppc + ;; + linux-powerpc64) + target=linux-ppc64 + ;; + linux-riscv32) + target=linux-generic32 + ;; + linux-riscv64) + target=linux-generic64 + ;; + linux-sparc | linux-supersparc) + target=linux-sparcv9 + ;; + linux-gnu_ilp32*) + target=linux-arm64ilp32 + ;; + esac + + useprefix=${prefix} + if [ "x$useprefix" = "x" ]; then + useprefix=/ + fi + # WARNING: do not set compiler/linker flags (-I/-D etc.) in EXTRA_OECONF, as they will fully replace the + # environment variables set by bitbake. Adjust the environment variables instead. + if [ target = "linux-arm64ilp32" ]; then + perl ./Configure --prefix=$useprefix --openssldir=${libdir}/ssl-1.1 --libdir=${libdir} $target + else + perl ./Configure ${EXTRA_OECONF} ${PACKAGECONFIG_CONFARGS} --prefix=$useprefix --openssldir=${libdir}/ssl-1.1 --libdir=${libdir} $target + fi + +} + +do_install () { + oe_runmake DESTDIR="${D}" MANDIR="${mandir}" MANSUFFIX=ssl install + + oe_multilib_header openssl/opensslconf.h + + # Create SSL structure for packages such as ca-certificates which + # contain hard-coded paths to /etc/ssl. Debian does the same. + install -d ${D}${sysconfdir}/ssl + mv ${D}${libdir}/ssl-1.1/certs \ + ${D}${libdir}/ssl-1.1/private \ + ${D}${libdir}/ssl-1.1/openssl.cnf \ + ${D}${sysconfdir}/ssl/ + + # Although absolute symlinks would be OK for the target, they become + # invalid if native or nativesdk are relocated from sstate. + ln -sf ${@oe.path.relative('${libdir}/ssl-1.1', '${sysconfdir}/ssl/certs')} ${D}${libdir}/ssl-1.1/certs + ln -sf ${@oe.path.relative('${libdir}/ssl-1.1', '${sysconfdir}/ssl/private')} ${D}${libdir}/ssl-1.1/private + ln -sf ${@oe.path.relative('${libdir}/ssl-1.1', '${sysconfdir}/ssl/openssl.cnf')} ${D}${libdir}/ssl-1.1/openssl.cnf +} + +do_install_append_class-native () { + create_wrapper ${D}${bindir}/openssl \ + OPENSSL_CONF=${libdir}/ssl-1.1/openssl.cnf \ + SSL_CERT_DIR=${libdir}/ssl-1.1/certs \ + SSL_CERT_FILE=${libdir}/ssl-1.1/cert.pem \ + OPENSSL_ENGINES=${libdir}/ssl-1.1/engines +} + +do_install_append_class-nativesdk () { + mkdir -p ${D}${SDKPATHNATIVE}/environment-setup.d + install -m 644 ${WORKDIR}/environment.d-openssl.sh ${D}${SDKPATHNATIVE}/environment-setup.d/openssl.sh + sed 's|/usr/lib/ssl/|/usr/lib/ssl-1.1/|g' -i ${D}${SDKPATHNATIVE}/environment-setup.d/openssl.sh +} + +# Add the openssl.cnf file to the openssl-conf package. Make the libcrypto +# package RRECOMMENDS on this package. This will enable the configuration +# file to be installed for both the openssl-bin package and the libcrypto +# package since the openssl-bin package depends on the libcrypto package. + +FILES_libcrypto = "${libdir}/libcrypto${SOLIBS}" +FILES_libssl = "${libdir}/libssl${SOLIBS}" +FILES_openssl-conf = "${sysconfdir}/ssl/openssl.cnf" +FILES_${PN}-engines = "${libdir}/engines-1.1" +FILES_${PN}-misc = "${libdir}/ssl-1.1/misc" +FILES_${PN} += "${libdir}/ssl-1.1/* ${sysconfdir}/ssl/*" +FILES_${PN}_append_class-nativesdk = " ${SDKPATHNATIVE}/environment-setup.d/openssl.sh" +FILES_${PN} += "${libdir}/engines-1.1/*" + +CONFFILES_openssl-conf = "${sysconfdir}/ssl/openssl.cnf" + +RRECOMMENDS_libcrypto += "openssl-conf" +RDEPENDS_${PN}-ptest += "openssl-bin perl perl-modules bash" + +# Remove bash dependencies for all image +RDEPENDS_${PN}-ptest_remove += "bash" + +BBCLASSEXTEND = "native nativesdk" + +CVE_PRODUCT = "openssl:openssl" + -- Gitee From cc3d95b3f1c2ff013a944b66241bfa3192286837 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Fri, 17 Sep 2021 17:13:57 +0800 Subject: [PATCH 017/304] add recipe for pam Signed-off-by: Wayne Ren --- .../0001-Makefile.am-support-usrmage.patch | 28 +++ ...space-Makefile.am-correctly-install-.patch | 28 +++ meta-openeuler/recipes-core/pam/libpam/99_pam | 1 + .../pam/libpam/libpam-xtests.patch | 37 ++++ .../pam/libpam/pam-volatiles.conf | 1 + .../recipes-core/pam/libpam/pam.d/chfn | 4 + .../recipes-core/pam/libpam/pam.d/chsh | 4 + .../pam/libpam/pam.d/common-account | 4 + .../recipes-core/pam/libpam/pam.d/common-auth | 7 + .../pam/libpam/pam.d/common-password | 5 + .../pam/libpam/pam.d/common-session | 19 ++ .../pam.d/common-session-noninteractive | 19 ++ .../recipes-core/pam/libpam/pam.d/groupmems | 4 + .../recipes-core/pam/libpam/pam.d/login | 9 + .../recipes-core/pam/libpam/pam.d/other | 24 +++ .../recipes-core/pam/libpam/pam.d/passwd | 4 + .../recipes-core/pam/libpam/pam.d/sshd | 24 +++ .../recipes-core/pam/libpam/pam.d/su | 8 + .../recipes-core/pam/libpam/run-ptest | 32 +++ .../recipes-core/pam/libpam_1.5.1.bb | 184 ++++++++++++++++++ 20 files changed, 446 insertions(+) create mode 100644 meta-openeuler/recipes-core/pam/libpam/0001-Makefile.am-support-usrmage.patch create mode 100644 meta-openeuler/recipes-core/pam/libpam/0001-modules-pam_namespace-Makefile.am-correctly-install-.patch create mode 100644 meta-openeuler/recipes-core/pam/libpam/99_pam create mode 100644 meta-openeuler/recipes-core/pam/libpam/libpam-xtests.patch create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam-volatiles.conf create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/chfn create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/chsh create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/common-account create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/common-auth create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/common-password create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/common-session create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/common-session-noninteractive create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/groupmems create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/login create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/other create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/passwd create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/sshd create mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/su create mode 100644 meta-openeuler/recipes-core/pam/libpam/run-ptest create mode 100644 meta-openeuler/recipes-core/pam/libpam_1.5.1.bb diff --git a/meta-openeuler/recipes-core/pam/libpam/0001-Makefile.am-support-usrmage.patch b/meta-openeuler/recipes-core/pam/libpam/0001-Makefile.am-support-usrmage.patch new file mode 100644 index 00000000000..740ba522c67 --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/0001-Makefile.am-support-usrmage.patch @@ -0,0 +1,28 @@ +From c09e012590c1ec2d3b622b64f1bfc10a2286c9ea Mon Sep 17 00:00:00 2001 +From: Changqing Li +Date: Wed, 6 Jan 2021 12:08:20 +0800 +Subject: [PATCH] Makefile.am: support usrmage + +Upstream-Status: Inappropriate [oe-specific] + +Signed-off-by: Changqing Li +--- + modules/pam_namespace/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/modules/pam_namespace/Makefile.am b/modules/pam_namespace/Makefile.am +index ddd5fc0..a1f1bec 100644 +--- a/modules/pam_namespace/Makefile.am ++++ b/modules/pam_namespace/Makefile.am +@@ -18,7 +18,7 @@ TESTS = $(dist_check_SCRIPTS) + securelibdir = $(SECUREDIR) + secureconfdir = $(SCONFIGDIR) + namespaceddir = $(SCONFIGDIR)/namespace.d +-servicedir = /lib/systemd/system ++servicedir = $(systemd_system_unitdir) + + AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include \ + -DSECURECONF_DIR=\"$(SCONFIGDIR)/\" $(WARN_CFLAGS) +-- +2.17.1 + diff --git a/meta-openeuler/recipes-core/pam/libpam/0001-modules-pam_namespace-Makefile.am-correctly-install-.patch b/meta-openeuler/recipes-core/pam/libpam/0001-modules-pam_namespace-Makefile.am-correctly-install-.patch new file mode 100644 index 00000000000..6a3e26364cb --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/0001-modules-pam_namespace-Makefile.am-correctly-install-.patch @@ -0,0 +1,28 @@ +From e2db4082f6b988f1d5803028e9e47aee5f3519ac Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin +Date: Sun, 27 Dec 2020 00:30:45 +0100 +Subject: [PATCH] modules/pam_namespace/Makefile.am: correctly install systemd + unit file + +Upstream-Status: Pending +Signed-off-by: Alexander Kanavin +--- + modules/pam_namespace/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/modules/pam_namespace/Makefile.am b/modules/pam_namespace/Makefile.am +index 21e1b33..ddd5fc0 100644 +--- a/modules/pam_namespace/Makefile.am ++++ b/modules/pam_namespace/Makefile.am +@@ -18,7 +18,7 @@ TESTS = $(dist_check_SCRIPTS) + securelibdir = $(SECUREDIR) + secureconfdir = $(SCONFIGDIR) + namespaceddir = $(SCONFIGDIR)/namespace.d +-servicedir = $(prefix)/lib/systemd/system ++servicedir = /lib/systemd/system + + AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include \ + -DSECURECONF_DIR=\"$(SCONFIGDIR)/\" $(WARN_CFLAGS) +-- +2.24.0 + diff --git a/meta-openeuler/recipes-core/pam/libpam/99_pam b/meta-openeuler/recipes-core/pam/libpam/99_pam new file mode 100644 index 00000000000..47eda03f2c3 --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/99_pam @@ -0,0 +1 @@ +d root root 0755 /var/run/sepermit none diff --git a/meta-openeuler/recipes-core/pam/libpam/libpam-xtests.patch b/meta-openeuler/recipes-core/pam/libpam/libpam-xtests.patch new file mode 100644 index 00000000000..3d3a5f57f9a --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/libpam-xtests.patch @@ -0,0 +1,37 @@ +This patch is used to create a new sub package libpam-xtests to do more checks. + +Upstream-Status: Pending + +Signed-off-by: Kang Kai +Index: Linux-PAM-1.3.0/xtests/Makefile.am +=================================================================== +--- Linux-PAM-1.3.0.orig/xtests/Makefile.am ++++ Linux-PAM-1.3.0/xtests/Makefile.am +@@ -7,7 +7,7 @@ AM_CFLAGS = -DLIBPAM_COMPILE -I$(top_src + LDADD = $(top_builddir)/libpam/libpam.la \ + $(top_builddir)/libpam_misc/libpam_misc.la + +-CLEANFILES = *~ $(XTESTS) ++CLEANFILES = *~ + + EXTRA_DIST = run-xtests.sh tst-pam_dispatch1.pamd tst-pam_dispatch2.pamd \ + tst-pam_dispatch3.pamd tst-pam_dispatch4.pamd \ +@@ -51,3 +51,18 @@ EXTRA_PROGRAMS = $(XTESTS) + + xtests: $(XTESTS) run-xtests.sh + "$(srcdir)"/run-xtests.sh "$(srcdir)" ${XTESTS} ${NOSRCTESTS} ++ ++all: $(XTESTS) ++ ++install: install_xtests ++ ++install_xtests: ++ $(INSTALL) -d $(DESTDIR)$(pkgdatadir)/xtests ++ for file in $(EXTRA_DIST) ; do \ ++ $(INSTALL) $(srcdir)/$$file $(DESTDIR)$(pkgdatadir)/xtests ; \ ++ done ++ for file in $(XTESTS); do \ ++ $(INSTALL) .libs/$$file $(DESTDIR)$(pkgdatadir)/xtests ; \ ++ done ++ ++.PHONY: all install_xtests diff --git a/meta-openeuler/recipes-core/pam/libpam/pam-volatiles.conf b/meta-openeuler/recipes-core/pam/libpam/pam-volatiles.conf new file mode 100644 index 00000000000..1f892b7970b --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam-volatiles.conf @@ -0,0 +1 @@ +d /var/run/sepermit 0755 root root - - diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/chfn b/meta-openeuler/recipes-core/pam/libpam/pam.d/chfn new file mode 100644 index 00000000000..fc84574aa4f --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/chfn @@ -0,0 +1,4 @@ +#%PAM-1.0 +auth sufficient pam_rootok.so +account required pam_permit.so +password include common-passwd diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/chsh b/meta-openeuler/recipes-core/pam/libpam/pam.d/chsh new file mode 100644 index 00000000000..fc84574aa4f --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/chsh @@ -0,0 +1,4 @@ +#%PAM-1.0 +auth sufficient pam_rootok.so +account required pam_permit.so +password include common-passwd diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-account b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-account new file mode 100644 index 00000000000..d00fde09120 --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-account @@ -0,0 +1,4 @@ +account required pam_faillock.so +account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so +account requisite pam_deny.so +account required pam_permit.so diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-auth b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-auth new file mode 100644 index 00000000000..4306fd74a71 --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-auth @@ -0,0 +1,7 @@ +auth required pam_faillock.so preauth audit deny=3 even_deny_root unlock_time=300 +auth sufficient pam_unix.so nullok try_first_pass +auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=300 +auth requisite pam_listfile.so item=user onerr=succeed sense=deny file=/etc/login.user.deny +auth [success=1 default=ignore] pam_unix.so +auth required pam_deny.so +auth required pam_permit.so diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-password b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-password new file mode 100644 index 00000000000..155775e57e7 --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-password @@ -0,0 +1,5 @@ +password requisite pam_pwquality.so try_first_pass minclass=3 minlen=8 lcredit=0 ucredit=0 dcredit=0 ocredit=0 reject_username gecoscheck retry=3 enforce_for_root +password required pam_pwhistory.so remember=5 use_authtok enforce_for_root +password [success=1 default=ignore] pam_unix.so use_authtok nullok sha512 +password requisite pam_deny.so +password required pam_permit.so diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session new file mode 100644 index 00000000000..7a1e3a52707 --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session @@ -0,0 +1,19 @@ +# +# /etc/pam.d/common-session - session-related modules common to all services +# +# This file is included from other service-specific PAM config files, +# and should contain a list of modules that define tasks to be performed +# at the start and end of sessions of *any* kind (both interactive and +# non-interactive). +# + +# here are the per-package modules (the "Primary" block) +session [default=1] pam_permit.so +# here's the fallback if no module succeeds +session requisite pam_deny.so +# prime the stack with a positive return value if there isn't one already; +# this avoids us returning an error just because nothing sets a success code +# since the modules above will each just jump around +session required pam_permit.so +# and here are more per-package modules (the "Additional" block) +session required pam_unix.so diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session-noninteractive b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session-noninteractive new file mode 100644 index 00000000000..79518d1de1c --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session-noninteractive @@ -0,0 +1,19 @@ +# +# /etc/pam.d/common-session-noninteractive - session-related modules +# common to all non-interactive services +# +# This file is included from other service-specific PAM config files, +# and should contain a list of modules that define tasks to be performed +# at the start and end of all non-interactive sessions. +# + +# here are the per-package modules (the "Primary" block) +session [default=1] pam_permit.so +# here's the fallback if no module succeeds +session requisite pam_deny.so +# prime the stack with a positive return value if there isn't one already; +# this avoids us returning an error just because nothing sets a success code +# since the modules above will each just jump around +session required pam_permit.so +# and here are more per-package modules (the "Additional" block) +session required pam_unix.so diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/groupmems b/meta-openeuler/recipes-core/pam/libpam/pam.d/groupmems new file mode 100644 index 00000000000..fc84574aa4f --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/groupmems @@ -0,0 +1,4 @@ +#%PAM-1.0 +auth sufficient pam_rootok.so +account required pam_permit.so +password include common-passwd diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/login b/meta-openeuler/recipes-core/pam/libpam/pam.d/login new file mode 100644 index 00000000000..0e571ec652e --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/login @@ -0,0 +1,9 @@ +#%PAM-1.0 +auth required pam_securetty.so +auth include common-auth +account required pam_nologin.so +account include common-account +password include common-password +session include common-session +session required pam_loginuid.so +session optional pam_console.so diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/other b/meta-openeuler/recipes-core/pam/libpam/pam.d/other new file mode 100644 index 00000000000..696f789eb97 --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/other @@ -0,0 +1,24 @@ +# +# /etc/pam.d/other - specify the PAM fallback behaviour +# +# Note that this file is used for any unspecified service; for example +#if /etc/pam.d/cron specifies no session modules but cron calls +#pam_open_session, the session module out of /etc/pam.d/other is +#used. + +# We use pam_warn.so to generate syslog notes that the 'other' +#fallback rules are being used (as a hint to suggest you should setup +#specific PAM rules for the service and aid to debugging). Then to be +#secure, deny access to all services by default. + +auth required pam_warn.so +auth required pam_deny.so + +account required pam_warn.so +account required pam_deny.so + +password required pam_warn.so +password required pam_deny.so + +session required pam_warn.so +session required pam_deny.so diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/passwd b/meta-openeuler/recipes-core/pam/libpam/pam.d/passwd new file mode 100644 index 00000000000..f50a8537bba --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/passwd @@ -0,0 +1,4 @@ +#%PAM-1.0 +auth include common-auth +account include common-account +password include common-password diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/sshd b/meta-openeuler/recipes-core/pam/libpam/pam.d/sshd new file mode 100644 index 00000000000..ec0228c3d3d --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/sshd @@ -0,0 +1,24 @@ +#%PAM-1.0 + +auth include common-auth +account required pam_nologin.so + +# SELinux needs to be the first session rule. This ensures that any +# lingering context has been cleared. Without out this it is possible +# that a module could execute code in the wrong domain. +# When the module is present, "required" would be sufficient (When SELinux +# is disabled, this returns success.) +#session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close + +account include common-account +password include common-password +session optional pam_keyinit.so force revoke +session include common-session +session required pam_loginuid.so + +# SELinux needs to intervene at login time to ensure that the process +# starts in the proper default security context. Only sessions which are +# intended to run in the user's context should be run after this. +# When the module is present, "required" would be sufficient (When SELinux +# is disabled, this returns success.) +#session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/su b/meta-openeuler/recipes-core/pam/libpam/pam.d/su new file mode 100644 index 00000000000..d2259132aa5 --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/su @@ -0,0 +1,8 @@ +auth sufficient pam_rootok.so +auth required pam_wheel.so use_uid +session required pam_env.so readenv=1 +auth include common-auth +account sufficient pam_rootok.so +account include common-account +password include common-password +session include common-session diff --git a/meta-openeuler/recipes-core/pam/libpam/run-ptest b/meta-openeuler/recipes-core/pam/libpam/run-ptest new file mode 100644 index 00000000000..2fb69ba7b19 --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam/run-ptest @@ -0,0 +1,32 @@ +#! /bin/sh + +cd tests + +export srcdir=. + +failed=0 +all=0 +for f in tst-*; do + "./$f" > /dev/null 2>&1 + case "$?" in + 0) + echo "PASS: $f" + all=$((all + 1)) + ;; + 77) + echo "SKIP: $f" + ;; + *) + echo "FAIL: $f" + failed=$((failed + 1)) + all=$((all + 1)) + ;; + esac +done + +if [ "$failed" -eq 0 ] ; then + echo "All $all tests passed" +else + echo "$failed of $all tests failed" +fi +unset srcdir diff --git a/meta-openeuler/recipes-core/pam/libpam_1.5.1.bb b/meta-openeuler/recipes-core/pam/libpam_1.5.1.bb new file mode 100644 index 00000000000..29b964bd663 --- /dev/null +++ b/meta-openeuler/recipes-core/pam/libpam_1.5.1.bb @@ -0,0 +1,184 @@ +DISABLE_STATIC = "" +SUMMARY = "Linux-PAM (Pluggable Authentication Modules)" +DESCRIPTION = "Linux-PAM (Pluggable Authentication Modules for Linux), a flexible mechanism for authenticating users" +HOMEPAGE = "https://fedorahosted.org/linux-pam/" +BUGTRACKER = "https://fedorahosted.org/linux-pam/newticket" +SECTION = "base" +# PAM is dual licensed under GPL and BSD. +# /etc/pam.d comes from Debian libpam-runtime in 2009-11 (at that time +# libpam-runtime-1.0.1 is GPLv2+), by openembedded +LICENSE = "GPLv2+ | BSD-3-Clause" +LIC_FILES_CHKSUM = "file://COPYING;md5=7eb5c1bf854e8881005d673599ee74d3 \ + file://libpamc/License;md5=a4da476a14c093fdc73be3c3c9ba8fb3 \ + " + +SRC_URI = "file://pam/Linux-PAM-${PV}.tar.xz \ + file://99_pam \ + file://pam.d/common-account \ + file://pam.d/common-auth \ + file://pam.d/common-password \ + file://pam.d/common-session \ + file://pam.d/common-session-noninteractive \ + file://pam.d/other \ + file://libpam-xtests.patch \ + file://0001-modules-pam_namespace-Makefile.am-correctly-install-.patch \ + file://0001-Makefile.am-support-usrmage.patch \ + file://run-ptest \ + file://pam-volatiles.conf \ + " + +SRC_URI[sha256sum] = "201d40730b1135b1b3cdea09f2c28ac634d73181ccd0172ceddee3649c5792fc" + +#DEPENDS = "bison-native flex flex-native cracklib libxml2-native virtual/crypt" +DEPENDS = "cracklib" + +EXTRA_OECONF = "--includedir=${includedir}/security \ + --libdir=${base_libdir} \ + --disable-nis \ + --disable-regenerate-docu \ + --disable-doc \ + --disable-prelude" + +CFLAGS_append = " -fPIC " + +S = "${WORKDIR}/Linux-PAM-${PV}" + + +#inherit autotools gettext pkgconfig systemd ptest +inherit autotools gettext + +PACKAGECONFIG ??= "" +PACKAGECONFIG[audit] = "--enable-audit,--disable-audit,audit," +PACKAGECONFIG[userdb] = "--enable-db=db,--enable-db=no,db," + +PACKAGES += "${PN}-runtime ${PN}-xtests" +FILES_${PN} = "${base_libdir}/lib*${SOLIBS}" +FILES_${PN}-dev += "${base_libdir}/security/*.la ${base_libdir}/*.la ${base_libdir}/lib*${SOLIBSDEV}" +FILES_${PN}-runtime = "${sysconfdir} ${sbindir} ${systemd_system_unitdir}" +FILES_${PN}-xtests = "${datadir}/Linux-PAM/xtests" + +PACKAGES_DYNAMIC += "^${MLPREFIX}pam-plugin-.*" + +def get_multilib_bit(d): + baselib = d.getVar('baselib') or '' + return baselib.replace('lib', '') + +libpam_suffix = "suffix${@get_multilib_bit(d)}" + +RPROVIDES_${PN} += "${PN}-${libpam_suffix}" +RPROVIDES_${PN}-runtime += "${PN}-runtime-${libpam_suffix}" + +RDEPENDS_${PN}-runtime = "${PN}-${libpam_suffix} \ + ${MLPREFIX}pam-plugin-deny-${libpam_suffix} \ + ${MLPREFIX}pam-plugin-permit-${libpam_suffix} \ + ${MLPREFIX}pam-plugin-warn-${libpam_suffix} \ + ${MLPREFIX}pam-plugin-unix-${libpam_suffix} \ + " +#RDEPENDS_${PN}-xtests = "${PN}-${libpam_suffix} \ +# ${MLPREFIX}pam-plugin-access-${libpam_suffix} \ +# ${MLPREFIX}pam-plugin-debug-${libpam_suffix} \ +# ${MLPREFIX}pam-plugin-pwhistory-${libpam_suffix} \ +# ${MLPREFIX}pam-plugin-succeed-if-${libpam_suffix} \ +# ${MLPREFIX}pam-plugin-time-${libpam_suffix} \ +# bash coreutils" + +# FIXME: Native suffix breaks here, disable it for now +RRECOMMENDS_${PN} = "${PN}-runtime-${libpam_suffix}" +RRECOMMENDS_${PN}_class-native = "" + +python populate_packages_prepend () { + def pam_plugin_hook(file, pkg, pattern, format, basename): + pn = d.getVar('PN') + libpam_suffix = d.getVar('libpam_suffix') + + rdeps = d.getVar('RDEPENDS_' + pkg) + if rdeps: + rdeps = rdeps + " " + pn + "-" + libpam_suffix + else: + rdeps = pn + "-" + libpam_suffix + d.setVar('RDEPENDS_' + pkg, rdeps) + + provides = d.getVar('RPROVIDES_' + pkg) + if provides: + provides = provides + " " + pkg + "-" + libpam_suffix + else: + provides = pkg + "-" + libpam_suffix + d.setVar('RPROVIDES_' + pkg, provides) + + mlprefix = d.getVar('MLPREFIX') or '' + dvar = d.expand('${WORKDIR}/package') + pam_libdir = d.expand('${base_libdir}/security') + pam_sbindir = d.expand('${sbindir}') + pam_filterdir = d.expand('${base_libdir}/security/pam_filter') + pam_pkgname = mlprefix + 'pam-plugin%s' + + do_split_packages(d, pam_libdir, r'^pam(.*)\.so$', pam_pkgname, + 'PAM plugin for %s', hook=pam_plugin_hook, extra_depends='') + do_split_packages(d, pam_filterdir, r'^(.*)$', 'pam-filter-%s', 'PAM filter for %s', extra_depends='') +} + +do_compile_ptest() { + cd tests + sed -i -e 's/$(MAKE) $(AM_MAKEFLAGS) check-TESTS//' Makefile + oe_runmake check-am + cd - +} + +do_install() { + autotools_do_install + + # don't install /var/run when populating rootfs. Do it through volatile + rm -rf ${D}${localstatedir} + + if ${@bb.utils.contains('DISTRO_FEATURES','sysvinit','false','true',d)}; then + rm -rf ${D}${sysconfdir}/init.d/ + rm -rf ${D}${sysconfdir}/rc* + install -d ${D}${sysconfdir}/tmpfiles.d + install -m 0644 ${WORKDIR}/pam-volatiles.conf \ + ${D}${sysconfdir}/tmpfiles.d/pam.conf + else + install -d ${D}${sysconfdir}/default/volatiles + install -m 0644 ${WORKDIR}/99_pam \ + ${D}${sysconfdir}/default/volatiles/ + fi + + install -d ${D}${sysconfdir}/pam.d/ + install -m 0644 ${WORKDIR}/pam.d/* ${D}${sysconfdir}/pam.d/ + + # The lsb requires unix_chkpwd has setuid permission + chmod 4755 ${D}${sbindir}/unix_chkpwd + + if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then + echo "session optional pam_systemd.so" >> ${D}${sysconfdir}/pam.d/common-session + fi +} + +do_install_ptest() { + if [ ${PTEST_ENABLED} = "1" ]; then + mkdir -p ${D}${PTEST_PATH}/tests + install -m 0755 ${B}/tests/.libs/* ${D}${PTEST_PATH}/tests + install -m 0644 ${S}/tests/confdir ${D}${PTEST_PATH}/tests + fi +} + +pkg_postinst_${PN}() { + if [ -z "$D" ] && [ -e /etc/init.d/populate-volatile.sh ] ; then + /etc/init.d/populate-volatile.sh update + fi +} + +inherit features_check +REQUIRED_DISTRO_FEATURES = "pam" + +BBCLASSEXTEND = "nativesdk native" + +CONFFILES_${PN}-runtime += "${sysconfdir}/pam.d/common-session" +CONFFILES_${PN}-runtime += "${sysconfdir}/pam.d/common-auth" +CONFFILES_${PN}-runtime += "${sysconfdir}/pam.d/common-password" +CONFFILES_${PN}-runtime += "${sysconfdir}/pam.d/common-session-noninteractive" +CONFFILES_${PN}-runtime += "${sysconfdir}/pam.d/common-account" +CONFFILES_${PN}-runtime += "${sysconfdir}/security/limits.conf" + +UPSTREAM_CHECK_URI = "https://github.com/linux-pam/linux-pam/releases" + +CVE_PRODUCT = "linux-pam" -- Gitee From 6b5bc41fe104a31d8ab926f26e14a4129649d6ca Mon Sep 17 00:00:00 2001 From: zhuyan Date: Tue, 26 Oct 2021 12:08:35 +0800 Subject: [PATCH 018/304] add recipe for shadow Signed-off-by: zhuyan --- .../shadow/files/login.defs_shadow-sysroot | 386 ++++++++++++++++++ .../shadow/files/login_defs_pam.sed | 32 ++ .../recipes-core/shadow/files/pam.d/chfn | 14 + .../recipes-core/shadow/files/pam.d/chpasswd | 6 + .../recipes-core/shadow/files/pam.d/chsh | 19 + .../recipes-core/shadow/files/pam.d/login | 81 ++++ .../recipes-core/shadow/files/pam.d/newusers | 6 + .../recipes-core/shadow/files/pam.d/passwd | 5 + .../recipes-core/shadow/files/pam.d/su | 57 +++ .../recipes-core/shadow/files/securetty | 238 +++++++++++ .../shadow/shadow-securetty_4.8.1.bb | 38 ++ .../shadow/shadow-sysroot_4.8.1.bb | 35 ++ meta-openeuler/recipes-core/shadow/shadow.inc | 205 ++++++++++ .../recipes-core/shadow/shadow_4.8.1.bb | 10 + 14 files changed, 1132 insertions(+) create mode 100644 meta-openeuler/recipes-core/shadow/files/login.defs_shadow-sysroot create mode 100644 meta-openeuler/recipes-core/shadow/files/login_defs_pam.sed create mode 100644 meta-openeuler/recipes-core/shadow/files/pam.d/chfn create mode 100644 meta-openeuler/recipes-core/shadow/files/pam.d/chpasswd create mode 100644 meta-openeuler/recipes-core/shadow/files/pam.d/chsh create mode 100644 meta-openeuler/recipes-core/shadow/files/pam.d/login create mode 100644 meta-openeuler/recipes-core/shadow/files/pam.d/newusers create mode 100644 meta-openeuler/recipes-core/shadow/files/pam.d/passwd create mode 100644 meta-openeuler/recipes-core/shadow/files/pam.d/su create mode 100644 meta-openeuler/recipes-core/shadow/files/securetty create mode 100644 meta-openeuler/recipes-core/shadow/shadow-securetty_4.8.1.bb create mode 100644 meta-openeuler/recipes-core/shadow/shadow-sysroot_4.8.1.bb create mode 100644 meta-openeuler/recipes-core/shadow/shadow.inc create mode 100644 meta-openeuler/recipes-core/shadow/shadow_4.8.1.bb diff --git a/meta-openeuler/recipes-core/shadow/files/login.defs_shadow-sysroot b/meta-openeuler/recipes-core/shadow/files/login.defs_shadow-sysroot new file mode 100644 index 00000000000..8a68dd341a6 --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/files/login.defs_shadow-sysroot @@ -0,0 +1,386 @@ +# +# /etc/login.defs - Configuration control definitions for the shadow package. +# +# $Id: login.defs 3038 2009-07-23 20:41:35Z nekral-guest $ +# + +# +# Delay in seconds before being allowed another attempt after a login failure +# Note: When PAM is used, some modules may enfore a minimal delay (e.g. +# pam_unix enforces a 2s delay) +# +FAIL_DELAY 3 + +# +# Enable logging and display of /var/log/faillog login failure info. +# +#FAILLOG_ENAB yes + +# +# Enable display of unknown usernames when login failures are recorded. +# +LOG_UNKFAIL_ENAB no + +# +# Enable logging of successful logins +# +LOG_OK_LOGINS no + +# +# Enable logging and display of /var/log/lastlog login time info. +# +#LASTLOG_ENAB yes + +# +# Enable checking and display of mailbox status upon login. +# +# Disable if the shell startup files already check for mail +# ("mailx -e" or equivalent). +# +##MAIL_CHECK_ENAB yes + +# +# Enable additional checks upon password changes. +# +#OBSCURE_CHECKS_ENAB yes + +# +# Enable checking of time restrictions specified in /etc/porttime. +# +#PORTTIME_CHECKS_ENAB yes + +# +# Enable setting of ulimit, umask, and niceness from passwd gecos field. +# +#QUOTAS_ENAB yes + +# +# Enable "syslog" logging of su activity - in addition to sulog file logging. +# SYSLOG_SG_ENAB does the same for newgrp and sg. +# +SYSLOG_SU_ENAB yes +SYSLOG_SG_ENAB yes + +# +# If defined, either full pathname of a file containing device names or +# a ":" delimited list of device names. Root logins will be allowed only +# upon these devices. +# +CONSOLE /etc/securetty +#CONSOLE console:tty01:tty02:tty03:tty04 + +# +# If defined, all su activity is logged to this file. +# +#SULOG_FILE /var/log/sulog + +# +# If defined, ":" delimited list of "message of the day" files to +# be displayed upon login. +# +#MOTD_FILE /etc/motd +#MOTD_FILE /etc/motd:/usr/lib/news/news-motd + +# +# If defined, this file will be output before each login prompt. +# +#ISSUE_FILE /etc/issue + +# +# If defined, file which maps tty line to TERM environment parameter. +# Each line of the file is in a format something like "vt100 tty01". +# +#TTYTYPE_FILE /etc/ttytype + +# +# If defined, login failures will be logged here in a utmp format. +# last, when invoked as lastb, will read /var/log/btmp, so... +# +#FTMP_FILE /var/log/btmp + +# +# If defined, name of file whose presence which will inhibit non-root +# logins. The contents of this file should be a message indicating +# why logins are inhibited. +# +#NOLOGINS_FILE /etc/nologin + +# +# If defined, the command name to display when running "su -". For +# example, if this is defined as "su" then a "ps" will display the +# command is "-su". If not defined, then "ps" would display the +# name of the shell actually being run, e.g. something like "-sh". +# +SU_NAME su + +# +# *REQUIRED* +# Directory where mailboxes reside, _or_ name of file, relative to the +# home directory. If you _do_ define both, #MAIL_DIR takes precedence. +# +#MAIL_DIR /var/spool/mail +MAIL_FILE .mail + +# +# If defined, file which inhibits all the usual chatter during the login +# sequence. If a full pathname, then hushed mode will be enabled if the +# user's name or shell are found in the file. If not a full pathname, then +# hushed mode will be enabled if the file exists in the user's home directory. +# +HUSHLOGIN_FILE .hushlogin +#HUSHLOGIN_FILE /etc/hushlogins + +# +# If defined, either a TZ environment parameter spec or the +# fully-rooted pathname of a file containing such a spec. +# +#ENV_TZ TZ=CST6CDT +#ENV_TZ /etc/tzname + +# +# If defined, an HZ environment parameter spec. +# +# for Linux/x86 +#ENV_HZ HZ=100 +# For Linux/Alpha... +#ENV_HZ HZ=1024 + +# +# *REQUIRED* The default PATH settings, for superuser and normal users. +# +# (they are minimal, add the rest in the shell startup files) +ENV_SUPATH PATH=/sbin:/bin:/usr/sbin:/usr/bin +ENV_PATH PATH=/bin:/usr/bin + +# +# Terminal permissions +# +# TTYGROUP Login tty will be assigned this group ownership. +# TTYPERM Login tty will be set to this permission. +# +# If you have a "write" program which is "setgid" to a special group +# which owns the terminals, define TTYGROUP to the group number and +# TTYPERM to 0620. Otherwise leave TTYGROUP commented out and assign +# TTYPERM to either 622 or 600. +# +TTYGROUP tty +TTYPERM 0600 + +# +# Login configuration initializations: +# +# ERASECHAR Terminal ERASE character ('\010' = backspace). +# KILLCHAR Terminal KILL character ('\025' = CTRL/U). +# ULIMIT Default "ulimit" value. +# +# The ERASECHAR and KILLCHAR are used only on System V machines. +# The ULIMIT is used only if the system supports it. +# (now it works with setrlimit too; ulimit is in 512-byte units) +# +# Prefix these values with "0" to get octal, "0x" to get hexadecimal. +# +ERASECHAR 0177 +KILLCHAR 025 +#ULIMIT 2097152 + +# Default initial "umask" value for non-PAM enabled systems. +# UMASK is also used by useradd and newusers to set the mode of new home +# directories. +# 022 is the default value, but 027, or even 077, could be considered +# better for privacy. There is no One True Answer here: each sysadmin +# must make up her mind. +UMASK 022 + +# +# Password aging controls: +# +# PASS_MAX_DAYS Maximum number of days a password may be used. +# PASS_MIN_DAYS Minimum number of days allowed between password changes. +# PASS_MIN_LEN Minimum acceptable password length. +# PASS_WARN_AGE Number of days warning given before a password expires. +# +PASS_MAX_DAYS 99999 +PASS_MIN_DAYS 0 +#PASS_MIN_LEN 5 +PASS_WARN_AGE 7 + +# +# If "yes", the user must be listed as a member of the first gid 0 group +# in /etc/group (called "root" on most Linux systems) to be able to "su" +# to uid 0 accounts. If the group doesn't exist or is empty, no one +# will be able to "su" to uid 0. +# +#SU_WHEEL_ONLY no + +# +# If compiled with cracklib support, where are the dictionaries +# +#CRACKLIB_DICTPATH /var/cache/cracklib/cracklib_dict + +# +# Min/max values for automatic uid selection in useradd +# +UID_MIN 1000 +UID_MAX 60000 +# System accounts +SYS_UID_MIN 101 +SYS_UID_MAX 999 + +# +# Min/max values for automatic gid selection in groupadd +# +GID_MIN 1000 +GID_MAX 60000 +# System accounts +SYS_GID_MIN 101 +SYS_GID_MAX 999 + +# +# Max number of login retries if password is bad +# +LOGIN_RETRIES 5 + +# +# Max time in seconds for login +# +LOGIN_TIMEOUT 60 + +# +# Maximum number of attempts to change password if rejected (too easy) +# +#PASS_CHANGE_TRIES 5 + +# +# Warn about weak passwords (but still allow them) if you are root. +# +#PASS_ALWAYS_WARN yes + +# +# Number of significant characters in the password for crypt(). +# Default is 8, don't change unless your crypt() is better. +# Ignored if MD5_CRYPT_ENAB set to "yes". +# +#PASS_MAX_LEN 8 + +# +# Require password before chfn/chsh can make any changes. +# +#CHFN_AUTH yes + +# +# Which fields may be changed by regular users using chfn - use +# any combination of letters "frwh" (full name, room number, work +# phone, home phone). If not defined, no changes are allowed. +# For backward compatibility, "yes" = "rwh" and "no" = "frwh". +# +CHFN_RESTRICT rwh + +# +# Password prompt (%s will be replaced by user name). +# +# XXX - it doesn't work correctly yet, for now leave it commented out +# to use the default which is just "Password: ". +#LOGIN_STRING "%s's Password: " + +# +# Only works if compiled with MD5_CRYPT defined: +# If set to "yes", new passwords will be encrypted using the MD5-based +# algorithm compatible with the one used by recent releases of FreeBSD. +# It supports passwords of unlimited length and longer salt strings. +# Set to "no" if you need to copy encrypted passwords to other systems +# which don't understand the new algorithm. Default is "no". +# +# Note: If you use PAM, it is recommended to use a value consistent with +# the PAM modules configuration. +# +# This variable is deprecated. You should use ENCRYPT_METHOD. +# +#MD5_CRYPT_ENAB no + +# +# Only works if compiled with ENCRYPTMETHOD_SELECT defined: +# If set to MD5 , MD5-based algorithm will be used for encrypting password +# If set to SHA256, SHA256-based algorithm will be used for encrypting password +# If set to SHA512, SHA512-based algorithm will be used for encrypting password +# If set to DES, DES-based algorithm will be used for encrypting password (default) +# Overrides the MD5_CRYPT_ENAB option +# +# Note: If you use PAM, it is recommended to use a value consistent with +# the PAM modules configuration. +# +#ENCRYPT_METHOD DES + +# +# Only works if ENCRYPT_METHOD is set to SHA256 or SHA512. +# +# Define the number of SHA rounds. +# With a lot of rounds, it is more difficult to brute forcing the password. +# But note also that it more CPU resources will be needed to authenticate +# users. +# +# If not specified, the libc will choose the default number of rounds (5000). +# The values must be inside the 1000-999999999 range. +# If only one of the MIN or MAX values is set, then this value will be used. +# If MIN > MAX, the highest value will be used. +# +# SHA_CRYPT_MIN_ROUNDS 5000 +# SHA_CRYPT_MAX_ROUNDS 5000 + +# +# List of groups to add to the user's supplementary group set +# when logging in on the console (as determined by the CONSOLE +# setting). Default is none. +# +# Use with caution - it is possible for users to gain permanent +# access to these groups, even when not logged in on the console. +# How to do it is left as an exercise for the reader... +# +#CONSOLE_GROUPS floppy:audio:cdrom + +# +# Should login be allowed if we can't cd to the home directory? +# Default in no. +# +DEFAULT_HOME yes + +# +# If this file exists and is readable, login environment will be +# read from it. Every line should be in the form name=value. +# +#ENVIRON_FILE /etc/environment + +# +# If defined, this command is run when removing a user. +# It should remove any at/cron/print jobs etc. owned by +# the user to be removed (passed as the first argument). +# +#USERDEL_CMD /usr/sbin/userdel_local + +# +# Enable setting of the umask group bits to be the same as owner bits +# (examples: 022 -> 002, 077 -> 007) for non-root users, if the uid is +# the same as gid, and username is the same as the primary group name. +# +# This also enables userdel to remove user groups if no members exist. +# +USERGROUPS_ENAB yes + +# +# If set to a non-nul number, the shadow utilities will make sure that +# groups never have more than this number of users on one line. +# This permit to support split groups (groups split into multiple lines, +# with the same group ID, to avoid limitation of the line length in the +# group file). +# +# 0 is the default value and disables this feature. +# +#MAX_MEMBERS_PER_GROUP 0 + +# +# If useradd should create home directories for users by default (non +# system users only) +# This option is overridden with the -M or -m flags on the useradd command +# line. +# +CREATE_HOME yes + diff --git a/meta-openeuler/recipes-core/shadow/files/login_defs_pam.sed b/meta-openeuler/recipes-core/shadow/files/login_defs_pam.sed new file mode 100644 index 00000000000..0a1f3be4afc --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/files/login_defs_pam.sed @@ -0,0 +1,32 @@ +/^FAILLOG_ENAB/b comment +/^LASTLOG_ENAB/b comment +/^MAIL_CHECK_ENAB/b comment +/^OBSCURE_CHECKS_ENAB/b comment +/^PORTTIME_CHECKS_ENAB/b comment +/^QUOTAS_ENAB/b comment +/^MOTD_FILE/b comment +/^FTMP_FILE/b comment +/^NOLOGINS_FILE/b comment +/^ENV_HZ/b comment +/^ENV_TZ/b comment +/^PASS_MIN_LEN/b comment +/^SU_WHEEL_ONLY/b comment +/^CRACKLIB_DICTPATH/b comment +/^PASS_CHANGE_TRIES/b comment +/^PASS_ALWAYS_WARN/b comment +/^PASS_MAX_LEN/b comment +/^PASS_MIN_LEN/b comment +/^CHFN_AUTH/b comment +/^CHSH_AUTH/b comment +/^ISSUE_FILE/b comment +/^LOGIN_STRING/b comment +/^ULIMIT/b comment +/^ENVIRON_FILE/b comment + +b exit + +: comment + s:^:#: + +: exit + diff --git a/meta-openeuler/recipes-core/shadow/files/pam.d/chfn b/meta-openeuler/recipes-core/shadow/files/pam.d/chfn new file mode 100644 index 00000000000..baf7698bba8 --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/files/pam.d/chfn @@ -0,0 +1,14 @@ +# +# The PAM configuration file for the Shadow `chfn' service +# + +# This allows root to change user infomation without being +# prompted for a password +auth sufficient pam_rootok.so + +# The standard Unix authentication modules, used with +# NIS (man nsswitch) as well as normal /etc/passwd and +# /etc/shadow entries. +auth include common-auth +account include common-account +session include common-session diff --git a/meta-openeuler/recipes-core/shadow/files/pam.d/chpasswd b/meta-openeuler/recipes-core/shadow/files/pam.d/chpasswd new file mode 100644 index 00000000000..b769d92ba48 --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/files/pam.d/chpasswd @@ -0,0 +1,6 @@ +# The PAM configuration file for the Shadow 'chpasswd' service +# + +auth sufficient pam_rootok.so +account required pam_permit.so +password include common-password diff --git a/meta-openeuler/recipes-core/shadow/files/pam.d/chsh b/meta-openeuler/recipes-core/shadow/files/pam.d/chsh new file mode 100644 index 00000000000..8fb169f64e1 --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/files/pam.d/chsh @@ -0,0 +1,19 @@ +# +# The PAM configuration file for the Shadow `chsh' service +# + +# This will not allow a user to change their shell unless +# their current one is listed in /etc/shells. This keeps +# accounts with special shells from changing them. +auth required pam_shells.so + +# This allows root to change user shell without being +# prompted for a password +auth sufficient pam_rootok.so + +# The standard Unix authentication modules, used with +# NIS (man nsswitch) as well as normal /etc/passwd and +# /etc/shadow entries. +auth include common-auth +account include common-account +session include common-session diff --git a/meta-openeuler/recipes-core/shadow/files/pam.d/login b/meta-openeuler/recipes-core/shadow/files/pam.d/login new file mode 100644 index 00000000000..b340058539e --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/files/pam.d/login @@ -0,0 +1,81 @@ +# +# The PAM configuration file for the Shadow `login' service +# + +# Enforce a minimal delay in case of failure (in microseconds). +# (Replaces the `FAIL_DELAY' setting from login.defs) +# Note that other modules may require another minimal delay. (for example, +# to disable any delay, you should add the nodelay option to pam_unix) +auth optional pam_faildelay.so delay=3000000 + +# Outputs an issue file prior to each login prompt (Replaces the +# ISSUE_FILE option from login.defs). Uncomment for use +# auth required pam_issue.so issue=/etc/issue + +# Disallows root logins except on tty's listed in /etc/securetty +# (Replaces the `CONSOLE' setting from login.defs) +# Note that it is included as a "requisite" module. No password prompts will +# be displayed if this module fails to avoid having the root password +# transmitted on unsecure ttys. +# You can change it to a "required" module if you think it permits to +# guess valid user names of your system (invalid user names are considered +# as possibly being root). +auth [success=ok ignore=ignore user_unknown=ignore default=die] pam_securetty.so + +# Disallows other than root logins when /etc/nologin exists +# (Replaces the `NOLOGINS_FILE' option from login.defs) +auth requisite pam_nologin.so + +# This module parses environment configuration file(s) +# and also allows you to use an extended config +# file /etc/security/pam_env.conf. +# +# parsing /etc/environment needs "readenv=1" +session required pam_env.so readenv=1 + +# Standard Un*x authentication. +auth include common-auth + +# This allows certain extra groups to be granted to a user +# based on things like time of day, tty, service, and user. +# Please edit /etc/security/group.conf to fit your needs +# (Replaces the `CONSOLE_GROUPS' option in login.defs) +auth optional pam_group.so + +# Uncomment and edit /etc/security/time.conf if you need to set +# time restrainst on logins. +# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs +# as well as /etc/porttime) +# account requisite pam_time.so + +# Uncomment and edit /etc/security/access.conf if you need to +# set access limits. +# (Replaces /etc/login.access file) +# account required pam_access.so + +# Sets up user limits according to /etc/security/limits.conf +# (Replaces the use of /etc/limits in old login) +session required pam_limits.so + +# Prints the last login info upon succesful login +# (Replaces the `LASTLOG_ENAB' option from login.defs) +session optional pam_lastlog.so + +# Prints the motd upon succesful login +# (Replaces the `MOTD_FILE' option in login.defs) +session optional pam_motd.so + +# Prints the status of the user's mailbox upon succesful login +# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). +# +# This also defines the MAIL environment variable +# However, userdel also needs MAIL_DIR and MAIL_FILE variables +# in /etc/login.defs to make sure that removing a user +# also removes the user's mail spool file. +# See comments in /etc/login.defs +session optional pam_mail.so standard + +# Standard Un*x account and session +account include common-account +password include common-password +session include common-session diff --git a/meta-openeuler/recipes-core/shadow/files/pam.d/newusers b/meta-openeuler/recipes-core/shadow/files/pam.d/newusers new file mode 100644 index 00000000000..4c59dfa478a --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/files/pam.d/newusers @@ -0,0 +1,6 @@ +# The PAM configuration file for the Shadow 'newusers' service +# + +auth sufficient pam_rootok.so +account required pam_permit.so +password include common-password diff --git a/meta-openeuler/recipes-core/shadow/files/pam.d/passwd b/meta-openeuler/recipes-core/shadow/files/pam.d/passwd new file mode 100644 index 00000000000..f5349924358 --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/files/pam.d/passwd @@ -0,0 +1,5 @@ +# +# The PAM configuration file for the Shadow `passwd' service +# + +password include common-password diff --git a/meta-openeuler/recipes-core/shadow/files/pam.d/su b/meta-openeuler/recipes-core/shadow/files/pam.d/su new file mode 100644 index 00000000000..8d590a32e60 --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/files/pam.d/su @@ -0,0 +1,57 @@ +# +# The PAM configuration file for the Shadow `su' service +# + +# This allows root to su without passwords (normal operation) +auth sufficient pam_rootok.so + +# Uncomment this to force users to be a member of group root +# before they can use `su'. You can also add "group=foo" +# to the end of this line if you want to use a group other +# than the default "root" (but this may have side effect of +# denying "root" user, unless she's a member of "foo" or explicitly +# permitted earlier by e.g. "sufficient pam_rootok.so"). +# (Replaces the `SU_WHEEL_ONLY' option from login.defs) +# auth required pam_wheel.so + +# Uncomment this if you want wheel members to be able to +# su without a password. +# auth sufficient pam_wheel.so trust + +# Uncomment this if you want members of a specific group to not +# be allowed to use su at all. +# auth required pam_wheel.so deny group=nosu + +# Uncomment and edit /etc/security/time.conf if you need to set +# time restrainst on su usage. +# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs +# as well as /etc/porttime) +# account requisite pam_time.so + +# This module parses environment configuration file(s) +# and also allows you to use an extended config +# file /etc/security/pam_env.conf. +# +# parsing /etc/environment needs "readenv=1" +session required pam_env.so readenv=1 + +# Defines the MAIL environment variable +# However, userdel also needs MAIL_DIR and MAIL_FILE variables +# in /etc/login.defs to make sure that removing a user +# also removes the user's mail spool file. +# See comments in /etc/login.defs +# +# "nopen" stands to avoid reporting new mail when su'ing to another user +session optional pam_mail.so nopen + +# Sets up user limits, please uncomment and read /etc/security/limits.conf +# to enable this functionality. +# (Replaces the use of /etc/limits in old login) +# session required pam_limits.so + +# The standard Unix authentication modules, used with +# NIS (man nsswitch) as well as normal /etc/passwd and +# /etc/shadow entries. +auth include common-auth +account include common-account +session include common-session diff --git a/meta-openeuler/recipes-core/shadow/files/securetty b/meta-openeuler/recipes-core/shadow/files/securetty new file mode 100644 index 00000000000..2be341a216b --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/files/securetty @@ -0,0 +1,238 @@ +# /etc/securetty: list of terminals on which root is allowed to login. +# See securetty(5) and login(1). +console + +# Standard serial ports +ttyS0 +ttyS1 +ttyS2 +ttyS3 + +# ARM AMBA SoCs +ttyAM0 +ttyAM1 +ttyAM2 +ttyAM3 +ttyAMA0 +ttyAMA1 +ttyAMA2 +ttyAMA3 + +# QCOM Socs +ttyHSL0 +ttyHSL1 +ttyHSL2 +ttyHSL3 +ttyMSM0 +ttyMSM1 +ttyMSM2 + +# Samsung ARM SoCs +ttySAC0 +ttySAC1 +ttySAC2 +ttySAC3 + +# STM SoCs +ttyAS0 +ttyAS1 +ttyAS2 +ttyAS3 + +# TI OMAP SoCs +ttyO0 +ttyO1 +ttyO2 +ttyO3 + +# Xilinx Zynq SoC +ttyPS0 +ttyPS1 + +# USB dongles +ttyUSB0 +ttyUSB1 +ttyUSB2 + +# USB serial gadget +ttyGS0 + +# PowerMac +ttyPZ0 +ttyPZ1 +ttyPZ2 +ttyPZ3 + +# Embedded MPC platforms +ttyPSC0 +ttyPSC1 +ttyPSC2 +ttyPSC3 +ttyPSC4 +ttyPSC5 + +# PA-RISC mux ports +ttyB0 +ttyB1 + +# Standard hypervisor virtual console +hvc0 + +# Oldstyle Xen console +xvc0 + +# Standard consoles +tty1 +tty2 +tty3 +tty4 +tty5 +tty6 +tty7 +tty8 +tty9 +tty10 +tty11 +tty12 +tty13 +tty14 +tty15 +tty16 +tty17 +tty18 +tty19 +tty20 +tty21 +tty22 +tty23 +tty24 +tty25 +tty26 +tty27 +tty28 +tty29 +tty30 +tty31 +tty32 +tty33 +tty34 +tty35 +tty36 +tty37 +tty38 +tty39 +tty40 +tty41 +tty42 +tty43 +tty44 +tty45 +tty46 +tty47 +tty48 +tty49 +tty50 +tty51 +tty52 +tty53 +tty54 +tty55 +tty56 +tty57 +tty58 +tty59 +tty60 +tty61 +tty62 +tty63 + +# Local X displays (allows empty passwords with pam_unix's nullok_secure) +pts/0 +pts/1 +pts/2 +pts/3 + +# Embedded Freescale i.MX ports +ttymxc0 +ttymxc1 +ttymxc2 +ttymxc3 +ttymxc4 +ttymxc5 + +# Freescale lpuart ports +ttyLP0 +ttyLP1 +ttyLP2 +ttyLP3 +ttyLP4 +ttyLP5 + +# Standard serial ports, with devfs +tts/0 +tts/1 + +# Standard consoles, with devfs +vc/1 +vc/2 +vc/3 +vc/4 +vc/5 +vc/6 +vc/7 +vc/8 +vc/9 +vc/10 +vc/11 +vc/12 +vc/13 +vc/14 +vc/15 +vc/16 +vc/17 +vc/18 +vc/19 +vc/20 +vc/21 +vc/22 +vc/23 +vc/24 +vc/25 +vc/26 +vc/27 +vc/28 +vc/29 +vc/30 +vc/31 +vc/32 +vc/33 +vc/34 +vc/35 +vc/36 +vc/37 +vc/38 +vc/39 +vc/40 +vc/41 +vc/42 +vc/43 +vc/44 +vc/45 +vc/46 +vc/47 +vc/48 +vc/49 +vc/50 +vc/51 +vc/52 +vc/53 +vc/54 +vc/55 +vc/56 +vc/57 +vc/58 +vc/59 +vc/60 +vc/61 +vc/62 +vc/63 diff --git a/meta-openeuler/recipes-core/shadow/shadow-securetty_4.8.1.bb b/meta-openeuler/recipes-core/shadow/shadow-securetty_4.8.1.bb new file mode 100644 index 00000000000..2f06942e8bb --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/shadow-securetty_4.8.1.bb @@ -0,0 +1,38 @@ +SUMMARY = "Provider of the machine specific securetty file" +SECTION = "base utils" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +INHIBIT_DEFAULT_DEPS = "1" + +PR = "r1" + +SRC_URI = "file://securetty" + +S = "${WORKDIR}" + +# Since SERIAL_CONSOLES is likely to be set from the machine configuration +PACKAGE_ARCH = "${MACHINE_ARCH}" + +do_install () { + # Ensure we add a suitable securetty file to the package that has + # most common embedded TTYs defined. + install -d ${D}${sysconfdir} + install -m 0400 ${WORKDIR}/securetty ${D}${sysconfdir}/securetty + if [ ! -z "${SERIAL_CONSOLES}" ]; then + # Our SERIAL_CONSOLES contains a baud rate and sometimes extra + # options as well. The following pearl :) takes that and converts + # it into newline-separated tty's and appends them into + # securetty. So if a machine has a weird looking console device + # node (e.g. ttyAMA0) that securetty does not know, it will get + # appended to securetty and root logins will be allowed on that + # console. + tmp="${SERIAL_CONSOLES}" + for entry in $tmp ; do + ttydev=`echo "$entry" | sed -e 's/^[0-9]*\;//' -e 's/\;.*//'` + if ! grep -q $ttydev ${D}${sysconfdir}/securetty; then + echo $ttydev >> ${D}${sysconfdir}/securetty + fi + done + fi +} diff --git a/meta-openeuler/recipes-core/shadow/shadow-sysroot_4.8.1.bb b/meta-openeuler/recipes-core/shadow/shadow-sysroot_4.8.1.bb new file mode 100644 index 00000000000..03fba804f3f --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/shadow-sysroot_4.8.1.bb @@ -0,0 +1,35 @@ +SUMMARY = "Shadow utils requirements for useradd.bbclass" +HOMEPAGE = "http://pkg-shadow.alioth.debian.org" +BUGTRACKER = "https://alioth.debian.org/tracker/?group_id=30580" +SECTION = "base utils" +LICENSE = "BSD | Artistic-1.0" +LIC_FILES_CHKSUM = "file://login.defs_shadow-sysroot;md5=25e2f2de4dfc8f966ac5cdfce45cd7d5" + +DEPENDS = "base-passwd" + +# Remove base-passwd for all image +DEPENDS_remove += "base-passwd" + +PR = "r1" + +# The sole purpose of this recipe is to provide the /etc/login.defs +# file for the target sysroot - needed so the shadow-native utilities +# can add custom users/groups for recipes that use inherit useradd. +SRC_URI = "file://login.defs_shadow-sysroot" + +SRC_URI[md5sum] = "b8608d8294ac88974f27b20f991c0e79" +SRC_URI[sha256sum] = "633f5bb4ea0c88c55f3642c97f9d25cbef74f82e0b4cf8d54e7ad6f9f9caa778" + +S = "${WORKDIR}" + +do_install() { + install -d ${D}${sysconfdir} + install -p -m 644 ${S}/login.defs_shadow-sysroot ${D}${sysconfdir}/login.defs +} + +SYSROOT_DIRS += "${sysconfdir}" + +# don't create any packages +# otherwise: dbus-dev depends on shadow-sysroot-dev which depends on shadow-sysroot +# and this has another copy of /etc/login.defs already provided by shadow +PACKAGES = "" diff --git a/meta-openeuler/recipes-core/shadow/shadow.inc b/meta-openeuler/recipes-core/shadow/shadow.inc new file mode 100644 index 00000000000..9ddb10bd900 --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/shadow.inc @@ -0,0 +1,205 @@ +SUMMARY = "Tools to change and administer password and group data" +HOMEPAGE = "file://pkg-shadow.alioth.debian.org" +BUGTRACKER = "files://alioth.debian.org/tracker/?group_id=30580" +SECTION = "base/utils" +LICENSE = "BSD | Artistic-1.0" + +#DEPENDS = "virtual/crypt" + +UPSTREAM_CHECK_URI = "https://github.com/shadow-maint/shadow/releases" + +FILESEXTRAPATHS_prepend .= "${OPEN_SRC_DIR}/shadow-utils:" + +inherit autotools gettext +#inherit autotools + +export CONFIG_SHELL="/bin/sh" + +EXTRA_OECONF += "--without-audit \ + --without-libcrack \ + --without-selinux \ + --with-group-name-max-length=24 \ + --enable-subordinate-ids=yes \ + ${NSCDOPT}" + +do_configure_prepend() { + #pushd ${S} + #sh autogen.sh + #sed -i 's/faillog/faillog2/g' configure + #sed -i 's/faillog"/faillog2"/g' configure.ac + #popd +} + +NSCDOPT = "" +NSCDOPT_class-native = "--without-nscd" +NSCDOPT_class-nativesdk = "--without-nscd" +NSCDOPT_libc-glibc = "--with-nscd" + +PAM_PLUGINS = "libpam-runtime \ + pam-plugin-faildelay \ + pam-plugin-securetty \ + pam-plugin-nologin \ + pam-plugin-env \ + pam-plugin-group \ + pam-plugin-limits \ + pam-plugin-lastlog \ + pam-plugin-motd \ + pam-plugin-mail \ + pam-plugin-shells \ + pam-plugin-rootok" + +PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'pam', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'xattr', 'attr', '', d)}" +PACKAGECONFIG_class-native ??= "${@bb.utils.contains('DISTRO_FEATURES', 'xattr', 'attr', '', d)}" +PACKAGECONFIG_class-nativesdk = "" +PACKAGECONFIG[pam] = "--with-libpam,--without-libpam,libpam,${PAM_PLUGINS}" +#PACKAGECONFIG[attr] = "--with-attr,--without-attr,attr" +PACKAGECONFIG[acl] = "--with-acl,--without-acl,acl" + +RDEPENDS_${PN} = "shadow-securetty \ + base-passwd " + +# util-linux-sulogin" + +# Remove base-passwd for all image +RDEPENDS_${PN}_remove += "base-passwd" +RDEPENDS_${PN}_class-native = "" +RDEPENDS_${PN}_class-nativesdk = "" + +SRC_URI = "file://shadow/shadow-4.8.1.tar.xz" + +LIC_FILES_CHKSUM="file://COPYING;md5=ed80ff1c2b40843cf5768e5229cf16e5" + +PAM_SRC_URI = "file://pam.d" +SRC_URI_EXTRA = "file://pam.d/chfn \ + file://login_defs_pam.sed \ + file://pam.d/chpasswd \ + file://pam.d/chsh \ + file://pam.d/login \ + file://pam.d/newusers \ + file://pam.d/passwd \ + file://pam.d/su" + +do_install() { + oe_runmake DESTDIR="${D}" sbindir="${base_sbindir}" usbindir="${sbindir}" install + + # Info dir listing isn't interesting at this point so remove it if it exists. + if [ -e "${D}${infodir}/dir" ]; then + rm -f ${D}${infodir}/dir + fi + + # Enable CREATE_HOME by default. + sed -i 's/#CREATE_HOME/CREATE_HOME/g' ${D}${sysconfdir}/login.defs + + # As we are on an embedded system, ensure the users mailbox is in + # ~/ not /var/spool/mail by default, as who knows where or how big + # /var is. The system MDA will set this later anyway. + sed -i 's/MAIL_DIR/#MAIL_DIR/g' ${D}${sysconfdir}/login.defs + sed -i 's/#MAIL_FILE/MAIL_FILE/g' ${D}${sysconfdir}/login.defs + + # Disable checking emails. + sed -i 's/MAIL_CHECK_ENAB/#MAIL_CHECK_ENAB/g' ${D}${sysconfdir}/login.defs + + # Comment out SU_NAME to work correctly with busybox + # See Bug#5359 and Bug#7173 + sed -i 's:^SU_NAME:#SU_NAME:g' ${D}${sysconfdir}/login.defs + + # Use proper encryption for passwords + sed -i 's/^#ENCRYPT_METHOD.*$/ENCRYPT_METHOD SHA512/' ${D}${sysconfdir}/login.defs + + # keep login.defs the same fileds & values as one in the previous init-script rpm + sed -i 's/^CHFN_RESTRICT/#CHFN_RESTRICT/g' ${D}${sysconfdir}/login.defs + sed -i 's/^CONSOLE/#CONSOLE/g' ${D}${sysconfdir}/login.defs + sed -i 's/^ERASECHAR/#ERASECHAR/g' ${D}${sysconfdir}/login.defs + sed -i 's/^FAIL_DELAY/#FAIL_DELAY/g' ${D}${sysconfdir}/login.defs + sed -i 's/^HUSHLOGIN_FILE/#HUSHLOGIN_FILE/g' ${D}${sysconfdir}/login.defs + sed -i 's/^KILLCHAR/#KILLCHAR/g' ${D}${sysconfdir}/login.defs + sed -i 's/^LOGIN_RETRIES/#LOGIN_RETRIES/g' ${D}${sysconfdir}/login.defs + sed -i 's/^MAIL_FILE/#MAIL_FILE/g' ${D}${sysconfdir}/login.defs + sed -i 's/^SYSLOG_SG_ENAB/#SYSLOG_SG_ENAB/g' ${D}${sysconfdir}/login.defs + sed -i 's/^SYSLOG_SU_ENAB/#SYSLOG_SU_ENAB/g' ${D}${sysconfdir}/login.defs + sed -i 's/^SYS_GID_MAX/#SYS_GID_MAX/g' ${D}${sysconfdir}/login.defs + sed -i 's/^SYS_UID_MAX/#SYS_UID_MAX/g' ${D}${sysconfdir}/login.defs + sed -i 's/^TTYGROUP/#TTYGROUP/g' ${D}${sysconfdir}/login.defs + sed -i 's/^UMASK/#UMASK/g' ${D}${sysconfdir}/login.defs + sed -i 's#^ENV_PATH.*$#ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin#' ${D}${sysconfdir}/login.defs + sed -i 's#^ENV_SUPATH.*$#ENV_SUPATH PATH=/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin#' ${D}${sysconfdir}/login.defs + sed -i 's#^GID_MIN.*$#GID_MIN 500#' ${D}${sysconfdir}/login.defs + sed -i 's#^UID_MIN.*$#UID_MIN 500#' ${D}${sysconfdir}/login.defs + sed -i 's/^#MAIL_DIR/MAIL_DIR/g' ${D}${sysconfdir}/login.defs + + # Now we don't have a mail system. Disable mail creation for now. + sed -i 's:/bin/bash:/bin/sh:g' ${D}${sysconfdir}/default/useradd + sed -i '/^CREATE_MAIL_SPOOL/ s:^:#:' ${D}${sysconfdir}/default/useradd + + # Use users group by default + sed -i 's,^GROUP=1000,GROUP=100,g' ${D}${sysconfdir}/default/useradd +} + +do_install_append() { + # Ensure that the image has as a /var/spool/mail dir so shadow can + # put mailboxes there if the user reconfigures shadow to its + # defaults (see sed below). + install -m 0775 -d ${D}${localstatedir}/spool/mail + chown root:mail ${D}${localstatedir}/spool/mail + + if [ -e ${WORKDIR}/pam.d ]; then + install -d ${D}${sysconfdir}/pam.d/ + install -m 0644 ${WORKDIR}/pam.d/* ${D}${sysconfdir}/pam.d/ + # Remove defaults that are not used when supporting PAM. + sed -i -f ${WORKDIR}/login_defs_pam.sed ${D}${sysconfdir}/login.defs + fi + + install -d ${D}${sbindir} ${D}${base_sbindir} ${D}${base_bindir} + + # Move binaries to the locations we want + rm ${D}${sbindir}/vigr + # ln -sf vipw.${BPN} ${D}${base_sbindir}/vigr + if [ "${sbindir}" != "${base_sbindir}" ]; then + mv ${D}${sbindir}/vipw ${D}${base_sbindir}/vipw + rm -f ${D}${base_sbindir}/nologin + fi + if [ "${bindir}" != "${base_bindir}" ]; then + mv ${D}${bindir}/login ${D}${base_bindir}/login + rm -f ${D}${bindir}/su + fi + + # Handle link properly after rename, otherwise missing files would + # lead rpm failed dependencies. + ln -sf newgrp.${BPN} ${D}${bindir}/sg +} + +PACKAGES =+ "${PN}-base" +FILES_${PN}-base = "\ + ${bindir}/sg \ + ${bindir}/newgrp.shadow \ + ${bindir}/groups.shadow \ + ${sysconfdir}/pam.d/login \ + ${sysconfdir}/pam.d/su \ + ${sysconfdir}/login.defs \ +" +RDEPENDS_${PN} += "${PN}-base" + +#inherit update-alternatives + +ALTERNATIVE_PRIORITY = "200" + +ALTERNATIVE_${PN} = "passwd chfn chsh chpasswd vipw vigr nologin login su" +ALTERNATIVE_LINK_NAME[chpasswd] = "${sbindir}/chpasswd" +ALTERNATIVE_LINK_NAME[vipw] = "${base_sbindir}/vipw" +ALTERNATIVE_LINK_NAME[vigr] = "${base_sbindir}/vigr" +ALTERNATIVE_LINK_NAME[nologin] = "${base_sbindir}/nologin" + +ALTERNATIVE_${PN}-base = "newgrp groups" + +PACKAGE_WRITE_DEPS += "shadow-native" +pkg_postinst_${PN}_class-target () { + if [ "x$D" != "x" ]; then + rootarg="--root $D" + else + rootarg="" + fi + + pwconv $rootarg || exit 1 + grpconv $rootarg || exit 1 +} diff --git a/meta-openeuler/recipes-core/shadow/shadow_4.8.1.bb b/meta-openeuler/recipes-core/shadow/shadow_4.8.1.bb new file mode 100644 index 00000000000..b02a26b4697 --- /dev/null +++ b/meta-openeuler/recipes-core/shadow/shadow_4.8.1.bb @@ -0,0 +1,10 @@ +require shadow.inc + +# Build falsely assumes that if --enable-libpam is set, we don't need to link against +# libcrypt. This breaks chsh. +#BUILD_LDFLAGS_append_class-target = " ${@bb.utils.contains('DISTRO_FEATURES', 'pam', '-lcrypt', '', d)}" + +BBCLASSEXTEND = "native nativesdk" + + + -- Gitee From 48a2a82f846d5250a0dcf730e49dcfa7881f269b Mon Sep 17 00:00:00 2001 From: zhuyan Date: Tue, 26 Oct 2021 12:08:36 +0800 Subject: [PATCH 019/304] add recipe for zlib Signed-off-by: zhuyan --- .../recipes-core/zlib/site_config/headers | 1 + .../zlib/zlib/ldflags-tests.patch | 45 ++++++++++++++++ .../recipes-core/zlib/zlib/run-ptest | 7 +++ .../recipes-core/zlib/zlib_1.2.11.bb | 53 +++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 meta-openeuler/recipes-core/zlib/site_config/headers create mode 100644 meta-openeuler/recipes-core/zlib/zlib/ldflags-tests.patch create mode 100644 meta-openeuler/recipes-core/zlib/zlib/run-ptest create mode 100644 meta-openeuler/recipes-core/zlib/zlib_1.2.11.bb diff --git a/meta-openeuler/recipes-core/zlib/site_config/headers b/meta-openeuler/recipes-core/zlib/site_config/headers new file mode 100644 index 00000000000..50268918aa9 --- /dev/null +++ b/meta-openeuler/recipes-core/zlib/site_config/headers @@ -0,0 +1 @@ +zlib.h diff --git a/meta-openeuler/recipes-core/zlib/zlib/ldflags-tests.patch b/meta-openeuler/recipes-core/zlib/zlib/ldflags-tests.patch new file mode 100644 index 00000000000..286390665f0 --- /dev/null +++ b/meta-openeuler/recipes-core/zlib/zlib/ldflags-tests.patch @@ -0,0 +1,45 @@ +Obey LDFLAGS for tests + +Upstream-Status: Submitted [https://github.com/madler/zlib/pull/409] +Signed-off-by: Ross Burton + +--- zlib-1.2.8.orig/Makefile.in ++++ zlib-1.2.8/Makefile.in +@@ -26,7 +26,7 @@ CFLAGS=-O + + SFLAGS=-O + LDFLAGS= +-TEST_LDFLAGS=-L. libz.a ++TEST_LDFLAGS=-L. $(LDFLAGS) + LDSHARED=$(CC) + CPP=$(CC) -E + +@@ -176,22 +176,22 @@ placebo $(SHAREDLIBV): $(PIC_OBJS) libz. + -@rmdir objs + + example$(EXE): example.o $(STATICLIB) +- $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS) ++ $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS) $(STATICLIB) + + minigzip$(EXE): minigzip.o $(STATICLIB) +- $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) ++ $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) $(STATICLIB) + + examplesh$(EXE): example.o $(SHAREDLIBV) +- $(CC) $(CFLAGS) -o $@ example.o -L. $(SHAREDLIBV) ++ $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS) $(SHAREDLIBV) + + minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) +- $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV) ++ $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) $(SHAREDLIBV) + + example64$(EXE): example64.o $(STATICLIB) +- $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS) ++ $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS) $(STATICLIB) + + minigzip64$(EXE): minigzip64.o $(STATICLIB) +- $(CC) $(CFLAGS) -o $@ minigzip64.o $(TEST_LDFLAGS) ++ $(CC) $(CFLAGS) -o $@ minigzip64.o $(TEST_LDFLAGS) $(STATICLIB) + + install-libs: $(LIBS) + -@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi diff --git a/meta-openeuler/recipes-core/zlib/zlib/run-ptest b/meta-openeuler/recipes-core/zlib/zlib/run-ptest new file mode 100644 index 00000000000..065863ef754 --- /dev/null +++ b/meta-openeuler/recipes-core/zlib/zlib/run-ptest @@ -0,0 +1,7 @@ +#!/bin/sh + +if ./examplesh ; then + echo "PASS: zlib" +else + echo "FAIL: zlib" +fi diff --git a/meta-openeuler/recipes-core/zlib/zlib_1.2.11.bb b/meta-openeuler/recipes-core/zlib/zlib_1.2.11.bb new file mode 100644 index 00000000000..652448df066 --- /dev/null +++ b/meta-openeuler/recipes-core/zlib/zlib_1.2.11.bb @@ -0,0 +1,53 @@ +SUMMARY = "Zlib Compression Library" +DESCRIPTION = "Zlib is a general-purpose, patent-free, lossless data compression \ +library which is used by many different programs." +HOMEPAGE = "http://zlib.net/" +SECTION = "libs" +LICENSE = "Zlib" +LIC_FILES_CHKSUM = "file://zlib.h;beginline=6;endline=23;md5=5377232268e952e9ef63bc555f7aa6c0" + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" +S = "${WORKDIR}/${BPN}-${PV}" +SRC_URI = "file://${BPN}/${BPN}-${PV}.tar.xz \ + " +UPSTREAM_CHECK_URI = "http://zlib.net/" + +SRC_URI[md5sum] = "85adef240c5f370b308da8c938951a68" +SRC_URI[sha256sum] = "4ff941449631ace0d4d203e3483be9dbc9da454084111f97ea0a2114e19bf066" + +CFLAGS += "-D_REENTRANT" + +RDEPENDS_${PN}-ptest += "make" + +inherit ptest + +do_configure() { + LDCONFIG=true ./configure --prefix=${prefix} --shared --libdir=${libdir} --uname=GNU +} + +do_compile() { + oe_runmake shared +} + +do_install() { + oe_runmake DESTDIR=${D} install +} + +do_install_ptest() { + install ${B}/examplesh ${D}${PTEST_PATH} +} + +# Move zlib shared libraries for target builds to $base_libdir so the library +# can be used in early boot before $prefix is mounted. +do_install_append_class-target() { + if [ ${base_libdir} != ${libdir} ] + then + mkdir -p ${D}/${base_libdir} + mv ${D}/${libdir}/libz.so.* ${D}/${base_libdir} + libname=`readlink ${D}/${libdir}/libz.so` + ln -sf ${@oe.path.relative("${libdir}", "${base_libdir}")}/$libname ${D}${libdir}/libz.so + fi +} + +BBCLASSEXTEND = "native nativesdk" -- Gitee From 392cd8fb119e5752f8c2f870789c68a63d86a421 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Tue, 26 Oct 2021 12:08:37 +0800 Subject: [PATCH 020/304] add recipe for gnu-config Signed-off-by: zhuyan --- .../gnu-config/gnu-config/config.guess | 1486 ++++++++++++++ .../gnu-config/gnu-config/config.sub | 1788 +++++++++++++++++ .../gnu-config/gnu-config/gnu-configize.in | 267 +++ .../gnu-config/gnu-config_20120814.bb | 48 + .../gnu-config/gnu-config_git.bb | 41 + 5 files changed, 3630 insertions(+) create mode 100644 meta-openeuler/recipes-devtools/gnu-config/gnu-config/config.guess create mode 100644 meta-openeuler/recipes-devtools/gnu-config/gnu-config/config.sub create mode 100644 meta-openeuler/recipes-devtools/gnu-config/gnu-config/gnu-configize.in create mode 100644 meta-openeuler/recipes-devtools/gnu-config/gnu-config_20120814.bb create mode 100644 meta-openeuler/recipes-devtools/gnu-config/gnu-config_git.bb diff --git a/meta-openeuler/recipes-devtools/gnu-config/gnu-config/config.guess b/meta-openeuler/recipes-devtools/gnu-config/gnu-config/config.guess new file mode 100644 index 00000000000..18f8edc0ff5 --- /dev/null +++ b/meta-openeuler/recipes-devtools/gnu-config/gnu-config/config.guess @@ -0,0 +1,1486 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-08-29' + +# This file 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 3 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; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2018 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 1 2 13 15 +trap 'exitcode=$?; test -z "$tmp" || rm -fr "$tmp"; exit $exitcode' 0 + +set_cc_for_build() { + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi-}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + UNAME_REL="`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + case `isainfo -b` in + 32) + echo i386-pc-solaris2"$UNAME_REL" + ;; + 64) + echo x86_64-pc-solaris2"$UNAME_REL" + ;; + esac + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + then + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "$HP_ARCH" = "" ]; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ "$HP_ARCH" = hppa2.0w ] + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf + fi + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-pc-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" + test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + # shellcheck disable=SC2154 + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; +esac + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/meta-openeuler/recipes-devtools/gnu-config/gnu-config/config.sub b/meta-openeuler/recipes-devtools/gnu-config/gnu-config/config.sub new file mode 100644 index 00000000000..69eb4bc1e2f --- /dev/null +++ b/meta-openeuler/recipes-devtools/gnu-config/gnu-config/config.sub @@ -0,0 +1,1788 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-08-29' + +# This file 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 3 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; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2018 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +IFS="-" read -r field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \ + | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + os=linux-android + ;; + *) + basic_machine=$field1-$field2 + os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + os= + ;; + *) + basic_machine=$field1 + os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + os=bsd + ;; + a29khif) + basic_machine=a29k-amd + os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=scout + ;; + alliant) + basic_machine=fx80-alliant + os= + ;; + altos | altos3068) + basic_machine=m68k-altos + os= + ;; + am29k) + basic_machine=a29k-none + os=bsd + ;; + amdahl) + basic_machine=580-amdahl + os=sysv + ;; + amiga) + basic_machine=m68k-unknown + os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=bsd + ;; + aros) + basic_machine=i386-pc + os=aros + ;; + aux) + basic_machine=m68k-apple + os=aux + ;; + balance) + basic_machine=ns32k-sequent + os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=linux + ;; + cegcc) + basic_machine=arm-unknown + os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=bsd + ;; + convex-c2) + basic_machine=c2-convex + os=bsd + ;; + convex-c32) + basic_machine=c32-convex + os=bsd + ;; + convex-c34) + basic_machine=c34-convex + os=bsd + ;; + convex-c38) + basic_machine=c38-convex + os=bsd + ;; + cray) + basic_machine=j90-cray + os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + os= + ;; + da30) + basic_machine=m68k-da30 + os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + os= + ;; + delta88) + basic_machine=m88k-motorola + os=sysv3 + ;; + dicos) + basic_machine=i686-pc + os=dicos + ;; + djgpp) + basic_machine=i586-pc + os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=ose + ;; + gmicro) + basic_machine=tron-gmicro + os=sysv + ;; + go32) + basic_machine=i386-pc + os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=hms + ;; + harris) + basic_machine=m88k-harris + os=sysv3 + ;; + hp300) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=hpux + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=proelf + ;; + i386mach) + basic_machine=i386-mach + os=mach + ;; + vsta) + basic_machine=i386-pc + os=vsta + ;; + isi68 | isi) + basic_machine=m68k-isi + os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + os=sysv + ;; + merlin) + basic_machine=ns32k-utek + os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + os=coff + ;; + morphos) + basic_machine=powerpc-unknown + os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=moxiebox + ;; + msdos) + basic_machine=i386-pc + os=msdos + ;; + msys) + basic_machine=i686-pc + os=msys + ;; + mvs) + basic_machine=i370-ibm + os=mvs + ;; + nacl) + basic_machine=le32-unknown + os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=newsos + ;; + news1000) + basic_machine=m68030-sony + os=newsos + ;; + necv70) + basic_machine=v70-nec + os=sysv + ;; + nh3000) + basic_machine=m68k-harris + os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=cxux + ;; + nindy960) + basic_machine=i960-intel + os=nindy + ;; + mon960) + basic_machine=i960-intel + os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=ose + ;; + os68k) + basic_machine=m68k-none + os=os68k + ;; + paragon) + basic_machine=i860-intel + os=osf + ;; + parisc) + basic_machine=hppa-unknown + os=linux + ;; + pw32) + basic_machine=i586-unknown + os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=rdos + ;; + rdos32) + basic_machine=i386-pc + os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=coff + ;; + sa29200) + basic_machine=a29k-amd + os=udi + ;; + sei) + basic_machine=mips-sei + os=seiux + ;; + sequent) + basic_machine=i386-sequent + os= + ;; + sps7) + basic_machine=m68k-bull + os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + os= + ;; + stratus) + basic_machine=i860-stratus + os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + os= + ;; + sun2os3) + basic_machine=m68000-sun + os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + os= + ;; + sun3os3) + basic_machine=m68k-sun + os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + os= + ;; + sun4os3) + basic_machine=sparc-sun + os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + os= + ;; + sv1) + basic_machine=sv1-cray + os=unicos + ;; + symmetry) + basic_machine=i386-sequent + os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=unicos + ;; + t90) + basic_machine=t90-cray + os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + os=tpf + ;; + udi29k) + basic_machine=a29k-amd + os=udi + ;; + ultra3) + basic_machine=a29k-nyu + os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=none + ;; + vaxv) + basic_machine=vax-dec + os=sysv + ;; + vms) + basic_machine=vax-dec + os=vms + ;; + vxworks960) + basic_machine=i960-wrs + os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=vxworks + ;; + xbox) + basic_machine=i686-pc + os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + os=unicos + ;; + *) + basic_machine=$1 + os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + os=${os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + os=${os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $os in + irix*) + ;; + *) + os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $os in + nextstep* ) + ;; + ns2*) + os=nextstep2 + ;; + *) + os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + os=${os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + IFS="-" read -r cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x$os != x ] +then +case $os in + # First match some system type aliases that might get confused + # with valid system types. + # solaris* is a basic system type, with this one exception. + auroraux) + os=auroraux + ;; + bluegene*) + os=cnk + ;; + solaris1 | solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + solaris) + os=solaris2 + ;; + unixware*) + os=sysv4.2uw + ;; + gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # es1800 is here to avoid being matched by es* (a different OS) + es1800*) + os=ose + ;; + # Some version numbers need modification + chorusos*) + os=chorusos + ;; + isc) + os=isc2.2 + ;; + sco6) + os=sco5v6 + ;; + sco5) + os=sco3.2v5 + ;; + sco4) + os=sco3.2v4 + ;; + sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + ;; + sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + scout) + # Don't match below + ;; + sco*) + os=sco3.2v2 + ;; + psos*) + os=psos + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + # sysv* is not here because it comes later, after sysvr4. + gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | kopensolaris* | plan9* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | knetbsd* | mirbsd* | netbsd* \ + | bitrig* | openbsd* | solidbsd* | libertybsd* \ + | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \ + | linux-newlib* | linux-musl* | linux-uclibc* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* \ + | morphos* | superux* | rtmk* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + qnx*) + case $cpu in + x86 | i*86) + ;; + *) + os=nto-$os + ;; + esac + ;; + hiux*) + os=hiuxwe2 + ;; + nto-qnx*) + ;; + nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + sim | xray | os68k* | v88r* \ + | windows* | osx | abug | netware* | os9* \ + | macos* | mpw* | magic* | mmixware* | mon960* | lnews*) + ;; + linux-dietlibc) + os=linux-dietlibc + ;; + linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + lynx*178) + os=lynxos178 + ;; + lynx*5) + os=lynxos5 + ;; + lynx*) + os=lynxos + ;; + mac*) + os=`echo "$os" | sed -e 's|mac|macos|'` + ;; + opened*) + os=openedition + ;; + os400*) + os=os400 + ;; + sunos5*) + os=`echo "$os" | sed -e 's|sunos5|solaris2|'` + ;; + sunos6*) + os=`echo "$os" | sed -e 's|sunos6|solaris3|'` + ;; + wince*) + os=wince + ;; + utek*) + os=bsd + ;; + dynix*) + os=bsd + ;; + acis*) + os=aos + ;; + atheos*) + os=atheos + ;; + syllable*) + os=syllable + ;; + 386bsd) + os=bsd + ;; + ctix* | uts*) + os=sysv + ;; + nova*) + os=rtmk-nova + ;; + ns2) + os=nextstep2 + ;; + nsk*) + os=nsk + ;; + # Preserve the version number of sinix5. + sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + sinix*) + os=sysv4 + ;; + tpf*) + os=tpf + ;; + triton*) + os=sysv3 + ;; + oss*) + os=sysv3 + ;; + svr4*) + os=sysv4 + ;; + svr3) + os=sysv3 + ;; + sysvr4) + os=sysv4 + ;; + # This must come after sysvr4. + sysv*) + ;; + ose*) + os=ose + ;; + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + os=mint + ;; + zvmoe) + os=zvmoe + ;; + dicos*) + os=dicos + ;; + pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $cpu in + arm*) + os=eabi + ;; + *) + os=elf + ;; + esac + ;; + nacl*) + ;; + ios) + ;; + none) + ;; + *-eabi) + ;; + *) + echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $cpu-$vendor in + score-*) + os=elf + ;; + spu-*) + os=elf + ;; + *-acorn) + os=riscix1.2 + ;; + arm*-rebel) + os=linux + ;; + arm*-semi) + os=aout + ;; + c4x-* | tic4x-*) + os=coff + ;; + c8051-*) + os=elf + ;; + clipper-intergraph) + os=clix + ;; + hexagon-*) + os=elf + ;; + tic54x-*) + os=coff + ;; + tic55x-*) + os=coff + ;; + tic6x-*) + os=coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=tops20 + ;; + pdp11-*) + os=none + ;; + *-dec | vax-*) + os=ultrix4.2 + ;; + m68*-apollo) + os=domain + ;; + i386-sun) + os=sunos4.0.2 + ;; + m68000-sun) + os=sunos3 + ;; + m68*-cisco) + os=aout + ;; + mep-*) + os=elf + ;; + mips*-cisco) + os=elf + ;; + mips*-*) + os=elf + ;; + or32-*) + os=coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=sysv3 + ;; + sparc-* | *-sun) + os=sunos4.1.1 + ;; + pru-*) + os=elf + ;; + *-be) + os=beos + ;; + *-ibm) + os=aix + ;; + *-knuth) + os=mmixware + ;; + *-wec) + os=proelf + ;; + *-winbond) + os=proelf + ;; + *-oki) + os=proelf + ;; + *-hp) + os=hpux + ;; + *-hitachi) + os=hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=sysv + ;; + *-cbm) + os=amigaos + ;; + *-dg) + os=dgux + ;; + *-dolphin) + os=sysv3 + ;; + m68k-ccur) + os=rtu + ;; + m88k-omron*) + os=luna + ;; + *-next) + os=nextstep + ;; + *-sequent) + os=ptx + ;; + *-crds) + os=unos + ;; + *-ns) + os=genix + ;; + i370-*) + os=mvs + ;; + *-gould) + os=sysv + ;; + *-highlevel) + os=bsd + ;; + *-encore) + os=bsd + ;; + *-sgi) + os=irix + ;; + *-siemens) + os=sysv4 + ;; + *-masscomp) + os=rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=uxpv + ;; + *-rom68k) + os=coff + ;; + *-*bug) + os=coff + ;; + *-apple) + os=macos + ;; + *-atari*) + os=mint + ;; + *-wrs) + os=vxworks + ;; + *) + os=none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $os in + riscix*) + vendor=acorn + ;; + sunos*) + vendor=sun + ;; + cnk*|-aix*) + vendor=ibm + ;; + beos*) + vendor=be + ;; + hpux*) + vendor=hp + ;; + mpeix*) + vendor=hp + ;; + hiux*) + vendor=hitachi + ;; + unos*) + vendor=crds + ;; + dgux*) + vendor=dg + ;; + luna*) + vendor=omron + ;; + genix*) + vendor=ns + ;; + clix*) + vendor=intergraph + ;; + mvs* | opened*) + vendor=ibm + ;; + os400*) + vendor=ibm + ;; + ptx*) + vendor=sequent + ;; + tpf*) + vendor=ibm + ;; + vxsim* | vxworks* | windiss*) + vendor=wrs + ;; + aux*) + vendor=apple + ;; + hms*) + vendor=hitachi + ;; + mpw* | macos*) + vendor=apple + ;; + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + vendor=atari + ;; + vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor-$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/meta-openeuler/recipes-devtools/gnu-config/gnu-config/gnu-configize.in b/meta-openeuler/recipes-devtools/gnu-config/gnu-config/gnu-configize.in new file mode 100644 index 00000000000..d4908fc4f9d --- /dev/null +++ b/meta-openeuler/recipes-devtools/gnu-config/gnu-config/gnu-configize.in @@ -0,0 +1,267 @@ +#! /usr/bin/env perl +# -*- perl -*- + +eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac' + if 0; + +# gnu-configize - install the GNU config.guess / config.sub in a directory tree +# Based on autoreconf: +# Copyright (C) 1994, 1999, 2000, 2001, 2002, 2003 +# Free Software Foundation, Inc. + +# 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, 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; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +BEGIN +{ + my $datadir = $ENV{'autom4te_perllibdir'} || '@autom4te_perllibdir@'; +# '/home/kergoth/code/build-arm/tmp/staging/share/autoconf'; + unshift @INC, $datadir; + + # Override SHELL. On DJGPP SHELL may not be set to a shell + # that can handle redirection and quote arguments correctly, + # e.g.: COMMAND.COM. For DJGPP always use the shell that configure + # has detected. + $ENV{'SHELL'} = '/bin/sh' if ($^O eq 'dos'); +} + +use Autom4te::ChannelDefs; +use Autom4te::Channels; +use Autom4te::Configure_ac; +use Autom4te::FileUtils; +use Autom4te::General; +use Autom4te::XFile; +# Do not use Cwd::chdir, since it might hang. +use Cwd 'cwd'; +use strict; + +## ----------- ## +## Variables. ## +## ----------- ## + +# $HELP +# ----- +$help = "Usage: $0 [OPTION] ... [CONFIGURE-AC or DIRECTORY] ... + +Install the GNU config.sub and config.guess scripts in the +DIRECTORIES or the directory trees driven by CONFIGURE-AC +(defaulting to `.'). + +Operation modes: + -h, --help print this help, then exit + -V, --version print version number, then exit + -v, --verbose verbosely report processing + -f, --force consider all files obsolete + -s, --symlink install symbolic links instead of copies + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [syntax] + +" . Autom4te::ChannelDefs::usage . " + +The environment variable \`WARNINGS\' is honored. Some subtools might +support other warning types, using \`all' is encouraged. +"; + +# $VERSION +# -------- +$version = "gnu-configize 1.0 + +Copyright (C) 2004 Chris Larson +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +"; + +my $configdir = '@gnu-configdir@'; +#'/home/kergoth/code/build-arm/tmp/staging/i686-linux/share/gnu-config'; +my $autoconf = $ENV{'AUTOCONF'} || 'autoconf'; + +# use symlinks instead. +my $symlink = 0; + +my $configure_ac; + +my $rm = "rm -f"; +my $ln_s = "ln -sf"; +my $cp = "cp -f"; +my $mkdir = "mkdir"; +my $chmod = "chmod"; + +## ---------- ## +## Routines. ## +## ---------- ## + + +# parse_args () +# ------------- +# Process any command line arguments. +sub parse_args () +{ + my $srcdir; + + getopt ('s|symlink' => \$symlink); + + # Even if the user specified a configure.ac, trim to get the + # directory, and look for configure.ac again. Because (i) the code + # is simpler, and (ii) we are still able to diagnose simultaneous + # presence of configure.ac and configure.in. + @ARGV = map { /configure\.(ac|in)$/ ? dirname ($_) : $_ } @ARGV; + push @ARGV, '.' unless @ARGV; +} + + +# &gnu_configize_current_directory +# ----------------------------- +sub gnu_configize_current_directory () +{ + my $configure_ac = require_configure_ac; + + # ---------------------- # + # Is it using Autoconf? # + # ---------------------- # + + my $uses_autoconf; + my $uses_gettext; + my $configure_ac_file = new Autom4te::XFile $configure_ac; + while ($_ = $configure_ac_file->getline) + { + s/#.*//; + s/dnl.*//; + $uses_autoconf = 1 if /AC_INIT/; + } + + if (!$uses_autoconf) + { + verb "$configure_ac: not using Autoconf"; + return; + } + + my $aux_dir; + my @subdir; + my $cmd; + my $dest; + + verb "$configure_ac: tracing"; + my $traces = new Autom4te::XFile + ("$autoconf" + . join (' --trace=', '', + # If you change this list, update the + # `Autoreconf-preselections' section of autom4te.in. + 'AC_CONFIG_AUX_DIR:AC_CONFIG_AUX_DIR:\$1', + 'AC_CONFIG_SUBDIRS:AC_CONFIG_SUBDIRS:\$1', + 'AC_INIT', + ) + . ' |'); + while ($_ = $traces->getline) + { + $aux_dir = $1 if /AC_CONFIG_AUX_DIR:(.*)/; + $uses_autoconf = 1 if /AC_INIT/; + push @subdir, split (' ', $1) if /AC_CONFIG_SUBDIRS:(.*)/; + } + + # The subdirs are *optional*, they may not exist. + foreach (@subdir) + { + if (-d) + { + verb "$configure_ac: subdirectory $_ to gnu-configize"; + gnu_configize ($_); + } + else + { + verb "$configure_ac: subdirectory $_ not present"; + } + } + + $dest = "."; + + if (defined $aux_dir) + { + $dest = $aux_dir; + if (! -d $aux_dir) + { + verb "$configure_ac: creating directory $aux_dir"; + mkdir $aux_dir + or error "cannot create $aux_dir: $!"; + } + } + + if (!$symlink) + { + $cmd = $cp; + } + else + { + $cmd = $ln_s; + } + + xsystem ("$cmd $configdir/config.guess $dest/"); + xsystem ("$chmod u+x $dest/config.guess"); + xsystem ("$cmd $configdir/config.sub $dest/"); + xsystem ("$chmod u+x $dest/config.sub"); +} + + +# &gnu_configize ($DIRECTORY) +# ------------------------ +# Reconf the $DIRECTORY. +sub gnu_configize ($) +{ + my ($directory) = @_; + my $cwd = cwd; + + # The format for this message is not free: taken from Emacs, itself + # using GNU Make's format. + verb "Entering directory `$directory'"; + chdir $directory + or error "cannot chdir to $directory: $!"; + + gnu_configize_current_directory; + + # The format is not free: taken from Emacs, itself using GNU Make's + # format. + verb "Leaving directory `$directory'"; + chdir $cwd + or error "cannot chdir to $cwd: $!"; +} + + +## ------ ## +## Main. ## +## ------ ## + +parse_args; + +# Autoreconf all the given configure.ac. A while loop, not a for, +# since the list can change at runtime because of AC_CONFIG_SUBDIRS. +for my $directory (@ARGV) + { + gnu_configize ($directory); + } + +### Setup "GNU" style for perl-mode and cperl-mode. +## Local Variables: +## perl-indent-level: 2 +## perl-continued-statement-offset: 2 +## perl-continued-brace-offset: 0 +## perl-brace-offset: 0 +## perl-brace-imaginary-offset: 0 +## perl-label-offset: -2 +## cperl-indent-level: 2 +## cperl-brace-offset: 0 +## cperl-continued-brace-offset: 0 +## cperl-label-offset: -2 +## cperl-extra-newline-before-brace: t +## cperl-merge-trailing-else: nil +## cperl-continued-statement-offset: 2 +## End: diff --git a/meta-openeuler/recipes-devtools/gnu-config/gnu-config_20120814.bb b/meta-openeuler/recipes-devtools/gnu-config/gnu-config_20120814.bb new file mode 100644 index 00000000000..c046c114ea7 --- /dev/null +++ b/meta-openeuler/recipes-devtools/gnu-config/gnu-config_20120814.bb @@ -0,0 +1,48 @@ +SUMMARY = "gnu-configize" +DESCRIPTION = "Tool that installs the GNU config.guess / config.sub into a directory tree" +SECTION = "devel" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +DEPENDS_class-native = "hostperl-runtime-native" + +INHIBIT_DEFAULT_DEPS = "1" + +PR = "r0" + +SRC_URI = " \ + file://gnu-configize.in \ + file://config.guess \ + file://config.sub \ + " + +SRC_URI[md5sum] = "cdb56e9968c9a3674fe4ad8880665f78" +SRC_URI[sha256sum] = "b48543f72d717a8c07cf3b995175b3293c24dac9c9efad01b312321c0c809f07" + +do_compile() { + : +} + +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +do_install () { + install -d ${D}${datadir}/gnu-config \ + ${D}${bindir} + cat ${WORKDIR}/gnu-configize.in | \ + sed -e 's,@gnu-configdir@,${datadir}/gnu-config,g' \ + -e 's,@autom4te_perllibdir@,/usr/share/autoconf,g' > ${D}${bindir}/gnu-configize + # In the native case we want the system perl as perl-native can't have built yet + if [ "${PN}" != "gnu-config-native" -a "${PN}" != "nativesdk-gnu-config" ]; then + sed -i -e 's,/usr/bin/env,${bindir}/env,g' ${D}${bindir}/gnu-configize + fi + chmod 500 ${D}${bindir}/gnu-configize + install -m 0644 "${WORKDIR}/config.guess" ${D}${datadir}/gnu-config/ + install -m 0644 "${WORKDIR}/config.sub" ${D}${datadir}/gnu-config/ + +} + +PACKAGES = "${PN}" +FILES_${PN} = "${bindir} ${datadir}/gnu-config" + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-openeuler/recipes-devtools/gnu-config/gnu-config_git.bb b/meta-openeuler/recipes-devtools/gnu-config/gnu-config_git.bb new file mode 100644 index 00000000000..394a34a80f7 --- /dev/null +++ b/meta-openeuler/recipes-devtools/gnu-config/gnu-config_git.bb @@ -0,0 +1,41 @@ +SUMMARY = "gnu-configize" +DESCRIPTION = "Tool that installs the GNU config.guess / config.sub into a directory tree" +SECTION = "devel" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://config.guess;endline=39;md5=0e6ca0501b27177f3bc640f7225e3ead" + +DEPENDS_class-native = "perl-native-runtime" + +INHIBIT_DEFAULT_DEPS = "1" + +SRCREV = "a47f842264fc19837f8a00eb1d2d254a4c527334" +PV = "1.0+git${SRCPV}" +PR = "r0" + +SRC_URI = "git://git.sv.gnu.org/config.git \ + file://gnu-configize.in" + +S = "${WORKDIR}/git" + +do_compile() { + : +} + +do_install () { + install -d ${D}${datadir}/gnu-config \ + ${D}${bindir} + cat ${WORKDIR}/gnu-configize.in | \ + sed -e 's,@gnu-configdir@,${datadir}/gnu-config,g' \ + -e 's,@autom4te_perllibdir@,${datadir}/autoconf,g' > ${D}${bindir}/gnu-configize + # In the native case we want the system perl as perl-native can't have built yet + if [ "${PN}" != "gnu-config-native" -a "${PN}" != "nativesdk-gnu-config" ]; then + sed -i -e 's,/usr/bin/env,${bindir}/env,g' ${D}${bindir}/gnu-configize + fi + chmod 500 ${D}${bindir}/gnu-configize + install -m 0644 config.guess config.sub ${D}${datadir}/gnu-config/ +} + +PACKAGES = "${PN}" +FILES_${PN} = "${bindir} ${datadir}/gnu-config" + +BBCLASSEXTEND = "native" -- Gitee From 71fdd4a022bda0e51d23bb987bea12cd1391d5df Mon Sep 17 00:00:00 2001 From: zhuyan Date: Tue, 26 Oct 2021 12:08:38 +0800 Subject: [PATCH 021/304] add recipe for os-base Signed-off-by: zhuyan --- .../recipes-core/os-base/os-base/LICENSE | 1 + .../recipes-core/os-base/os-base/bashrc | 3 + .../recipes-core/os-base/os-base/fstab | 9 + .../recipes-core/os-base/os-base/group | 2 + .../recipes-core/os-base/os-base/inittab | 3 + .../recipes-core/os-base/os-base/issue | 1 + .../recipes-core/os-base/os-base/issue.net | 1 + .../recipes-core/os-base/os-base/login.defs | 432 ++++++++++++++++++ .../recipes-core/os-base/os-base/motd | 1 + .../recipes-core/os-base/os-base/passwd | 2 + .../recipes-core/os-base/os-base/profile | 58 +++ .../recipes-core/os-base/os-base/securetty | 0 .../recipes-core/os-base/os-base/shadow | 2 + .../recipes-core/os-base/os-base/sysctl.conf | 202 ++++++++ .../recipes-core/os-base/os-base_1.0.bb | 43 ++ 15 files changed, 760 insertions(+) create mode 100644 meta-openeuler/recipes-core/os-base/os-base/LICENSE create mode 100644 meta-openeuler/recipes-core/os-base/os-base/bashrc create mode 100644 meta-openeuler/recipes-core/os-base/os-base/fstab create mode 100644 meta-openeuler/recipes-core/os-base/os-base/group create mode 100644 meta-openeuler/recipes-core/os-base/os-base/inittab create mode 100644 meta-openeuler/recipes-core/os-base/os-base/issue create mode 100644 meta-openeuler/recipes-core/os-base/os-base/issue.net create mode 100644 meta-openeuler/recipes-core/os-base/os-base/login.defs create mode 100644 meta-openeuler/recipes-core/os-base/os-base/motd create mode 100644 meta-openeuler/recipes-core/os-base/os-base/passwd create mode 100644 meta-openeuler/recipes-core/os-base/os-base/profile create mode 100644 meta-openeuler/recipes-core/os-base/os-base/securetty create mode 100644 meta-openeuler/recipes-core/os-base/os-base/shadow create mode 100644 meta-openeuler/recipes-core/os-base/os-base/sysctl.conf create mode 100644 meta-openeuler/recipes-core/os-base/os-base_1.0.bb diff --git a/meta-openeuler/recipes-core/os-base/os-base/LICENSE b/meta-openeuler/recipes-core/os-base/os-base/LICENSE new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/LICENSE @@ -0,0 +1 @@ + diff --git a/meta-openeuler/recipes-core/os-base/os-base/bashrc b/meta-openeuler/recipes-core/os-base/os-base/bashrc new file mode 100644 index 00000000000..619ea72ba08 --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/bashrc @@ -0,0 +1,3 @@ +TMOUT=300 +umask 077 +export TMOUT diff --git a/meta-openeuler/recipes-core/os-base/os-base/fstab b/meta-openeuler/recipes-core/os-base/os-base/fstab new file mode 100644 index 00000000000..26247ff28ea --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/fstab @@ -0,0 +1,9 @@ +proc /proc proc defaults,nofail 0 0 +sysfs /sys sysfs defaults,nofail 0 0 +none /var tmpfs nodev,nosuid,mode=755,noexec 0 0 +none /var/log/audit tmpfs nodev,nosuid,mode=755,nofail 0 0 +devtmpfs /dev devtmpfs defaults,nofail 0 0 +tmpfs /dev/shm tmpfs nodev,nosuid,mode=1777,noexec 0 0 +devpts /dev/pts devpts mode=620,nofail 0 0 +tmpfs /tmp tmpfs nodev,nosuid,noexec 0 0 +tmpfs /opt tmpfs defaults,mode=0750,nofail 0 0 diff --git a/meta-openeuler/recipes-core/os-base/os-base/group b/meta-openeuler/recipes-core/os-base/os-base/group new file mode 100644 index 00000000000..007e06d70f4 --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/group @@ -0,0 +1,2 @@ +root:x:0: +sshd:x:502: diff --git a/meta-openeuler/recipes-core/os-base/os-base/inittab b/meta-openeuler/recipes-core/os-base/os-base/inittab new file mode 100644 index 00000000000..cdc0f97b5c5 --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/inittab @@ -0,0 +1,3 @@ +::sysinit:/etc/rc.d/rc.sysinit +::respawn:/sbin/getty -L 115200 ttyAMA0 vt102 +::ctrlaltdel:/bin/false diff --git a/meta-openeuler/recipes-core/os-base/os-base/issue b/meta-openeuler/recipes-core/os-base/os-base/issue new file mode 100644 index 00000000000..eb110ba757c --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/issue @@ -0,0 +1 @@ +Authorized uses only. All activity may be monitored and reported. diff --git a/meta-openeuler/recipes-core/os-base/os-base/issue.net b/meta-openeuler/recipes-core/os-base/os-base/issue.net new file mode 100644 index 00000000000..eb110ba757c --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/issue.net @@ -0,0 +1 @@ +Authorized uses only. All activity may be monitored and reported. diff --git a/meta-openeuler/recipes-core/os-base/os-base/login.defs b/meta-openeuler/recipes-core/os-base/os-base/login.defs new file mode 100644 index 00000000000..b69058a5672 --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/login.defs @@ -0,0 +1,432 @@ +# +# /etc/login.defs - Configuration control definitions for the shadow package. +# +# $Id$ +# + +# +# Delay in seconds before being allowed another attempt after a login failure +# Note: When PAM is used, some modules may enforce a minimum delay (e.g. +# pam_unix(8) enforces a 2s delay) +# +#FAIL_DELAY 3 + +# +# Enable logging and display of /var/log/faillog2 login(1) failure info. +# +#FAILLOG_ENAB yes + +# +# Enable display of unknown usernames when login(1) failures are recorded. +# +LOG_UNKFAIL_ENAB no + +# +# Enable logging of successful logins +# +LOG_OK_LOGINS no + +# +# Enable logging and display of /var/log/lastlog login(1) time info. +# +#LASTLOG_ENAB yes + +# +# Limit the highest user ID number for which the lastlog entries should +# be updated. +# +# No LASTLOG_UID_MAX means that there is no user ID limit for writing +# lastlog entries. +# +#LASTLOG_UID_MAX + +# +# Enable checking and display of mailbox status upon login. +# +# Disable if the shell startup files already check for mail +# ("mailx -e" or equivalent). +# +#MAIL_CHECK_ENAB yes + +# +# Enable additional checks upon password changes. +# +#OBSCURE_CHECKS_ENAB yes + +# +# Enable checking of time restrictions specified in /etc/porttime. +# +#PORTTIME_CHECKS_ENAB yes + +# +# Enable setting of ulimit, umask, and niceness from passwd(5) gecos field. +# +#QUOTAS_ENAB yes + +# +# Enable "syslog" logging of su(1) activity - in addition to sulog file logging. +# SYSLOG_SG_ENAB does the same for newgrp(1) and sg(1). +# +#SYSLOG_SU_ENAB yes +#SYSLOG_SG_ENAB yes + +# +# If defined, either full pathname of a file containing device names or +# a ":" delimited list of device names. Root logins will be allowed only +# from these devices. +# +#CONSOLE /etc/securetty +#CONSOLE console:tty01:tty02:tty03:tty04 + +# +# If defined, all su(1) activity is logged to this file. +# +#SULOG_FILE /var/log/sulog + +# +# If defined, ":" delimited list of "message of the day" files to +# be displayed upon login. +# +#MOTD_FILE /etc/motd +#MOTD_FILE /etc/motd:/usr/lib/news/news-motd + +# +# If defined, this file will be output before each login(1) prompt. +# +#ISSUE_FILE /etc/issue + +# +# If defined, file which maps tty line to TERM environment parameter. +# Each line of the file is in a format similar to "vt100 tty01". +# +#TTYTYPE_FILE /etc/ttytype + +# +# If defined, login(1) failures will be logged here in a utmp format. +# last(1), when invoked as lastb(1), will read /var/log/btmp, so... +# +#FTMP_FILE /var/log/btmp + +# +# If defined, name of file whose presence will inhibit non-root +# logins. The content of this file should be a message indicating +# why logins are inhibited. +# +#NOLOGINS_FILE /etc/nologin + +# +# If defined, the command name to display when running "su -". For +# example, if this is defined as "su" then ps(1) will display the +# command as "-su". If not defined, then ps(1) will display the +# name of the shell actually being run, e.g. something like "-sh". +# +#SU_NAME su + +# +# *REQUIRED* +# Directory where mailboxes reside, _or_ name of file, relative to the +# home directory. If you _do_ define both, #MAIL_DIR takes precedence. +# +MAIL_DIR /var/spool/mail +#MAIL_FILE .mail + +# +# If defined, file which inhibits all the usual chatter during the login +# sequence. If a full pathname, then hushed mode will be enabled if the +# user's name or shell are found in the file. If not a full pathname, then +# hushed mode will be enabled if the file exists in the user's home directory. +# +#HUSHLOGIN_FILE .hushlogin +#HUSHLOGIN_FILE /etc/hushlogins + +# +# If defined, either a TZ environment parameter spec or the +# fully-rooted pathname of a file containing such a spec. +# +#ENV_TZ TZ=CST6CDT +#ENV_TZ /etc/tzname + +# +# If defined, an HZ environment parameter spec. +# +# for Linux/x86 +#ENV_HZ HZ=100 +# For Linux/Alpha... +#ENV_HZ HZ=1024 + +# +# *REQUIRED* The default PATH settings, for superuser and normal users. +# +# (they are minimal, add the rest in the shell startup files) +ENV_SUPATH PATH=/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin +ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin + +# +# Terminal permissions +# +# TTYGROUP Login tty will be assigned this group ownership. +# TTYPERM Login tty will be set to this permission. +# +# If you have a write(1) program which is "setgid" to a special group +# which owns the terminals, define TTYGROUP as the number of such group +# and TTYPERM as 0620. Otherwise leave TTYGROUP commented out and +# set TTYPERM to either 622 or 600. +# +#TTYGROUP tty +TTYPERM 0600 + +# +# Login configuration initializations: +# +# ERASECHAR Terminal ERASE character ('\010' = backspace). +# KILLCHAR Terminal KILL character ('\025' = CTRL/U). +# ULIMIT Default "ulimit" value. +# +# The ERASECHAR and KILLCHAR are used only on System V machines. +# The ULIMIT is used only if the system supports it. +# (now it works with setrlimit too; ulimit is in 512-byte units) +# +# Prefix these values with "0" to get octal, "0x" to get hexadecimal. +# +#ERASECHAR 0177 +#KILLCHAR 025 +#ULIMIT 2097152 + +# Default initial "umask" value used by login(1) on non-PAM enabled systems. +# Default "umask" value for pam_umask(8) on PAM enabled systems. +# UMASK is also used by useradd(8) and newusers(8) to set the mode for new +# home directories if HOME_MODE is not set. +# 022 is the default value, but 027, or even 077, could be considered +# for increased privacy. There is no One True Answer here: each sysadmin +# must make up their mind. +#UMASK 022 + +# HOME_MODE is used by useradd(8) and newusers(8) to set the mode for new +# home directories. +# If HOME_MODE is not set, the value of UMASK is used to create the mode. +#HOME_MODE 0700 + +# +# Password aging controls: +# +# PASS_MAX_DAYS Maximum number of days a password may be used. +# PASS_MIN_DAYS Minimum number of days allowed between password changes. +# PASS_MIN_LEN Minimum acceptable password length. +# PASS_WARN_AGE Number of days warning given before a password expires. +# +PASS_MAX_DAYS 90 +PASS_MIN_DAYS 7 +#PASS_MIN_LEN 5 +PASS_WARN_AGE 7 + +# +# If "yes", the user must be listed as a member of the first gid 0 group +# in /etc/group (called "root" on most Linux systems) to be able to "su" +# to uid 0 accounts. If the group doesn't exist or is empty, no one +# will be able to "su" to uid 0. +# +#SU_WHEEL_ONLY no + +# +# If compiled with cracklib support, sets the path to the dictionaries +# +#CRACKLIB_DICTPATH /var/cache/cracklib/cracklib_dict + +# +# Min/max values for automatic uid selection in useradd(8) +# +UID_MIN 500 +UID_MAX 60000 +# System accounts +SYS_UID_MIN 101 +#SYS_UID_MAX 999 +# Extra per user uids +SUB_UID_MIN 100000 +SUB_UID_MAX 600100000 +SUB_UID_COUNT 65536 + +# +# Min/max values for automatic gid selection in groupadd(8) +# +GID_MIN 500 +GID_MAX 60000 +# System accounts +SYS_GID_MIN 101 +#SYS_GID_MAX 999 +# Extra per user group ids +SUB_GID_MIN 100000 +SUB_GID_MAX 600100000 +SUB_GID_COUNT 65536 + +# +# Max number of login(1) retries if password is bad +# +#LOGIN_RETRIES 5 + +# +# Max time in seconds for login(1) +# +LOGIN_TIMEOUT 60 + +# +# Maximum number of attempts to change password if rejected (too easy) +# +#PASS_CHANGE_TRIES 5 + +# +# Warn about weak passwords (but still allow them) if you are root. +# +#PASS_ALWAYS_WARN yes + +# +# Number of significant characters in the password for crypt(). +# Default is 8, don't change unless your crypt() is better. +# Ignored if MD5_CRYPT_ENAB set to "yes". +# +#PASS_MAX_LEN 8 + +# +# Require password before chfn(1)/chsh(1) can make any changes. +# +#CHFN_AUTH yes + +# +# Which fields may be changed by regular users using chfn(1) - use +# any combination of letters "frwh" (full name, room number, work +# phone, home phone). If not defined, no changes are allowed. +# For backward compatibility, "yes" = "rwh" and "no" = "frwh". +# +#CHFN_RESTRICT rwh + +# +# Password prompt (%s will be replaced by user name). +# +# XXX - it doesn't work correctly yet, for now leave it commented out +# to use the default which is just "Password: ". +#LOGIN_STRING "%s's Password: " + +# +# Only works if compiled with MD5_CRYPT defined: +# If set to "yes", new passwords will be encrypted using the MD5-based +# algorithm compatible with the one used by recent releases of FreeBSD. +# It supports passwords of unlimited length and longer salt strings. +# Set to "no" if you need to copy encrypted passwords to other systems +# which don't understand the new algorithm. Default is "no". +# +# Note: If you use PAM, it is recommended to use a value consistent with +# the PAM modules configuration. +# +# This variable is deprecated. You should use ENCRYPT_METHOD instead. +# +#MD5_CRYPT_ENAB no + +# +# Only works if compiled with ENCRYPTMETHOD_SELECT defined: +# If set to MD5, MD5-based algorithm will be used for encrypting password +# If set to SHA256, SHA256-based algorithm will be used for encrypting password +# If set to SHA512, SHA512-based algorithm will be used for encrypting password +# If set to BCRYPT, BCRYPT-based algorithm will be used for encrypting password +# If set to DES, DES-based algorithm will be used for encrypting password (default) +# Overrides the MD5_CRYPT_ENAB option +# +# Note: If you use PAM, it is recommended to use a value consistent with +# the PAM modules configuration. +# +ENCRYPT_METHOD SHA512 + +# +# Only works if ENCRYPT_METHOD is set to SHA256 or SHA512. +# +# Define the number of SHA rounds. +# With a lot of rounds, it is more difficult to brute-force the password. +# However, more CPU resources will be needed to authenticate users if +# this value is increased. +# +# If not specified, the libc will choose the default number of rounds (5000). +# The values must be within the 1000-999999999 range. +# If only one of the MIN or MAX values is set, then this value will be used. +# If MIN > MAX, the highest value will be used. +# +#SHA_CRYPT_MIN_ROUNDS 5000 +#SHA_CRYPT_MAX_ROUNDS 5000 + +# +# Only works if ENCRYPT_METHOD is set to BCRYPT. +# +# Define the number of BCRYPT rounds. +# With a lot of rounds, it is more difficult to brute-force the password. +# However, more CPU resources will be needed to authenticate users if +# this value is increased. +# +# If not specified, 13 rounds will be attempted. +# If only one of the MIN or MAX values is set, then this value will be used. +# If MIN > MAX, the highest value will be used. +# +#BCRYPT_MIN_ROUNDS 13 +#BCRYPT_MAX_ROUNDS 13 + +# +# List of groups to add to the user's supplementary group set +# when logging in from the console (as determined by the CONSOLE +# setting). Default is none. +# +# Use with caution - it is possible for users to gain permanent +# access to these groups, even when not logged in from the console. +# How to do it is left as an exercise for the reader... +# +#CONSOLE_GROUPS floppy:audio:cdrom + +# +# Should login be allowed if we can't cd to the home directory? +# Default is no. +# +DEFAULT_HOME yes + +# +# If this file exists and is readable, login environment will be +# read from it. Every line should be in the form name=value. +# +#ENVIRON_FILE /etc/environment + +# +# If defined, this command is run when removing a user. +# It should remove any at/cron/print jobs etc. owned by +# the user to be removed (passed as the first argument). +# +#USERDEL_CMD /usr/sbin/userdel_local + +# +# Enable setting of the umask group bits to be the same as owner bits +# (examples: 022 -> 002, 077 -> 007) for non-root users, if the uid is +# the same as gid, and username is the same as the primary group name. +# +# This also enables userdel(8) to remove user groups if no members exist. +# +USERGROUPS_ENAB yes + +# +# If set to a non-zero number, the shadow utilities will make sure that +# groups never have more than this number of users on one line. +# This permits to support split groups (groups split into multiple lines, +# with the same group ID, to avoid limitation of the line length in the +# group file). +# +# 0 is the default value and disables this feature. +# +#MAX_MEMBERS_PER_GROUP 0 + +# +# If useradd(8) should create home directories for users by default (non +# system users only). +# This option is overridden with the -M or -m flags on the useradd(8) +# command-line. +# +CREATE_HOME yes + +# +# Force use shadow, even if shadow passwd & shadow group files are +# missing. +# +#FORCE_SHADOW yes +UMASK 077 +LASTLOG_ENAB yes diff --git a/meta-openeuler/recipes-core/os-base/os-base/motd b/meta-openeuler/recipes-core/os-base/os-base/motd new file mode 100644 index 00000000000..eb110ba757c --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/motd @@ -0,0 +1 @@ +Authorized uses only. All activity may be monitored and reported. diff --git a/meta-openeuler/recipes-core/os-base/os-base/passwd b/meta-openeuler/recipes-core/os-base/os-base/passwd new file mode 100644 index 00000000000..6b34777a424 --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/passwd @@ -0,0 +1,2 @@ +root:x:0:0:root:/root:/bin/bash +sshd:x:502:502:sshd privsep::/bin/false diff --git a/meta-openeuler/recipes-core/os-base/os-base/profile b/meta-openeuler/recipes-core/os-base/os-base/profile new file mode 100644 index 00000000000..bc66fd1e73e --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/profile @@ -0,0 +1,58 @@ +# /etc/profile +# init bash prompt and enviroment. +# +# + +PS1="\[\033[32m\]\h \w\[\033[m\] \\$ " + +#init PATH +PATH=/usr/local/bin:/usr/bin:/bin +if [ `id -u` -eq 0 ]; then + PATH=/sbin:/usr/sbin:/usr/local/sbin:/root/bin:$PATH +fi + +ulimit -c 0 + +if [ `id -u` -eq 0 ]; then + umask 077 +else + umask 077 +fi + +USER=`id -un` +LOGNAME=$USER + +HOSTNAME=`/bin/hostname` +HISTSIZE=1000 + +TMOUT=300 + +EDITOR=vi +VISUAL=vi + +PAGER=more + +INPUTRC="/etc/inputrc" + +export PATH PS1 USER LOGNAME HOSTNAME HISTSIZE EDITOR VISUAL PAGER INPUTRC TMOUT + + +# Running the local scripts from the user +for i in /etc/profile.d/*.sh ; do + if [ -x $i ]; then + . $i + fi +done +unset i + +alias ls="ls --color=auto" +alias ll="ls -l" +PS1="\[\033[32m\]\h \w\[\033[m\] \\$ " +export PS1 +export TERM=vt200 +PS1="\[\033[32m\]\H \w\[\033[m\] \\$ " +export PS1 +export VERSION=1.0 +export PRODUCT_NAME=openeuler +export HISTSIZE TMOUT +alias su='su -l' diff --git a/meta-openeuler/recipes-core/os-base/os-base/securetty b/meta-openeuler/recipes-core/os-base/os-base/securetty new file mode 100644 index 00000000000..e69de29bb2d diff --git a/meta-openeuler/recipes-core/os-base/os-base/shadow b/meta-openeuler/recipes-core/os-base/os-base/shadow new file mode 100644 index 00000000000..21dbde6ce92 --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/shadow @@ -0,0 +1,2 @@ +root:$6$sHTXIVQU$r8zE6YB6fyJfbvTzEUl3R1tVlY7L/3R1G8Gf4c9dvJx3E4hMv8GS.IN3naMh2bfL7RBd1JlnnfGcru3Ko9gkQ.:16056:0:99999:7::: +sshd:!:11880:0:90:7:-1:-1:0 diff --git a/meta-openeuler/recipes-core/os-base/os-base/sysctl.conf b/meta-openeuler/recipes-core/os-base/os-base/sysctl.conf new file mode 100644 index 00000000000..86515a154d3 --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/sysctl.conf @@ -0,0 +1,202 @@ +# see documents in sysctl directory and ip-sysctl.txt for reference + +#arp_ignore - INTEGER +# Define different modes for sending replies in response to +# received ARP requests that resolve local target IP addresses: +# 0 - (default): reply for any local target IP address, configured +# on any interface +# 1 - reply only if the target IP address is local address +# configured on the incoming interface +# 2 - reply only if the target IP address is local address +# configured on the incoming interface and both with the +# sender's IP address are part from same subnet on this interface +# 3 - do not reply for local addresses configured with scope host, +# only resolutions for global and link addresses are replied +# 4-7 - reserved +# 8 - do not reply for all local addresses +# +# The max value from conf/{all,interface}/arp_ignore is used +# when ARP request is received on the {interface} + +net.ipv4.conf.all.arp_ignore = 0 +net.ipv4.conf.default.arp_ignore = 0 + +#arp_filter - BOOLEAN +# 1 - Allows you to have multiple network interfaces on the same +# subnet, and have the ARPs for each interface be answered +# based on whether or not the kernel would route a packet from +# the ARP'd IP out that interface (therefore you must use source +# based routing for this to work). In other words it allows control +# of which cards (usually 1) will respond to an arp request. +# +# 0 - (default) The kernel can respond to arp requests with addresses +# from other interfaces. This may seem wrong but it usually makes +# sense, because it increases the chance of successful communication. +# IP addresses are owned by the complete host on Linux, not by +# particular interfaces. Only for more complex setups like load- +# balancing, does this behaviour cause problems. +# +# arp_filter for the interface will be enabled if at least one of +# conf/{all,interface}/arp_filter is set to TRUE, +# it will be disabled otherwise + +net.ipv4.conf.all.arp_filter = 1 +net.ipv4.conf.default.arp_filter = 1 + +#accept_source_route - INTEGER +# Accept source routing (routing extension header). +# +# >= 0: Accept only routing header type 2. +# < 0: Do not accept routing header. +# +# Default: 0 + +net.ipv4.conf.all.accept_source_route = 0 +net.ipv4.conf.default.accept_source_route = 0 + +#accept_redirects - BOOLEAN +# Accept ICMP redirect messages. +# accept_redirects for the interface will be enabled if: +# - both conf/{all,interface}/accept_redirects are TRUE in the case forwarding +# for the interface is enabled +# or +# - at least one of conf/{all,interface}/accept_redirects is TRUE in the case +# forwarding for the interface is disabled +# accept_redirects for the interface will be disabled otherwise +# default TRUE (host) +# FALSE (router) + +net.ipv4.conf.all.accept_redirects = 0 +net.ipv4.conf.default.accept_redirects = 0 + +#secure_redirects - BOOLEAN +# Accept ICMP redirect messages only for gateways, +# listed in default gateway list. +# secure_redirects for the interface will be enabled if at least one of +# conf/{all,interface}/secure_redirects is set to TRUE, +# it will be disabled otherwise +# default TRUE + +net.ipv4.conf.all.secure_redirects = 0 +net.ipv4.conf.default.secure_redirects = 0 + +#send_redirects - BOOLEAN +# Send redirects, if router. +# send_redirects for the interface will be enabled if at least one of +# conf/{all,interface}/send_redirects is set to TRUE, +# it will be disabled otherwise +# Default: TRUE + +net.ipv4.conf.all.send_redirects = 0 +net.ipv4.conf.default.send_redirects = 0 + +#tcp_fin_timeout - INTEGER +# Time to hold socket in state FIN-WAIT-2, if it was closed +# by our side. Peer can be broken and never close its side, +# or even died unexpectedly. Default value is 60sec. +# Usual value used in 2.2 was 180 seconds, you may restore +# it, but remember that if your machine is even underloaded WEB server, +# you risk to overflow memory with kilotons of dead sockets, +# FIN-WAIT-2 sockets are less dangerous than FIN-WAIT-1, +# because they eat maximum 1.5K of memory, but they tend +# to live longer. Cf. tcp_max_orphans. + +net.ipv4.tcp_fin_timeout = 60 + +#tcp_syncookies - BOOLEAN +# Only valid when the kernel was compiled with CONFIG_SYNCOOKIES +# Send out syncookies when the syn backlog queue of a socket +# overflows. This is to prevent against the common 'syn flood attack' +# Default: FALSE +# +# Note, that syncookies is fallback facility. +# It MUST NOT be used to help highly loaded servers to stand +# against legal connection rate. If you see synflood warnings +# in your logs, but investigation shows that they occur +# because of overload with legal connections, you should tune +# another parameters until this warning disappear. +# See: tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow. +# +# syncookies seriously violate TCP protocol, do not allow +# to use TCP extensions, can result in serious degradation +# of some services (f.e. SMTP relaying), visible not by you, +# but your clients and relays, contacting you. While you see +# synflood warnings in logs not being really flooded, your server +# is seriously misconfigured. + +#net.ipv4.tcp_syncookies = 1 + +#tcp_syn_retries - INTEGER +# Number of times initial SYNs for an active TCP connection attempt +# will be retransmitted. Should not be higher than 255. Default value +# is 5, which corresponds to ~180seconds. + +net.ipv4.tcp_syn_retries = 1 + +#tcp_synack_retries - INTEGER +# Number of times SYNACKs for a passive TCP connection attempt will +# be retransmitted. Should not be higher than 255. Default value +# is 5, which corresponds to ~180seconds. + +net.ipv4.tcp_synack_retries = 1 + +#tcp_max_syn_backlog - INTEGER +# Maximal number of remembered connection requests, which are +# still did not receive an acknowledgment from connecting client. +# Default value is 1024 for systems with more than 128Mb of memory, +# and 128 for low memory machines. If server suffers of overload, +# try to increase this number. + +net.ipv4.tcp_max_syn_backlog = 4096 + +#icmp_echo_ignore_broadcasts - BOOLEAN +# If set non-zero, then the kernel will ignore all ICMP ECHO and +# TIMESTAMP requests sent to it via broadcast/multicast. +# Default: 1 + +net.ipv4.icmp_echo_ignore_broadcasts = 1 + +#panic_on_oops: +# Controls the kernel's behaviour when an oops or BUG is encountered. +# 0: try to continue operation +# 1: panic immediately. If the `panic' sysctl is also non-zero then the +# machine will be rebooted. + +kernel.panic_on_oops = 1 + +#printk: +# The four values in printk denote: console_loglevel, +# default_message_loglevel, minimum_console_loglevel and +# default_console_loglevel respectively. +# These values influence printk() behavior when printing or +# logging error messages. See 'man 2 syslog' for more info on +# the different loglevels. +# - console_loglevel: messages with a higher priority than +# this will be printed to the console +# - default_message_level: messages without an explicit priority +# will be printed with this priority +# - minimum_console_loglevel: minimum (highest) value to which +# console_loglevel can be set +# - default_console_loglevel: default value for console_loglevel + +kernel.printk = 0 4 0 7 + +net.ipv4.tcp_timestamps = 0 +net.ipv4.icmp_ignore_bogus_error_responses = 1 +net.ipv4.conf.all.rp_filter = 1 +net.ipv4.conf.default.rp_filter = 1 +kernel.sysrq = 0 + +#################### +net.ipv4.conf.all.promote_secondaries=1 +fs.suid_dumpable = 0 +net.ipv4.ip_forward=0 +net.ipv4.conf.default.log_martians=1 +net.ipv4.conf.all.log_martians=1 +net.ipv4.tcp_syncookies=1 +net.ipv4.icmp_echo_ignore_all = 1 + +kernel.randomize_va_space=2 +kernel.perf_event_paranoid = 3 +fs.protected_symlinks=1 +fs.protected_hardlinks=1 diff --git a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb new file mode 100644 index 00000000000..7d49d791a86 --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb @@ -0,0 +1,43 @@ +SUMMARY = "OS basic configuration files" +DESCRIPTION = "base files" +SECTION = "base" +PR = "r1" +LICENSE = "MulanPSL-2.0" + + +LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE;md5=1acb172ffd3d252285dd1b8b8459941e" + +SRC_URI = "file://${WORKDIR}/bashrc \ + file://${WORKDIR}/fstab \ + file://${WORKDIR}/group \ + file://${WORKDIR}/inittab \ + file://${WORKDIR}/issue \ + file://${WORKDIR}/issue.net \ + file://${WORKDIR}/LICENSE \ + file://${WORKDIR}/login.defs \ + file://${WORKDIR}/motd \ + file://${WORKDIR}/passwd \ + file://${WORKDIR}/profile \ + file://${WORKDIR}/securetty \ + file://${WORKDIR}/shadow \ + file://${WORKDIR}/sysctl.conf" + +do_install() { + install -d ${D}/etc + cp ${WORKDIR}/bashrc ${D}/etc/ + cp ${WORKDIR}/fstab ${D}/etc/ + cp ${WORKDIR}/group ${D}/etc/ + cp ${WORKDIR}/inittab ${D}/etc/ + cp ${WORKDIR}/issue ${D}/etc/ + cp ${WORKDIR}/issue.net ${D}/etc/ + cp ${WORKDIR}/login.defs ${D}/etc/ + cp ${WORKDIR}/motd ${D}/etc/ + cp ${WORKDIR}/passwd ${D}/etc/ + cp ${WORKDIR}/profile ${D}/etc/ + cp ${WORKDIR}/securetty ${D}/etc/ + cp ${WORKDIR}/shadow ${D}/etc/ + cp ${WORKDIR}/sysctl.conf ${D}/etc/ +} + + +FILES_${PN} = "/" -- Gitee From b91ca3798b8dd3a6d553de4e85bdc0e249e6e890 Mon Sep 17 00:00:00 2001 From: lisimin Date: Fri, 17 Sep 2021 21:02:39 +0800 Subject: [PATCH 022/304] fix busybox links install path error Signed-off-by: lisimin --- .../recipes-core/busybox/busybox_1.33.1.bb | 85 ++----------------- 1 file changed, 6 insertions(+), 79 deletions(-) diff --git a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb index f80b30c2aaa..c08122ac9f7 100644 --- a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb +++ b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb @@ -29,14 +29,12 @@ BUSYBOX_SPLIT_SUID ?= "1" export EXTRA_CFLAGS = "${CFLAGS}" export EXTRA_LDFLAGS = "${LDFLAGS}" -EXTRA_OEMAKE = "CC='${CC}' LD='${CCLD}' V=1 ARCH=${TARGET_ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y HOSTCC='${BUILD_CC}' HOSTCPP='${BUILD_CPP}'" -EXTRA_OEMAKE = "CC='${CC}' V=1 ARCH=${ARCH} LD=${LD} CROSS_COMPILE=${TARGET_PREFIX}" -EXTRA_OEMAKE = "CC='${CC}' LD='${CCLD}' V=1 ARCH=${ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y HOSTCC='${BUILD_CC}' HOSTCPP='${BUILD_CPP}'" +EXTRA_OEMAKE = "CC='${CC}' V=1 ARCH=${ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y HOSTCC='${BUILD_CC}' HOSTCPP='${BUILD_CPP}'" #use host pkg-config add by openeuler EXTRA_OECONF += "PKG_CONFIG=pkg-config" EXTRA_OEMAKE += "PKG_CONFIG=pkg-config" -PACKAGES =+ "${PN}-httpd ${PN}-udhcpd ${PN}-udhcpc ${PN}-syslog ${PN}-mdev ${PN}-hwclock" +PACKAGES =+ "${PN}-linuxrc ${PN}-httpd ${PN}-udhcpd ${PN}-udhcpc ${PN}-syslog ${PN}-mdev ${PN}-hwclock" FILES_${PN}-httpd = "${sysconfdir}/init.d/busybox-httpd /srv/www" FILES_${PN}-syslog = "${sysconfdir}/init.d/syslog* ${sysconfdir}/syslog-startup.conf* ${sysconfdir}/syslog.conf* ${systemd_unitdir}/system/syslog.service ${sysconfdir}/default/busybox-syslog" @@ -44,6 +42,7 @@ FILES_${PN}-mdev = "${sysconfdir}/init.d/mdev ${sysconfdir}/mdev.conf ${sysconfd FILES_${PN}-udhcpd = "${sysconfdir}/init.d/busybox-udhcpd" FILES_${PN}-udhcpc = "${sysconfdir}/udhcpc.d ${datadir}/udhcpc" FILES_${PN}-hwclock = "${sysconfdir}/init.d/hwclock.sh" +FILES_${PN}-linuxrc = "/linuxrc" INITSCRIPT_PACKAGES = "${PN}-httpd ${PN}-syslog ${PN}-udhcpd ${PN}-mdev ${PN}-hwclock" @@ -53,6 +52,7 @@ INITSCRIPT_NAME_${PN}-mdev = "mdev" INITSCRIPT_PARAMS_${PN}-mdev = "start 04 S ." INITSCRIPT_NAME_${PN}-syslog = "syslog" INITSCRIPT_NAME_${PN}-udhcpd = "busybox-udhcpd" +INITSCRIPT_NAME_${PN}-initrc = "initrc" SYSTEMD_PACKAGES = "${PN}-syslog" SYSTEMD_SERVICE_${PN}-syslog = "${@bb.utils.contains('SRC_URI', 'file://syslog.cfg', 'busybox-syslog.service', '', d)}" @@ -70,12 +70,10 @@ RDEPENDS_${PN} = "${@["", "busybox-inittab"][(d.getVar('VIRTUAL-RUNTIME_init_man do_configure() { cp ../yocto-embedded-tools/config/arm64/defconfig-busybox .config set -e - unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS yes '' | oe_runmake oldconfig } do_compile () { - unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS export KCONFIG_NOTIMESTAMP=1 if [ -e .config.orig ]; then # Need to guard again an interrupted do_compile - restore any backup @@ -94,77 +92,6 @@ do_compile () { } do_install () { - sed -i "s:^/bin/:BASE_BINDIR/:" busybox.links* - sed -i "s:^/sbin/:BASE_SBINDIR/:" busybox.links* - sed -i "s:^/usr/bin/:BINDIR/:" busybox.links* - sed -i "s:^/usr/sbin/:SBINDIR/:" busybox.links* - - # Move arch/link to BINDIR to match coreutils - sed -i "s:^BASE_BINDIR/arch:BINDIR/arch:" busybox.links* - sed -i "s:^BASE_BINDIR/link:BINDIR/link:" busybox.links* - - sed -i "s:^BASE_BINDIR/:${base_bindir}/:" busybox.links* - sed -i "s:^BASE_SBINDIR/:${base_sbindir}/:" busybox.links* - sed -i "s:^BINDIR/:${bindir}/:" busybox.links* - sed -i "s:^SBINDIR/:${sbindir}/:" busybox.links* - - install -d ${D}${sysconfdir}/init.d - - if ! grep -q "CONFIG_FEATURE_INDIVIDUAL=y" ${B}/.config; then - # Install ${base_bindir}/busybox, and the ${base_bindir}/sh link so the postinst script - # can run. Let update-alternatives handle the rest. - install -d ${D}${base_bindir} - if [ "${BUSYBOX_SPLIT_SUID}" = "1" ]; then - install -m 4755 ${B}/busybox.suid ${D}${base_bindir} - install -m 0755 ${B}/busybox.nosuid ${D}${base_bindir} - install -m 0644 ${S}/busybox.links.suid ${D}${sysconfdir} - install -m 0644 ${S}/busybox.links.nosuid ${D}${sysconfdir} - if grep -q "CONFIG_SH_IS_ASH=y" ${B}/.config; then - ln -sf busybox.nosuid ${D}${base_bindir}/sh - fi - # Keep a default busybox for people who want to invoke busybox directly. - # This is also useful for the on device upgrade. Because we want - # to use the busybox command in postinst. - ln -sf busybox.nosuid ${D}${base_bindir}/busybox - else - if grep -q "CONFIG_FEATURE_SUID=y" ${B}/.config; then - install -m 4755 ${B}/busybox ${D}${base_bindir} - else - install -m 0755 ${B}/busybox ${D}${base_bindir} - fi - install -m 0644 ${S}/busybox.links ${D}${sysconfdir} - if grep -q "CONFIG_SH_IS_ASH=y" ${B}/.config; then - ln -sf busybox ${D}${base_bindir}/sh - fi - # We make this symlink here to eliminate the error when upgrading together - # with busybox-syslog. Without this symlink, the opkg may think of the - # busybox.nosuid as obsolete and remove it, resulting in dead links like - # ${base_bindir}/sed -> ${base_bindir}/busybox.nosuid. This will make upgrading busybox-syslog fail. - # This symlink will be safely deleted in postinst, thus no negative effect. - ln -sf busybox ${D}${base_bindir}/busybox.nosuid - fi - else - install -d ${D}${base_bindir} ${D}${bindir} ${D}${libdir} - cat busybox.links | while read FILE; do - NAME=`basename "$FILE"` - install -m 0755 "0_lib/$NAME" "${D}$FILE.${BPN}" - done - # add suid bit where needed - for i in `grep -E "APPLET.*BB_SUID_((MAYBE|REQUIRE))" include/applets.h | grep -v _BB_SUID_DROP | cut -f 3 -d '(' | cut -f 1 -d ','`; do - find ${D} -name $i.${BPN} -exec chmod a+s {} \; - done - install -m 0755 0_lib/libbusybox.so.${PV} ${D}${libdir}/libbusybox.so.${PV} - ln -sf sh.${BPN} ${D}${base_bindir}/sh - ln -sf ln.${BPN} ${D}${base_bindir}/ln - ln -sf test.${BPN} ${D}${bindir}/test - if [ -f ${D}/linuxrc.${BPN} ]; then - mv ${D}/linuxrc.${BPN} ${D}/linuxrc - fi - install -m 0644 ${S}/busybox.links ${D}${sysconfdir} - fi - - # Remove the sysvinit specific configuration file for systemd systems to avoid confusion - if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'false', 'true', d)}; then - rm -f ${D}${sysconfdir}/syslog-startup.conf - fi + oe_runmake CONFIG_PREFIX="${D}" install } +INSANE_SKIP += "already-stripped" -- Gitee From 92b76d72e0acd722c9d9ca01747f7b5973999ae9 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Sat, 18 Sep 2021 10:31:36 +0800 Subject: [PATCH 023/304] move pam files to openssh and shadow Signed-off-by: zhuyan --- .../recipes-core/openssh/openssh/sshd | 14 +++ .../recipes-core/pam/libpam/pam.d/chfn | 4 - .../recipes-core/pam/libpam/pam.d/chsh | 4 - .../recipes-core/pam/libpam/pam.d/login | 9 -- .../recipes-core/pam/libpam/pam.d/passwd | 4 - .../recipes-core/pam/libpam/pam.d/sshd | 24 ----- .../recipes-core/pam/libpam/pam.d/su | 8 -- .../recipes-core/shadow/files/pam.d/chfn | 16 +--- .../recipes-core/shadow/files/pam.d/chsh | 21 +---- .../libpam => shadow/files}/pam.d/groupmems | 0 .../recipes-core/shadow/files/pam.d/login | 90 ++----------------- .../recipes-core/shadow/files/pam.d/passwd | 9 +- .../recipes-core/shadow/files/pam.d/su | 65 ++------------ meta-openeuler/recipes-core/shadow/shadow.inc | 3 +- 14 files changed, 43 insertions(+), 228 deletions(-) delete mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/chfn delete mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/chsh delete mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/login delete mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/passwd delete mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/sshd delete mode 100644 meta-openeuler/recipes-core/pam/libpam/pam.d/su rename meta-openeuler/recipes-core/{pam/libpam => shadow/files}/pam.d/groupmems (100%) diff --git a/meta-openeuler/recipes-core/openssh/openssh/sshd b/meta-openeuler/recipes-core/openssh/openssh/sshd index 4882e58b480..98750729022 100644 --- a/meta-openeuler/recipes-core/openssh/openssh/sshd +++ b/meta-openeuler/recipes-core/openssh/openssh/sshd @@ -2,9 +2,23 @@ auth include common-auth account required pam_nologin.so + +# SELinux needs to be the first session rule. This ensures that any +# lingering context has been cleared. Without out this it is possible +# that a module could execute code in the wrong domain. +# When the module is present, "required" would be sufficient (When SELinux +# is disabled, this returns success.) +#session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close + account include common-account password include common-password session optional pam_keyinit.so force revoke session include common-session session required pam_loginuid.so +# SELinux needs to intervene at login time to ensure that the process +# starts in the proper default security context. Only sessions which are +# intended to run in the user's context should be run after this. +# When the module is present, "required" would be sufficient (When SELinux +# is disabled, this returns success.) +#session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/chfn b/meta-openeuler/recipes-core/pam/libpam/pam.d/chfn deleted file mode 100644 index fc84574aa4f..00000000000 --- a/meta-openeuler/recipes-core/pam/libpam/pam.d/chfn +++ /dev/null @@ -1,4 +0,0 @@ -#%PAM-1.0 -auth sufficient pam_rootok.so -account required pam_permit.so -password include common-passwd diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/chsh b/meta-openeuler/recipes-core/pam/libpam/pam.d/chsh deleted file mode 100644 index fc84574aa4f..00000000000 --- a/meta-openeuler/recipes-core/pam/libpam/pam.d/chsh +++ /dev/null @@ -1,4 +0,0 @@ -#%PAM-1.0 -auth sufficient pam_rootok.so -account required pam_permit.so -password include common-passwd diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/login b/meta-openeuler/recipes-core/pam/libpam/pam.d/login deleted file mode 100644 index 0e571ec652e..00000000000 --- a/meta-openeuler/recipes-core/pam/libpam/pam.d/login +++ /dev/null @@ -1,9 +0,0 @@ -#%PAM-1.0 -auth required pam_securetty.so -auth include common-auth -account required pam_nologin.so -account include common-account -password include common-password -session include common-session -session required pam_loginuid.so -session optional pam_console.so diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/passwd b/meta-openeuler/recipes-core/pam/libpam/pam.d/passwd deleted file mode 100644 index f50a8537bba..00000000000 --- a/meta-openeuler/recipes-core/pam/libpam/pam.d/passwd +++ /dev/null @@ -1,4 +0,0 @@ -#%PAM-1.0 -auth include common-auth -account include common-account -password include common-password diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/sshd b/meta-openeuler/recipes-core/pam/libpam/pam.d/sshd deleted file mode 100644 index ec0228c3d3d..00000000000 --- a/meta-openeuler/recipes-core/pam/libpam/pam.d/sshd +++ /dev/null @@ -1,24 +0,0 @@ -#%PAM-1.0 - -auth include common-auth -account required pam_nologin.so - -# SELinux needs to be the first session rule. This ensures that any -# lingering context has been cleared. Without out this it is possible -# that a module could execute code in the wrong domain. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -#session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close - -account include common-account -password include common-password -session optional pam_keyinit.so force revoke -session include common-session -session required pam_loginuid.so - -# SELinux needs to intervene at login time to ensure that the process -# starts in the proper default security context. Only sessions which are -# intended to run in the user's context should be run after this. -# When the module is present, "required" would be sufficient (When SELinux -# is disabled, this returns success.) -#session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/su b/meta-openeuler/recipes-core/pam/libpam/pam.d/su deleted file mode 100644 index d2259132aa5..00000000000 --- a/meta-openeuler/recipes-core/pam/libpam/pam.d/su +++ /dev/null @@ -1,8 +0,0 @@ -auth sufficient pam_rootok.so -auth required pam_wheel.so use_uid -session required pam_env.so readenv=1 -auth include common-auth -account sufficient pam_rootok.so -account include common-account -password include common-password -session include common-session diff --git a/meta-openeuler/recipes-core/shadow/files/pam.d/chfn b/meta-openeuler/recipes-core/shadow/files/pam.d/chfn index baf7698bba8..fd39af331f5 100644 --- a/meta-openeuler/recipes-core/shadow/files/pam.d/chfn +++ b/meta-openeuler/recipes-core/shadow/files/pam.d/chfn @@ -1,14 +1,4 @@ -# -# The PAM configuration file for the Shadow `chfn' service -# - -# This allows root to change user infomation without being -# prompted for a password +#%PAM-1.0 auth sufficient pam_rootok.so - -# The standard Unix authentication modules, used with -# NIS (man nsswitch) as well as normal /etc/passwd and -# /etc/shadow entries. -auth include common-auth -account include common-account -session include common-session +account required pam_permit.so +password include common-passwd diff --git a/meta-openeuler/recipes-core/shadow/files/pam.d/chsh b/meta-openeuler/recipes-core/shadow/files/pam.d/chsh index 8fb169f64e1..fd39af331f5 100644 --- a/meta-openeuler/recipes-core/shadow/files/pam.d/chsh +++ b/meta-openeuler/recipes-core/shadow/files/pam.d/chsh @@ -1,19 +1,4 @@ -# -# The PAM configuration file for the Shadow `chsh' service -# - -# This will not allow a user to change their shell unless -# their current one is listed in /etc/shells. This keeps -# accounts with special shells from changing them. -auth required pam_shells.so - -# This allows root to change user shell without being -# prompted for a password +#%PAM-1.0 auth sufficient pam_rootok.so - -# The standard Unix authentication modules, used with -# NIS (man nsswitch) as well as normal /etc/passwd and -# /etc/shadow entries. -auth include common-auth -account include common-account -session include common-session +account required pam_permit.so +password include common-passwd diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/groupmems b/meta-openeuler/recipes-core/shadow/files/pam.d/groupmems similarity index 100% rename from meta-openeuler/recipes-core/pam/libpam/pam.d/groupmems rename to meta-openeuler/recipes-core/shadow/files/pam.d/groupmems diff --git a/meta-openeuler/recipes-core/shadow/files/pam.d/login b/meta-openeuler/recipes-core/shadow/files/pam.d/login index b340058539e..499c8c3d7f0 100644 --- a/meta-openeuler/recipes-core/shadow/files/pam.d/login +++ b/meta-openeuler/recipes-core/shadow/files/pam.d/login @@ -1,81 +1,9 @@ -# -# The PAM configuration file for the Shadow `login' service -# - -# Enforce a minimal delay in case of failure (in microseconds). -# (Replaces the `FAIL_DELAY' setting from login.defs) -# Note that other modules may require another minimal delay. (for example, -# to disable any delay, you should add the nodelay option to pam_unix) -auth optional pam_faildelay.so delay=3000000 - -# Outputs an issue file prior to each login prompt (Replaces the -# ISSUE_FILE option from login.defs). Uncomment for use -# auth required pam_issue.so issue=/etc/issue - -# Disallows root logins except on tty's listed in /etc/securetty -# (Replaces the `CONSOLE' setting from login.defs) -# Note that it is included as a "requisite" module. No password prompts will -# be displayed if this module fails to avoid having the root password -# transmitted on unsecure ttys. -# You can change it to a "required" module if you think it permits to -# guess valid user names of your system (invalid user names are considered -# as possibly being root). -auth [success=ok ignore=ignore user_unknown=ignore default=die] pam_securetty.so - -# Disallows other than root logins when /etc/nologin exists -# (Replaces the `NOLOGINS_FILE' option from login.defs) -auth requisite pam_nologin.so - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 - -# Standard Un*x authentication. -auth include common-auth - -# This allows certain extra groups to be granted to a user -# based on things like time of day, tty, service, and user. -# Please edit /etc/security/group.conf to fit your needs -# (Replaces the `CONSOLE_GROUPS' option in login.defs) -auth optional pam_group.so - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restrainst on logins. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# Uncomment and edit /etc/security/access.conf if you need to -# set access limits. -# (Replaces /etc/login.access file) -# account required pam_access.so - -# Sets up user limits according to /etc/security/limits.conf -# (Replaces the use of /etc/limits in old login) -session required pam_limits.so - -# Prints the last login info upon succesful login -# (Replaces the `LASTLOG_ENAB' option from login.defs) -session optional pam_lastlog.so - -# Prints the motd upon succesful login -# (Replaces the `MOTD_FILE' option in login.defs) -session optional pam_motd.so - -# Prints the status of the user's mailbox upon succesful login -# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). -# -# This also defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -session optional pam_mail.so standard - -# Standard Un*x account and session -account include common-account -password include common-password -session include common-session +#%PAM-1.0 +auth required pam_securetty.so +auth include common-auth +account required pam_nologin.so +account include common-account +password include common-password +session include common-session +session required pam_loginuid.so +session optional pam_console.so diff --git a/meta-openeuler/recipes-core/shadow/files/pam.d/passwd b/meta-openeuler/recipes-core/shadow/files/pam.d/passwd index f5349924358..59cfdfb21b8 100644 --- a/meta-openeuler/recipes-core/shadow/files/pam.d/passwd +++ b/meta-openeuler/recipes-core/shadow/files/pam.d/passwd @@ -1,5 +1,4 @@ -# -# The PAM configuration file for the Shadow `passwd' service -# - -password include common-password +#%PAM-1.0 +auth include common-auth +account include common-account +password include common-password diff --git a/meta-openeuler/recipes-core/shadow/files/pam.d/su b/meta-openeuler/recipes-core/shadow/files/pam.d/su index 8d590a32e60..28360f57131 100644 --- a/meta-openeuler/recipes-core/shadow/files/pam.d/su +++ b/meta-openeuler/recipes-core/shadow/files/pam.d/su @@ -1,57 +1,8 @@ -# -# The PAM configuration file for the Shadow `su' service -# - -# This allows root to su without passwords (normal operation) -auth sufficient pam_rootok.so - -# Uncomment this to force users to be a member of group root -# before they can use `su'. You can also add "group=foo" -# to the end of this line if you want to use a group other -# than the default "root" (but this may have side effect of -# denying "root" user, unless she's a member of "foo" or explicitly -# permitted earlier by e.g. "sufficient pam_rootok.so"). -# (Replaces the `SU_WHEEL_ONLY' option from login.defs) -# auth required pam_wheel.so - -# Uncomment this if you want wheel members to be able to -# su without a password. -# auth sufficient pam_wheel.so trust - -# Uncomment this if you want members of a specific group to not -# be allowed to use su at all. -# auth required pam_wheel.so deny group=nosu - -# Uncomment and edit /etc/security/time.conf if you need to set -# time restrainst on su usage. -# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs -# as well as /etc/porttime) -# account requisite pam_time.so - -# This module parses environment configuration file(s) -# and also allows you to use an extended config -# file /etc/security/pam_env.conf. -# -# parsing /etc/environment needs "readenv=1" -session required pam_env.so readenv=1 - -# Defines the MAIL environment variable -# However, userdel also needs MAIL_DIR and MAIL_FILE variables -# in /etc/login.defs to make sure that removing a user -# also removes the user's mail spool file. -# See comments in /etc/login.defs -# -# "nopen" stands to avoid reporting new mail when su'ing to another user -session optional pam_mail.so nopen - -# Sets up user limits, please uncomment and read /etc/security/limits.conf -# to enable this functionality. -# (Replaces the use of /etc/limits in old login) -# session required pam_limits.so - -# The standard Unix authentication modules, used with -# NIS (man nsswitch) as well as normal /etc/passwd and -# /etc/shadow entries. -auth include common-auth -account include common-account -session include common-session +auth sufficient pam_rootok.so +auth required pam_wheel.so use_uid +session required pam_env.so readenv=1 +auth include common-auth +account sufficient pam_rootok.so +account include common-account +password include common-password +session include common-session diff --git a/meta-openeuler/recipes-core/shadow/shadow.inc b/meta-openeuler/recipes-core/shadow/shadow.inc index 9ddb10bd900..75945a2e139 100644 --- a/meta-openeuler/recipes-core/shadow/shadow.inc +++ b/meta-openeuler/recipes-core/shadow/shadow.inc @@ -78,7 +78,8 @@ SRC_URI_EXTRA = "file://pam.d/chfn \ file://pam.d/login \ file://pam.d/newusers \ file://pam.d/passwd \ - file://pam.d/su" + file://pam.d/su \ + file://pam.d/groupmems" do_install() { oe_runmake DESTDIR="${D}" sbindir="${base_sbindir}" usbindir="${sbindir}" install -- Gitee From 4373ee3639e0a11946dcf1d9618d574d86bd006c Mon Sep 17 00:00:00 2001 From: zhuyan Date: Sat, 18 Sep 2021 10:48:48 +0800 Subject: [PATCH 024/304] fix compile error in opensuse Signed-off-by: zhuyan --- .../recipes-core/os-base/os-base_1.0.bb | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb index 7d49d791a86..fc2ecd64b1e 100644 --- a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb +++ b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb @@ -2,25 +2,26 @@ SUMMARY = "OS basic configuration files" DESCRIPTION = "base files" SECTION = "base" PR = "r1" -LICENSE = "MulanPSL-2.0" - +LICENSE = "CLOSED" +FILESPATH = "${THISDIR}/${BPN}/" +DL_DIR = "${THISDIR}/${BPN}/" LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE;md5=1acb172ffd3d252285dd1b8b8459941e" -SRC_URI = "file://${WORKDIR}/bashrc \ - file://${WORKDIR}/fstab \ - file://${WORKDIR}/group \ - file://${WORKDIR}/inittab \ - file://${WORKDIR}/issue \ - file://${WORKDIR}/issue.net \ - file://${WORKDIR}/LICENSE \ - file://${WORKDIR}/login.defs \ - file://${WORKDIR}/motd \ - file://${WORKDIR}/passwd \ - file://${WORKDIR}/profile \ - file://${WORKDIR}/securetty \ - file://${WORKDIR}/shadow \ - file://${WORKDIR}/sysctl.conf" +SRC_URI = "file://bashrc \ + file://fstab \ + file://group \ + file://inittab \ + file://issue \ + file://issue.net \ + file://LICENSE \ + file://login.defs \ + file://motd \ + file://passwd \ + file://profile \ + file://securetty \ + file://shadow \ + file://sysctl.conf" do_install() { install -d ${D}/etc @@ -41,3 +42,4 @@ do_install() { FILES_${PN} = "/" +INHIBIT_DEFAULT_DEPS = "1" -- Gitee From aea21bfc36d29981e71cd235a2af29d198b37777 Mon Sep 17 00:00:00 2001 From: dongxinhua Date: Tue, 26 Oct 2021 13:28:44 +0800 Subject: [PATCH 025/304] add recipe for clibcni Signed-off-by: dongxinhua --- .../recipes-core/clibcni/clibcni_2.0.4.bb | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 meta-openeuler/recipes-core/clibcni/clibcni_2.0.4.bb diff --git a/meta-openeuler/recipes-core/clibcni/clibcni_2.0.4.bb b/meta-openeuler/recipes-core/clibcni/clibcni_2.0.4.bb new file mode 100644 index 00000000000..1f747c41479 --- /dev/null +++ b/meta-openeuler/recipes-core/clibcni/clibcni_2.0.4.bb @@ -0,0 +1,42 @@ +DESCRIPTION = "Yet Another JSON Library - A Portable JSON parsing and serialization library in ANSI C" +LICENSE = "MIT" + +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://clibcni/v2.0.4.tar.gz \ + file://clibcni/0001-fix-CNI_ARGS-value-when-there-is-no-args.patch \ + file://clibcni/0002-add-error-info-for-failed-run-cni-plugin.patch \ + " + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" +S = "${WORKDIR}/${BPN}" + +inherit cmake +OECMAKE_GENERATOR = "Unix Makefiles" + +DEPENDS = "lcr" +INHIBIT_PACKAGE_DEBUG_SPLIT = "1" + + +FILES_${PN} += "${libdir}/libclibcni.so* " + +do_configure_prepend() { + grep -q CMAKE_SYSROOT ${WORKDIR}/toolchain.cmake || cat >> ${WORKDIR}/toolchain.cmake < Date: Tue, 26 Oct 2021 13:28:45 +0800 Subject: [PATCH 026/304] add recipe for curl Signed-off-by: dongxinhua --- .../recipes-core/curl/curl_7.77.0.bb | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 meta-openeuler/recipes-core/curl/curl_7.77.0.bb diff --git a/meta-openeuler/recipes-core/curl/curl_7.77.0.bb b/meta-openeuler/recipes-core/curl/curl_7.77.0.bb new file mode 100644 index 00000000000..2629ea9568e --- /dev/null +++ b/meta-openeuler/recipes-core/curl/curl_7.77.0.bb @@ -0,0 +1,87 @@ +SUMMARY = "Command line tool and library for client-side URL transfers" +HOMEPAGE = "http://curl.haxx.se/" +BUGTRACKER = "http://curl.haxx.se/mail/list.cgi?list=curl-tracker" +SECTION = "console/network" +LICENSE = "MIT" + + +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://curl/curl-7.77.0.tar.xz \ + file://curl/0101-curl-7.32.0-multilib.patch \ + file://curl/0102-curl-7.36.0-debug.patch \ + file://curl/0105-curl-7.63.0-lib1560-valgrind.patch \ + file://curl/0106-curl-fix-CVE-2019-15601.patch \ + file://curl/backport-CVE-2021-22925.patch \ + file://curl/backport-CVE-2021-22926.patch \ + " + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" +S = "${WORKDIR}/${BPN}-${PV}" + +CVE_PRODUCT = "curl libcurl" +inherit autotools + +# Because UI console is removed from vpp's libopenssl, arm64le-preempt-pro does not support OPENSSL UI. + +#PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'ipv6', d)} proxy ssl threaded-resolver verbose zlib" +PACKAGECONFIG_class-native = "ipv6 proxy ssl threaded-resolver verbose zlib" +PACKAGECONFIG_class-nativesdk = "ipv6 proxy ssl threaded-resolver verbose zlib" + +# 'ares' and 'threaded-resolver' are mutually exclusive +PACKAGECONFIG[ares] = "--enable-ares,--disable-ares,c-ares" +PACKAGECONFIG[brotli] = "--with-brotli,--without-brotli,brotli" +PACKAGECONFIG[builtinmanual] = "--enable-manual,--disable-manual" +PACKAGECONFIG[dict] = "--enable-dict,--disable-dict," +PACKAGECONFIG[gnutls] = "--with-gnutls,--without-gnutls,gnutls" +PACKAGECONFIG[gopher] = "--enable-gopher,--disable-gopher," +PACKAGECONFIG[imap] = "--enable-imap,--disable-imap," +PACKAGECONFIG[ipv6] = "--enable-ipv6,--disable-ipv6," +PACKAGECONFIG[krb5] = "--with-gssapi,--without-gssapi,krb5" +PACKAGECONFIG[ldap] = "--enable-ldap,--disable-ldap," +PACKAGECONFIG[ldaps] = "--enable-ldaps,--disable-ldaps," +PACKAGECONFIG[libidn] = "--with-libidn2,--without-libidn2,libidn2" +PACKAGECONFIG[libssh2] = "--with-libssh2,--without-libssh2,libssh2" +PACKAGECONFIG[mbedtls] = "--with-mbedtls=${STAGING_DIR_TARGET},--without-mbedtls,mbedtls" +PACKAGECONFIG[nghttp2] = "--with-nghttp2,--without-nghttp2,nghttp2" +PACKAGECONFIG[pop3] = "--enable-pop3,--disable-pop3," +PACKAGECONFIG[proxy] = "--enable-proxy,--disable-proxy," +PACKAGECONFIG[rtmpdump] = "--with-librtmp,--without-librtmp,rtmpdump" +PACKAGECONFIG[rtsp] = "--enable-rtsp,--disable-rtsp," +PACKAGECONFIG[smb] = "--enable-smb,--disable-smb," +PACKAGECONFIG[smtp] = "--enable-smtp,--disable-smtp," +PACKAGECONFIG[ssl] = "--with-ssl --with-random=/dev/urandom,--without-ssl,openssl" +PACKAGECONFIG[nss] = "--with-nss,--without-nss,nss" +PACKAGECONFIG[telnet] = "--enable-telnet,--disable-telnet," +PACKAGECONFIG[tftp] = "--enable-tftp,--disable-tftp," +PACKAGECONFIG[threaded-resolver] = "--enable-threaded-resolver,--disable-threaded-resolver" +PACKAGECONFIG[verbose] = "--enable-verbose,--disable-verbose" +PACKAGECONFIG[zlib] = "--with-zlib=${STAGING_LIBDIR}/../,--without-zlib,zlib" + +EXTRA_OECONF = " \ + --disable-libcurl-option \ + --disable-ntlm-wb \ + --enable-crypto-auth \ + --without-libpsl \ +" + +do_install_append_class-target() { + # cleanup buildpaths from curl-config + sed -i \ + -e 's,--sysroot=${STAGING_DIR_TARGET},,g' \ + -e 's,--with-libtool-sysroot=${STAGING_DIR_TARGET},,g' \ + -e 's|${DEBUG_PREFIX_MAP}||g' \ + ${D}${bindir}/curl-config +} + +PACKAGES =+ "lib${BPN}" + +FILES_lib${BPN} = "${libdir}/lib*.so.*" + +FILES_${PN} += "${datadir}/zsh" + +#inherit multilib_script +#MULTILIB_SCRIPTS = "${PN}-dev:${bindir}/curl-config" + +BBCLASSEXTEND = "native nativesdk" -- Gitee From 3951ffc3bff40aabb1ab4a131242d5ec31caf561 Mon Sep 17 00:00:00 2001 From: dongxinhua Date: Tue, 26 Oct 2021 13:28:46 +0800 Subject: [PATCH 027/304] add recipe for libcap Signed-off-by: dongxinhua --- .../recipes-core/libcap/libcap_2.32.bb | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 meta-openeuler/recipes-core/libcap/libcap_2.32.bb diff --git a/meta-openeuler/recipes-core/libcap/libcap_2.32.bb b/meta-openeuler/recipes-core/libcap/libcap_2.32.bb new file mode 100644 index 00000000000..8571b725d0a --- /dev/null +++ b/meta-openeuler/recipes-core/libcap/libcap_2.32.bb @@ -0,0 +1,85 @@ +#require libcap.inc +#require ${OPEN_SRC_DIR}/${BPN}/series_yocto.conf +SUMMARY = "Library for getting/setting POSIX.1e capabilities" +HOMEPAGE = "http://sites.google.com/site/fullycapable/" + +# no specific GPL version required +LICENSE = "BSD | GPLv2" + +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://libcap/libcap-2.32.tar.gz \ + file://libcap/libcap-buildflags.patch \ + file://libcap/Avoid-segfaulting-when-the-kernel-is-ahead-of-libcap.patch \ + " + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" +S = "${WORKDIR}/${BPN}-${PV}" + +DEPENDS = "hostperl-runtime-native gperf-native" + + +inherit lib_package + +# do NOT pass target cflags to host compilations +# +do_configure() { + # libcap uses := for compilers, fortunately, it gives us a hint + # on what should be replaced with ?= + sed -e 's,:=,?=,g' -i Make.Rules + sed -e 's,^BUILD_CFLAGS ?= $(.*CFLAGS),BUILD_CFLAGS := $(BUILD_CFLAGS),' -i Make.Rules +} + +PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'pam', d)}" +PACKAGECONFIG_class-native ??= "" + +PACKAGECONFIG[pam] = "PAM_CAP=yes,PAM_CAP=no,libpam" + + +EXTRA_OEMAKE = " \ + INDENT= \ + lib='${baselib}' \ + RAISE_SETFCAP=no \ + DYNAMIC=yes \ + BUILD_GPERF=yes \ +" +INSANE_SKIP += "installed-vs-shipped" + +#EXTRA_OEMAKE_append_class-target = " SYSTEM_HEADERS=${STAGING_INCDIR}" + +# these are present in the libcap defaults, so include in our CFLAGS too +CFLAGS += "-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64" + +do_compile() { + oe_runmake ${PACKAGECONFIG_CONFARGS} +} + +do_install() { + rm ${D}${libdir}/security/pam_cap.so -rf + oe_runmake install \ + ${PACKAGECONFIG_CONFARGS} \ + DESTDIR="${D}" \ + prefix="${prefix}" \ + SBINDIR="${sbindir}" +} + +do_install_append() { + # Move the library to base_libdir + install -d ${D}${base_libdir} + if [ ! ${D}${libdir} -ef ${D}${base_libdir} ]; then + mv ${D}${libdir}/libcap* ${D}${base_libdir} + if [ -d ${D}${libdir}/security ]; then + mv ${D}${libdir}/security ${D}${base_libdir} + fi + fi + rm ${D}${base_libdir}/security -rf +} + +#FILES_${PN}-dev += "${base_libdir}/*.so" + +# pam files +FILES_${PN} += "/lib/security/*.so" + +BBCLASSEXTEND = "native nativesdk" + -- Gitee From 95bec3c92636798866a27f7a185e6f4ce483c9d8 Mon Sep 17 00:00:00 2001 From: dongxinhua Date: Tue, 26 Oct 2021 13:28:47 +0800 Subject: [PATCH 028/304] add recipe for libseccomp Signed-off-by: dongxinhua --- .../libseccomp/libseccomp_2.5.1.bb | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.1.bb diff --git a/meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.1.bb b/meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.1.bb new file mode 100644 index 00000000000..6b14fd0a90c --- /dev/null +++ b/meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.1.bb @@ -0,0 +1,23 @@ +SUMMARY = "interface to seccomp filtering mechanism" +DESCRIPTION = "The libseccomp library provides and easy to use, platform independent,interface to the Linux Kernel's syscall filtering mechanism: seccomp." +SECTION = "security" +HOMEPAGE = "https://github.com/seccomp/libseccomp" +BUGTRACKER = "https://github.com/seccomp/libseccomp/issues" +LICENSE = "LGPL-2.1" + +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://libseccomp/libseccomp-2.5.1.tar.gz" + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" + +S = "${WORKDIR}/${BPN}-${PV}" + +inherit autotools + +FILES_${PN} = "${bindir} ${libdir}/${BPN}.so*" + +do_compile_prepend() { + cp ${B}/include/seccomp.h ${S}/include +} -- Gitee From 5262e2ae11e65d3cec4842fbde3e385881b862a6 Mon Sep 17 00:00:00 2001 From: dongxinhua Date: Tue, 26 Oct 2021 13:28:48 +0800 Subject: [PATCH 029/304] add recipe for yajl Signed-off-by: dongxinhua --- .../recipes-core/yajl/yajl_2.1.0.bb | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb diff --git a/meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb b/meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb new file mode 100644 index 00000000000..f51f9003fad --- /dev/null +++ b/meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb @@ -0,0 +1,32 @@ +DESCRIPTION = "Yet Another JSON Library - A Portable JSON parsing and serialization library in ANSI C" +LICENSE = "MIT" + +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://yajl/2.1.0.tar.gz \ + file://yajl/yajl-2.1.0-pkgconfig-location.patch \ + file://yajl/yajl-2.1.0-pkgconfig-includedir.patch \ + file://yajl/yajl-2.1.0-test-location.patch \ + file://yajl/yajl-2.1.0-dynlink-binaries.patch \ + file://yajl/yajl-2.1.0-fix-memory-leak.patch \ + " + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" +S = "${WORKDIR}/${BPN}-${PV}" + +inherit cmake + +INHIBIT_PACKAGE_DEBUG_SPLIT = "1" + +FILES_${PN} += "${libdir}/libyajl.so* " + +do_install_append() { + [[ "${libdir}" != "/usr/lib" ]] || return 0 + if test -d ${D}/usr/lib; then + mv ${D}/usr/lib ${D}/${libdir} + fi + + ${STRIP} ${D}/${libdir}/*.so* +} + -- Gitee From 64edd2bcc0bcfdfbc3bb496befa51adb234f4a20 Mon Sep 17 00:00:00 2001 From: dongxinhua Date: Tue, 26 Oct 2021 13:28:49 +0800 Subject: [PATCH 030/304] add recipe for lxc Signed-off-by: dongxinhua --- meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb | 50 ++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb diff --git a/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb b/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb new file mode 100644 index 00000000000..b7eda6378d7 --- /dev/null +++ b/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb @@ -0,0 +1,50 @@ +SUMMARY = "Protocol Buffers - structured data serialisation mechanism" +DESCRIPTION = "Yet Another JSON Library - A Portable JSON parsing and serialization library in ANSI C" +SECTION = "console/tools" +LICENSE = "BSD-2-Clause" + +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://lxc/lxc-4.0.3.tar.gz \ + file://lxc/0001-huawei-adapt-to-huawei-4.0.3.patch \ + file://lxc/0002-add-mount-label-for-rootfs.patch \ + file://lxc/0003-format-code-and-verify-mount-mode.patch \ + file://lxc/0004-Removes-the-definition-of-the-thread-attributes-obje.patch \ + file://lxc/0005-solve-coredump-bug-caused-by-fstype-being-NULL-durin.patch \ + file://lxc/0006-SIGTERM-do-not-catch-signal-SIGTERM-in-lxc-monitor.patch \ + file://lxc/0007-Using-string-type-instead-of-security_context_t-beca.patch \ + file://lxc/0008-hook-pass-correct-mount-dir-as-root-to-hook.patch \ + file://lxc/0009-cgroup-refact-cgroup-manager-to-single-file.patch \ + file://lxc/0010-cgfsng-adjust-log-level-from-error-to-warn.patch \ + file://lxc/0011-rootfs-add-make-private-for-root.path-parent.patch \ + file://lxc/0012-mount-make-possible-to-bind-mount-proc-and-sys-fs.patch \ + file://lxc/0013-use-path-based-unix-domain-sockets-instead-of-abstra.patch \ + file://lxc/0014-api-add-get-container-metrics-api.patch \ + file://lxc/0015-Streaming-IO-solution-optimization-and-enhancement.patch \ + file://lxc/0016-avoid-using-void-pointers-in-caclulation.patch \ + file://lxc/0017-fix-compilation-errors-without-libcap.patch \ + file://lxc/0018-IO-fix-io-data-miss-when-exec-with-pipes.patch \ + file://lxc/0019-metrics-add-total_inactive_file-metric-for-memory.patch \ + file://lxc/0020-support-cgroup-v2.patch \ + file://lxc/0021-support-isula-exec-workdir.patch \ + file://lxc/0022-print-error-message-if-process-workdir-failed.patch \ + file://lxc/0023-log-support-long-syslog-tag.patch \ + file://lxc/0024-log-adjust-log-level-from-error-to-warn.patch \ + file://lxc/0025-get-cgroup-data-len-first-and-malloc-read-buff-by-le.patch \ + file://lxc/0026-coredump-fix-coredump-when-cgroup-get-return-error.patch \ + " + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" + +DEPENDS = "yajl libseccomp libcap" + +S = "${WORKDIR}/${BPN}-${PV}" + +EXTRA_OECONF = "--disable-static --disable-openssl --with-rootfs-path=/var/lib/lxc/rootfs --with-distro=openeuler" + +inherit autotools + +BBCLASSEXTEND = "native nativesdk" + + -- Gitee From 6ba2acbfac292da69abd7549b83921b3129f5c5a Mon Sep 17 00:00:00 2001 From: dongxinhua Date: Tue, 26 Oct 2021 13:28:50 +0800 Subject: [PATCH 031/304] add recipe for lcr Signed-off-by: dongxinhua --- meta-openeuler/recipes-core/lcr/lcr_2.0.5.bb | 69 ++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 meta-openeuler/recipes-core/lcr/lcr_2.0.5.bb diff --git a/meta-openeuler/recipes-core/lcr/lcr_2.0.5.bb b/meta-openeuler/recipes-core/lcr/lcr_2.0.5.bb new file mode 100644 index 00000000000..6a504655cd5 --- /dev/null +++ b/meta-openeuler/recipes-core/lcr/lcr_2.0.5.bb @@ -0,0 +1,69 @@ +DESCRIPTION = "Yet Another JSON Library - A Portable JSON parsing and serialization library in ANSI C" +LICENSE = "MIT" + +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://lcr/v2.0.5.tar.gz \ + file://lcr/0001-support-quiet-of-log-config.patch \ + file://lcr/0002-lcr-add-inactive-file-total-metric.patch \ + file://lcr/0003-lcr-add-default-runtime-field-for-isula-info.patch \ + file://lcr/0004-support-isula-exec-workdir.patch \ + file://lcr/0005-add-secure-compile-options.patch \ + file://lcr/0006-remove-invalid-fuzz-option.patch \ + file://lcr/0007-support-cgroup-v2.patch \ + file://lcr/0008-fix-pause-container-error.patch \ + file://lcr/0009-Fix-spelling-errors.patch \ + file://lcr/0010-fix-memory-usage-of-stats-not-right-when-runtime-is-.patch \ + file://lcr/0011-support-auto-resize-of-isulad-shim.patch \ + " + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" +S = "${WORKDIR}/${BPN}" + +inherit cmake + +OECMAKE_GENERATOR = "Unix Makefiles" + +#OECMAKE_C_COMPILER += "${OECMAKE_C_FLAGS}" +#OECMAKE_CXX_COMPILER += "${OECMAKE_CXX_FLAGS}" + +DEPENDS = "yajl lxc" + +INHIBIT_PACKAGE_DEBUG_SPLIT = "1" + +FILES_${PN} += "/usr/local/lib/* " +FILES_${PN}-dev = "/usr/local/*" +do_compile() { + cd ${S} + rm -rf build + mkdir build + cd build + cmake --prefix=/usr/ .. + make +} + +do_install() { + cd ${S}/build/ + oe_runmake install DESTDIR="${D}" \ + prefix="${prefix}" \ + SBINDIR="${sbindir}" +} +do_install_append() { + [[ "${libdir}" != "/usr/local/lib" ]] || return 0 + if test -d ${D}/usr/local/lib; then + mv ${D}/usr/local/lib ${D}/${libdir} + fi + if test -d ${D}/usr/local/include ; then + mv ${D}/usr/local/include ${D}/${includedir} + fi + rm -rf ${D}/usr/local +} + +do_package() { +: +} +do_package_write_rpm() { +: +} + -- Gitee From 9c540475f7348015730fc88aaf63f5670c900257 Mon Sep 17 00:00:00 2001 From: dongxinhua Date: Tue, 26 Oct 2021 13:28:51 +0800 Subject: [PATCH 032/304] add recipe for http-parser Signed-off-by: dongxinhua --- .../http-parser/http-parser_2.9.4.bb | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 meta-openeuler/recipes-core/http-parser/http-parser_2.9.4.bb diff --git a/meta-openeuler/recipes-core/http-parser/http-parser_2.9.4.bb b/meta-openeuler/recipes-core/http-parser/http-parser_2.9.4.bb new file mode 100644 index 00000000000..7e8baf17e6f --- /dev/null +++ b/meta-openeuler/recipes-core/http-parser/http-parser_2.9.4.bb @@ -0,0 +1,53 @@ +SUMMARY = "Protocol Buffers - structured data serialisation mechanism" +DESCRIPTION = "Yet Another JSON Library - A Portable JSON parsing and serialization library in ANSI C" +SECTION = "console/tools" +LICENSE = "BSD-2-Clause" + +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://http-parser/http-parser-2.9.4.tar.gz" + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" +S = "${WORKDIR}/${BPN}-${PV}" + +INHIBIT_PACKAGE_DEBUG_SPLIT = "1" + +DEPENDS = "" +#CFLAGS_remove = "-D_FORTIFY_SOURCE=2" +#CPPFLAGS_remove = "-D_FORTIFY_SOURCE=2" +#CXXPFLAGS_remove = "-D_FORTIFY_SOURCE=2" + + +inherit autotools pkgconfig + +PACKAGES = "${PN}-dev ${PN}" +FILES_${PN}-dev = "${includedir}/*" +FILES_${PN} += "${libdir}/*" + +do_package_qa() { + : +} + +do_compile() { + make library +} + +do_install_append () { + [[ "${libdir}" != "/usr/local/lib" ]] || return 0 + if test -d ${D}/usr/local/lib ; then + cd ${D}/usr/local/lib + ln -sf libhttp_parser.so.${PV} libhttp_parser.so + cd - + mv ${D}/usr/local/lib ${D}/${libdir} + fi + if test -d ${D}/usr/local/include ; then + mv ${D}/usr/local/include ${D}/${includedir} + fi + rm -rf ${D}/usr/local +} + +BBCLASSEXTEND = "native nativesdk" +B = "${S}" + + -- Gitee From d7e420ddb6f6baf56280e3dca42da1a1c8278244 Mon Sep 17 00:00:00 2001 From: dongxinhua Date: Tue, 26 Oct 2021 13:28:52 +0800 Subject: [PATCH 033/304] add recipe for libarchive Signed-off-by: dongxinhua --- .../libarchive/libarchive_3.5.1.bb | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb diff --git a/meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb b/meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb new file mode 100644 index 00000000000..e059979362d --- /dev/null +++ b/meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb @@ -0,0 +1,28 @@ +DESCRIPTION = "Yet Another JSON Library - A Portable JSON parsing and serialization library in ANSI C" +LICENSE = "MIT" + +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://libarchive/libarchive-3.5.1.tar.gz \ + file://libarchive/libarchive-uninitialized-value.patch \ + " + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" +S = "${WORKDIR}/${BPN}-${PV}" + +inherit cmake + +INHIBIT_PACKAGE_DEBUG_SPLIT = "1" + +FILES_${PN} += "${libdir}/libarchive.so* " + +do_install_append() { + [[ "${libdir}" != "/usr/lib" ]] || return 0 + if test -d ${D}/usr/lib; then + mv ${D}/usr/lib ${D}/${libdir} + fi + + ${STRIP} ${D}/${libdir}/*.so* +} + -- Gitee From 6790419aa676180882bc8769495aaafb5b7917de Mon Sep 17 00:00:00 2001 From: dongxinhua Date: Tue, 26 Oct 2021 13:28:53 +0800 Subject: [PATCH 034/304] add recipe for libevent Signed-off-by: dongxinhua --- .../recipes-core/libevent/libevent_2.1.12.bb | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 meta-openeuler/recipes-core/libevent/libevent_2.1.12.bb diff --git a/meta-openeuler/recipes-core/libevent/libevent_2.1.12.bb b/meta-openeuler/recipes-core/libevent/libevent_2.1.12.bb new file mode 100644 index 00000000000..21f757085ea --- /dev/null +++ b/meta-openeuler/recipes-core/libevent/libevent_2.1.12.bb @@ -0,0 +1,40 @@ +SUMMARY = "An asynchronous event notification library" +HOMEPAGE = "http://libevent.org/" +BUGTRACKER = "https://github.com/libevent/libevent/issues" +SECTION = "libs" + +LICENSE = "BSD & MIT" + +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://libevent/libevent-2.1.12-stable.tar.gz \ + file://libevent/libevent-nonettests.patch \ + file://libevent/http-add-callback-to-allow-server-to-decline-and-the.patch \ + " + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" + +UPSTREAM_CHECK_URI = "http://libevent.org/" + +S = "${WORKDIR}/${BPN}-${PV}-stable" + + +DEPENDS = "zlib" + +BBCLASSEXTEND = "native nativesdk" + +do_configure() { + pushd ${S} + sh autogen.sh + ./configure --host=${HOST_SYS} --disable-openssl --prefix=/usr/ + popd +} + +do_install() { + oe_runmake DESTDIR=${D} install +} + +do_package_qa() { + : +} -- Gitee From cfa28669afcb4007e9f98eebd1591bdc248855da Mon Sep 17 00:00:00 2001 From: dongxinhua Date: Tue, 26 Oct 2021 13:28:54 +0800 Subject: [PATCH 035/304] add recipe for libevhtp Signed-off-by: dongxinhua --- .../recipes-core/libevhtp/libevhtp_1.2.18.bb | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 meta-openeuler/recipes-core/libevhtp/libevhtp_1.2.18.bb diff --git a/meta-openeuler/recipes-core/libevhtp/libevhtp_1.2.18.bb b/meta-openeuler/recipes-core/libevhtp/libevhtp_1.2.18.bb new file mode 100644 index 00000000000..fadb6177fbd --- /dev/null +++ b/meta-openeuler/recipes-core/libevhtp/libevhtp_1.2.18.bb @@ -0,0 +1,41 @@ +SUMMARY = "libevhtp -- Create extremely-fast and secure embedded HTTP servers with ease." +DESCRIPTION = "libevhtp -- Create extremely-fast and secure embedded HTTP servers with ease." +SECTION = "console/tools" +LICENSE = "BSD-3-Clause" + +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://libevhtp/1.2.18.tar.gz \ + file://libevhtp/0001-decrease-numbers-of-fd-for-shared-pipe-mode.patch \ + file://libevhtp/0002-evhtp-enable-dynamic-thread-pool.patch \ + file://libevhtp/0003-close-open-ssl.-we-do-NOT-use-it-in-lcrd.patch \ + file://libevhtp/0004-Use-shared-library-instead-static-one.patch \ + file://libevhtp/0005-libevhtp-add-securce-compile-options.patch \ + " + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" +S = "${WORKDIR}/${BPN}-${PV}" + +DEPENDS = "libevent" + +EXTRA_OECMAKE = "-DEVHTP_BUILD_SHARED=on -DEVHTP_DISABLE_SSL=on " + +inherit cmake + +FILES_${PN}-dev = "${includedir}/* ${libdir}/pkgconfig/*" +#FILES_${PN}-compiler = "${bindir}" +FILES_${PN} = "${libdir}/*" + +do_package_qa() { + : +} + +do_install_append () { + [[ "${libdir}" != "/usr/lib" ]] || return 0 + if test -d ${D}/usr/lib ; then + mv ${D}/usr/lib ${D}/${libdir} + fi +} + +BBCLASSEXTEND = "native nativesdk" -- Gitee From bc06433419fd23339e5b57841840dbf4644ed026 Mon Sep 17 00:00:00 2001 From: dongxinhua Date: Tue, 26 Oct 2021 13:28:55 +0800 Subject: [PATCH 036/304] add recipe for libwebsockets Signed-off-by: dongxinhua --- .../libwebsockets/libwebsockets_4.0.20.bb | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb diff --git a/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb b/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb new file mode 100644 index 00000000000..891d15b71cb --- /dev/null +++ b/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb @@ -0,0 +1,41 @@ +DESCRIPTION = "Yet Another JSON Library - A Portable JSON parsing and serialization library in ANSI C" +LICENSE = "MIT" + +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://libwebsockets/libwebsockets-4.0.20.tar.gz" + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" +S = "${WORKDIR}/${BPN}-${PV}" + +inherit cmake + +DEPENDS = "zlib openssl" + +EXTRA_OECMAKE = "-D LWS_WITH_HTTP2=ON -D LWS_IPV6=ON -D LWS_WITH_ZIP_FOPS=ON -D LWS_WITH_SOCKS5=ON -D LWS_WITH_RANGES=ON -D LWS_WITH_ACME=ON \ + -D LWS_WITH_LIBUV=OFF -D LWS_WITH_LIBEV=OFF -D LWS_WITH_LIBEVENT=OFF -D LWS_WITH_FTS=ON -D LWS_WITH_THREADPOOL=ON -D LWS_UNIX_SOCK=ON \ + -D LWS_WITH_HTTP_PROXY=ON -D LWS_WITH_DISKCACHE=ON -D LWS_WITH_LWSAC=ON -D LWS_LINK_TESTAPPS_DYNAMIC=ON -D LWS_WITHOUT_BUILTIN_GETIFADDRS=ON -D LWS_USE_BUNDLED_ZLIB=OFF \ + -D LWS_WITHOUT_BUILTIN_SHA1=ON \ + -D LWS_WITH_STATIC=OFF \ + -D LWS_WITHOUT_CLIENT=OFF \ + -D LWS_WITHOUT_SERVER=OFF \ + -D LWS_WITHOUT_TESTAPPS=OFF \ + -D LWS_WITHOUT_TEST_SERVER=ON \ + -D LWS_WITHOUT_TEST_SERVER_EXTPOLL=ON \ + -D LWS_WITHOUT_TEST_PING=ON \ + -D LWS_WITHOUT_TEST_CLIENT=ON \ + " + +INHIBIT_PACKAGE_DEBUG_SPLIT = "1" + +FILES_${PN} += "${libdir}/*" + +do_install_append() { + rm -rf ${D}/usr/share + [[ "${libdir}" != "/usr/lib" ]] || return 0 + if test -d ${D}/usr/lib; then + mv ${D}/usr/lib ${D}/${libdir} + fi + ${STRIP} ${D}/${libdir}/*.so* +} -- Gitee From 47a149f328629c0bb6bac1c5b8cb6ea3bf313c1b Mon Sep 17 00:00:00 2001 From: dongxinhua Date: Tue, 26 Oct 2021 13:28:56 +0800 Subject: [PATCH 037/304] add recipe for iSulad Signed-off-by: dongxinhua --- .../recipes-core/iSulad/iSulad_2.0.9.bb | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb diff --git a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb new file mode 100644 index 00000000000..20906d57d88 --- /dev/null +++ b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb @@ -0,0 +1,48 @@ +DESCRIPTION = "Yet Another JSON Library - A Portable JSON parsing and serialization library in ANSI C" +LICENSE = "MIT" + +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://iSulad/v2.0.9.tar.gz" + +FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" +DL_DIR = "${LOCAL_FILES}" +S = "${WORKDIR}/${BPN}" + +inherit cmake +OECMAKE_GENERATOR = "Unix Makefiles" + +DEPENDS = "yajl zlib libarchive http-parser curl lcr libevent libevhtp openssl libwebsockets" + +EXTRA_OECMAKE = "-DENABLE_GRPC=OFF -DENABLE_SYSTEMD_NOTIFY=OFF -DENABLE_SELINUX=OFF \ + -DENABLE_SHIM_V2=OFF -DENABLE_OPENSSL_VERIFY=OFF \ + -DGRPC_CONNECTOR=OFF -DDISABLE_OCI=ON \ + " + +INHIBIT_PACKAGE_DEBUG_SPLIT = "1" + +FILES_${PN} += "${libdir}/* " + +do_configure_prepend() { + grep -q CMAKE_SYSROOT ${WORKDIR}/toolchain.cmake || cat >> ${WORKDIR}/toolchain.cmake < Date: Wed, 27 Oct 2021 06:15:48 +0800 Subject: [PATCH 038/304] add some path about iSulad for close selinux and setlocal Signed-off-by: dongxinhua --- .../iSulad/iSulad/delete_call_setlocale.patch | 26 +++++++++++ ...sable_selinux_not_selinux_label_file.patch | 45 +++++++++++++++++++ .../recipes-core/iSulad/iSulad_2.0.9.bb | 5 ++- 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 meta-openeuler/recipes-core/iSulad/iSulad/delete_call_setlocale.patch create mode 100644 meta-openeuler/recipes-core/iSulad/iSulad/fix_bug_disable_selinux_not_selinux_label_file.patch diff --git a/meta-openeuler/recipes-core/iSulad/iSulad/delete_call_setlocale.patch b/meta-openeuler/recipes-core/iSulad/iSulad/delete_call_setlocale.patch new file mode 100644 index 00000000000..016d66b8529 --- /dev/null +++ b/meta-openeuler/recipes-core/iSulad/iSulad/delete_call_setlocale.patch @@ -0,0 +1,26 @@ +diff --git a/src/cmd/isula/main.c b/src/cmd/isula/main.c +index a69df5d..476750a 100644 +--- a/src/cmd/isula/main.c ++++ b/src/cmd/isula/main.c +@@ -206,7 +206,7 @@ struct command g_commands[] = { + static int set_locale() + { + int ret = 0; +- ++ return ret; + /* Change from the standard (C) to en_US.UTF-8 locale, so libarchive can handle filename conversions.*/ + if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL) { + fprintf(stderr, "Could not set locale to en_US.UTF-8:%s", strerror(errno)); +diff --git a/src/cmd/isulad/main.c b/src/cmd/isulad/main.c +index 47bd6e2..fa5e6f7 100644 +--- a/src/cmd/isulad/main.c ++++ b/src/cmd/isulad/main.c +@@ -1446,7 +1446,7 @@ out: + static int set_locale() + { + int ret = 0; +- ++ return ret; + /* Change from the standard (C) to en_US.UTF-8 locale, so libarchive can handle filename conversions.*/ + if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL) { + COMMAND_ERROR("Could not set locale to en_US.UTF-8:%s", strerror(errno)); diff --git a/meta-openeuler/recipes-core/iSulad/iSulad/fix_bug_disable_selinux_not_selinux_label_file.patch b/meta-openeuler/recipes-core/iSulad/iSulad/fix_bug_disable_selinux_not_selinux_label_file.patch new file mode 100644 index 00000000000..59b601fcb09 --- /dev/null +++ b/meta-openeuler/recipes-core/iSulad/iSulad/fix_bug_disable_selinux_not_selinux_label_file.patch @@ -0,0 +1,45 @@ +commit f05e1aaea1ac77f6294afe993197609aaf725c52 +Author: dongxinhua +Date: Fri Sep 17 20:21:09 2021 +0800 + + fix bug when disable selinux,should not contain selinux_label.c file + + Signed-off-by: dongxinhua + +diff --git a/src/daemon/modules/image/CMakeLists.txt b/src/daemon/modules/image/CMakeLists.txt +index 00a096e..d24a4e8 100644 +--- a/src/daemon/modules/image/CMakeLists.txt ++++ b/src/daemon/modules/image/CMakeLists.txt +@@ -45,7 +45,7 @@ set(IMAGE_INCS + # set sources and headers for libisulad_img + set(LIB_ISULAD_IMG libisulad_img) + +-add_library(${LIB_ISULAD_IMG} ${LIBTYPE} ++set(ISULAD_IMG_SRCS + ${local_image_srcs} + ${CMAKE_SOURCE_DIR}/src/utils/cutils/utils.c + ${CMAKE_SOURCE_DIR}/src/utils/cutils/utils_regex.c +@@ -66,13 +66,22 @@ add_library(${LIB_ISULAD_IMG} ${LIBTYPE} + ${CMAKE_SOURCE_DIR}/src/utils/sha256/sha256.c + ${CMAKE_SOURCE_DIR}/src/utils/buffer/buffer.c + ${CMAKE_SOURCE_DIR}/src/daemon/common/err_msg.c +- ${CMAKE_SOURCE_DIR}/src/daemon/common/selinux_label.c + ${CMAKE_SOURCE_DIR}/src/daemon/common/sysinfo.c + ${CMAKE_SOURCE_DIR}/src/utils/tar/isulad_tar.c + ${CMAKE_SOURCE_DIR}/src/utils/tar/util_archive.c + ${CMAKE_SOURCE_DIR}/src/utils/tar/util_gzip.c + ) + ++if (ENABLE_SELINUX) ++ list(APPEND ISULAD_IMG_SRCS ++ ${CMAKE_SOURCE_DIR}/src/daemon/common/selinux_label.c ++ ) ++endif() ++ ++add_library(${LIB_ISULAD_IMG} ${LIBTYPE} ++ ${ISULAD_IMG_SRCS} ++ ) ++ + target_include_directories(${LIB_ISULAD_IMG} PUBLIC + ${local_image_incs} + ${CMAKE_SOURCE_DIR}/src/daemon/modules/api diff --git a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb index 20906d57d88..1cc15310e9c 100644 --- a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb +++ b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb @@ -3,7 +3,10 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" -SRC_URI = "file://iSulad/v2.0.9.tar.gz" +SRC_URI = "file://iSulad/v2.0.9.tar.gz \ + file://fix_bug_disable_selinux_not_selinux_label_file.patch \ + file://delete_call_setlocale.patch \ + " FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" DL_DIR = "${LOCAL_FILES}" -- Gitee From df8eabbeafd2427baf0002af010529ace4d82484 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Wed, 27 Oct 2021 09:02:49 +0800 Subject: [PATCH 039/304] add init scripts Signed-off-by: zhuyan --- .../recipes-core/os-base/os-base/rc.functions | 59 ++++++++++++++ .../recipes-core/os-base/os-base/rc.sysinit | 76 +++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 meta-openeuler/recipes-core/os-base/os-base/rc.functions create mode 100644 meta-openeuler/recipes-core/os-base/os-base/rc.sysinit diff --git a/meta-openeuler/recipes-core/os-base/os-base/rc.functions b/meta-openeuler/recipes-core/os-base/os-base/rc.functions new file mode 100644 index 00000000000..feb1bddb48e --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/rc.functions @@ -0,0 +1,59 @@ +# Functions used by init scripts + +title() +{ + echo -en "\033[1m" + echo -en $@ + echo -e "\033[0m" +} + + +broadcastmessage() +{ + for ttys in `who | awk '{print $2}'`; + do + echo $1 > /dev/$ttys + done +} + +mount_a() +{ + FSTAB="/etc/fstab" + TMPDIR="/tmp/var-$RANDOM" + TMPFILE="/tmp/tmp-faillog-$RANDOM" + + mount -t tmpfs tmpfs /tmp + touch ${TMPFILE} + while read line + do + +IFS=" " read device mountdir fstype options dump fsck<< EOF +$line +EOF + if [ "$mountdir" == "/tmp" ] || [ "$mountdir" == "/tmp/" ] ;then + mount $mountdir -o remount,$options + elif [ "$fstype" == "proc" ] || [ "$fstype" == "sysfs" ] ;then + umount $mountdir 2>${TMPFILE} + mount -t $fstype $device $mountdir -o $options + else + if [ -d "$mountdir" ] + then + mkdir ${TMPDIR} + # Copy the contents instead of moving, since this would be done on every boot. + cp -rf $mountdir/. ${TMPDIR}/ 2> ${TMPFILE} + mount -t $fstype $device $mountdir -o $options + cp -rf ${TMPDIR}/. $mountdir 2> ${TMPFILE} + rm -rf ${TMPDIR} 2> ${TMPFILE} + + else + mkdir -p $mountdir + mount -t $fstype $device $mountdir -o $options + fi + fi + done < ${FSTAB} + + rm -f ${TMPFILE} + + [ ! -d /dev/pts ] && mkdir /dev/pts + [ ! -d /dev/pts ] && mkdir /dev/shm +} diff --git a/meta-openeuler/recipes-core/os-base/os-base/rc.sysinit b/meta-openeuler/recipes-core/os-base/os-base/rc.sysinit new file mode 100644 index 00000000000..f26513ddd7f --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/rc.sysinit @@ -0,0 +1,76 @@ +#! /bin/sh + +PATH=/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin + +function fs_mount() +{ + echo "mount file system" + mount_a +} + +function loading_module() +{ + echo "Loading the kernel modules: " + cat /etc/modules | sed -e '/^[ \t]*$/d' | + while read module + do + echo "Loading module: $module" + modprobe $module + done +} + +. /etc/rc.d/rc.functions + +# mount file system + fs_mount + +# load kernel modules + loading_module + +#creating a soft link for /dev/fd to /proc/self/fd + ln -s /proc/self/fd /dev/fd + +# creating device driver instances + echo "Making device instances:" + echo /sbin/mdev > /proc/sys/kernel/hotplug + mdev -s + +# setting up initial hostname + echo "Setting hostname: " + hostname -F /etc/hostname + +# Cleaning up the Directory tmp + echo "Cleaning up tmp :" + rm -rf /tmp/* >/dev/null + +#touch /var/log/wtmp to record user login history + touch /var/log/wtmp + +# setting up the sysctl confgiruaton options + echo "Setting up the sysctl configurations:" + sysctl -p /etc/sysctl.conf > /dev/null + +# setting up localhost loopback interface + echo "Setting up interface lo: " + ifconfig lo up 127.0.0.1 + +# running local startup scripts + echo "Running local startup scripts." + for i in `ls /etc/rc.d/rc.start/* 2>/dev/null` ; do + if [ -x $i ]; then + $i start + fi + done + +#print uptime after finish running rc.start + if [ -r /proc/uptime ] + then + echo -n "System booting cost:" + cat /proc/uptime + fi + +# calling user defined scripts if any + if [ -x /etc/rc.d/rc.local ]; then + /etc/rc.d/rc.local + fi + -- Gitee From 1bcb9650ddb77fafd889a928abaf995735f07c33 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Sat, 18 Sep 2021 15:26:04 +0800 Subject: [PATCH 040/304] add recipe for lcr Signed-off-by: zhuyan --- meta-openeuler/recipes-core/lcr/lcr_2.0.5.bb | 27 ++++++-------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/meta-openeuler/recipes-core/lcr/lcr_2.0.5.bb b/meta-openeuler/recipes-core/lcr/lcr_2.0.5.bb index 6a504655cd5..8e16d95504e 100644 --- a/meta-openeuler/recipes-core/lcr/lcr_2.0.5.bb +++ b/meta-openeuler/recipes-core/lcr/lcr_2.0.5.bb @@ -25,30 +25,19 @@ inherit cmake OECMAKE_GENERATOR = "Unix Makefiles" -#OECMAKE_C_COMPILER += "${OECMAKE_C_FLAGS}" -#OECMAKE_CXX_COMPILER += "${OECMAKE_CXX_FLAGS}" - DEPENDS = "yajl lxc" INHIBIT_PACKAGE_DEBUG_SPLIT = "1" - -FILES_${PN} += "/usr/local/lib/* " -FILES_${PN}-dev = "/usr/local/*" -do_compile() { - cd ${S} - rm -rf build - mkdir build - cd build - cmake --prefix=/usr/ .. - make +FILES_${PN} += "${libdir}/* " +#FILES_${PN} += "/usr/local/lib/* " +#FILES_${PN}-dev = "/usr/local/*" + +do_configure_prepend() { + grep -q CMAKE_SYSROOT ${WORKDIR}/toolchain.cmake || cat >> ${WORKDIR}/toolchain.cmake < Date: Sat, 18 Sep 2021 18:25:53 +0800 Subject: [PATCH 041/304] support build arm32: qume-arm Signed-off-by: lisimin --- meta-openeuler/classes/eulertoolchain.bbclass | 2 +- meta-openeuler/conf/machine/qemu-common.inc | 10 +--------- meta-openeuler/recipes-core/glibc/glibc_2.25.bb | 6 ++++-- meta-openeuler/recipes-kernel/linux/linux-openeuler.bb | 10 ++++++---- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/meta-openeuler/classes/eulertoolchain.bbclass b/meta-openeuler/classes/eulertoolchain.bbclass index 52355216c9b..39670fd598f 100644 --- a/meta-openeuler/classes/eulertoolchain.bbclass +++ b/meta-openeuler/classes/eulertoolchain.bbclass @@ -7,7 +7,7 @@ def eulertoolchain_raw_prefix(arch): def eulertoolchain_euler_prefix(arch): euler_prefix_dict = { - "arm" : "arm-openeuler-linux", + "arm" : "arm-openeuler-linux-gnueabi", "aarch64" : "aarch64-openeuler-linux", } return euler_prefix_dict[arch] diff --git a/meta-openeuler/conf/machine/qemu-common.inc b/meta-openeuler/conf/machine/qemu-common.inc index 25c2ceda48b..8cc61831956 100644 --- a/meta-openeuler/conf/machine/qemu-common.inc +++ b/meta-openeuler/conf/machine/qemu-common.inc @@ -1,9 +1 @@ -# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. -# Description: Config for common machine -# Author: Huawei OS Kernel Lab -# Create: Sat Aug 29 01:15:17 2020 - -MACHINEOVERRIDES =. "hongmengmachine:" - -AVAILTUNES += 'rruarm' -TUNE_CCARGS .= "${@bb.utils.contains('TUNE_FEATURES', 'rruarm', ' -mno-unaligned-access -mfpu=vfpv3-d16 -mfloat-abi=soft -freg-struct-return', '', d)}" +MACHINEOVERRIDES =. "eulermachine:" diff --git a/meta-openeuler/recipes-core/glibc/glibc_2.25.bb b/meta-openeuler/recipes-core/glibc/glibc_2.25.bb index a369413cd78..ad573508dff 100644 --- a/meta-openeuler/recipes-core/glibc/glibc_2.25.bb +++ b/meta-openeuler/recipes-core/glibc/glibc_2.25.bb @@ -22,10 +22,12 @@ INHIBIT_DEFAULT_DEPS = "1" PR = "r1" -SRC_URI = "file://sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu" +SRC_URI_aarch64 = "file://sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu" +SRC_URI_arm = "file://sysroot-glibc-linaro-2.25-2018.05-arm-linux-gnueabi" #FILESPATH_prepend += "${LOCAL_FILES}:" DL_DIR = "${LOCAL_SYSROOT_DL_DIR}" -S = "${WORKDIR}/sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu" +S_aarch64 = "${WORKDIR}/sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu" +S_arm = "${WORKDIR}/sysroot-glibc-linaro-2.25-2018.05-arm-linux-gnueabi" PSEUDO_DISABLED = "1" PRIVATE_LIBS_${PN}-dev_append = "libdl.so.2 libresolv.so.2 libm.so.6 librt.so.1 libnsl.so.1 libnss_files.so.2 " diff --git a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb index 779707946e3..3db25d12379 100644 --- a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb +++ b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb @@ -62,9 +62,11 @@ COMPATIBLE_HOST = ".*-linux" PR = "r1" SRC_URI = "file://kernel-5.10 \ - file://yocto-embedded-tools/config/arm64/defconfig-kernel \ - file://yocto-embedded-tools/patches/arm64/0001-arm64-add-zImage-support-for-arm64.patch \ + file://yocto-embedded-tools/config/${ARCH}/defconfig-kernel \ " +SRC_URI_append_aarch64 += " \ + file://yocto-embedded-tools/patches/${ARCH}/0001-arm64-add-zImage-support-for-arm64.patch \ +" S = "${WORKDIR}/kernel-5.10" B = "${WORKDIR}/build" @@ -96,10 +98,10 @@ python do_symlink_kernsrc () { addtask symlink_kernsrc before do_patch do_configure after do_unpack do_configure() { - cp ../yocto-embedded-tools/config/arm64/defconfig-kernel .config + cp ../yocto-embedded-tools/config/${ARCH}/defconfig-kernel .config set -e unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS - oe_runmake -C ${S} ARCH=arm64 mrproper + oe_runmake -C ${S} ARCH=${ARCH} mrproper ${KERNEL_CONFIG_COMMAND} #yes '' | oe_runmake oldconfig oe_runmake -C ${B} savedefconfig -- Gitee From 18d064fd7c77402f591e331ecb87ec1831a59263 Mon Sep 17 00:00:00 2001 From: dongxinhua Date: Sat, 18 Sep 2021 20:34:39 +0800 Subject: [PATCH 042/304] add host tool cmake fmt gperf Signed-off-by: dongxinhua --- meta-openeuler/conf/local.conf.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index 4f6857da912..f712b954e27 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -271,7 +271,7 @@ BB_DISKMON_DIRS ??= "\ # track the version of this file when it was generated. This can safely be ignored if # this doesn't mean anything to you. CONF_VERSION = "2" -HOSTTOOLS += "patchelf python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader autoupdate libtool libtoolize pkg-config" +HOSTTOOLS += "patchelf python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader autoupdate libtool libtoolize pkg-config cmake fmt gperf" HOSTTOOLS_remove += "diffstat lz4c pzstd rpcgen" SANITY_REQUIRED_UTILITIES_remove += "diffstat chrpath" CONNECTIVITY_CHECK_URIS = "" -- Gitee From c63283367ae12a15112dcffb5539fb100d63c9b7 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Sat, 18 Sep 2021 20:42:25 +0800 Subject: [PATCH 043/304] add init scripts to image Signed-off-by: zhuyan --- meta-openeuler/recipes-core/os-base/os-base_1.0.bb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb index fc2ecd64b1e..942954a8f15 100644 --- a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb +++ b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb @@ -21,7 +21,9 @@ SRC_URI = "file://bashrc \ file://profile \ file://securetty \ file://shadow \ - file://sysctl.conf" + file://sysctl.conf \ + file://rc.functions \ + file://rc.sysinit" do_install() { install -d ${D}/etc @@ -38,6 +40,9 @@ do_install() { cp ${WORKDIR}/securetty ${D}/etc/ cp ${WORKDIR}/shadow ${D}/etc/ cp ${WORKDIR}/sysctl.conf ${D}/etc/ + install -d ${D}/etc/rc.d + cp ${WORKDIR}/rc.functions ${D}/etc/rc.d + cp ${WORKDIR}/rc.sysinit ${D}/etc/rc.d } -- Gitee From 2de316ffd4ef62f5ddd99b67d76d7f4d96cf578b Mon Sep 17 00:00:00 2001 From: zhuyan Date: Sat, 18 Sep 2021 20:42:59 +0800 Subject: [PATCH 044/304] fix fstab errors Signed-off-by: zhuyan --- meta-openeuler/recipes-core/os-base/os-base/fstab | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/meta-openeuler/recipes-core/os-base/os-base/fstab b/meta-openeuler/recipes-core/os-base/os-base/fstab index 26247ff28ea..a1ddb366b70 100644 --- a/meta-openeuler/recipes-core/os-base/os-base/fstab +++ b/meta-openeuler/recipes-core/os-base/os-base/fstab @@ -1,9 +1,9 @@ -proc /proc proc defaults,nofail 0 0 -sysfs /sys sysfs defaults,nofail 0 0 +proc /proc proc defaults 0 0 +sysfs /sys sysfs defaults 0 0 none /var tmpfs nodev,nosuid,mode=755,noexec 0 0 -none /var/log/audit tmpfs nodev,nosuid,mode=755,nofail 0 0 -devtmpfs /dev devtmpfs defaults,nofail 0 0 +none /var/log/audit tmpfs nodev,nosuid,mode=755 0 0 +devtmpfs /dev devtmpfs defaults 0 0 tmpfs /dev/shm tmpfs nodev,nosuid,mode=1777,noexec 0 0 -devpts /dev/pts devpts mode=620,nofail 0 0 +devpts /dev/pts devpts mode=620 0 0 tmpfs /tmp tmpfs nodev,nosuid,noexec 0 0 -tmpfs /opt tmpfs defaults,mode=0750,nofail 0 0 +tmpfs /opt tmpfs defaults,mode=0750 0 0 -- Gitee From 7013905cb798e7fc84a7e0a847aab1b1bbab68b0 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Sat, 18 Sep 2021 20:48:16 +0800 Subject: [PATCH 045/304] fix file format error Signed-off-by: zhuyan --- .../pam/libpam/pam.d/common-account | 8 ++-- .../recipes-core/pam/libpam/pam.d/common-auth | 14 +++--- .../pam/libpam/pam.d/common-password | 10 ++-- .../pam/libpam/pam.d/common-session | 38 +++++++-------- .../pam.d/common-session-noninteractive | 38 +++++++-------- .../recipes-core/pam/libpam/pam.d/other | 48 +++++++++---------- 6 files changed, 78 insertions(+), 78 deletions(-) diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-account b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-account index d00fde09120..0a9d30a5d31 100644 --- a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-account +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-account @@ -1,4 +1,4 @@ -account required pam_faillock.so -account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so -account requisite pam_deny.so -account required pam_permit.so +account required pam_faillock.so +account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so +account requisite pam_deny.so +account required pam_permit.so diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-auth b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-auth index 4306fd74a71..d77adbe5af2 100644 --- a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-auth +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-auth @@ -1,7 +1,7 @@ -auth required pam_faillock.so preauth audit deny=3 even_deny_root unlock_time=300 -auth sufficient pam_unix.so nullok try_first_pass -auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=300 -auth requisite pam_listfile.so item=user onerr=succeed sense=deny file=/etc/login.user.deny -auth [success=1 default=ignore] pam_unix.so -auth required pam_deny.so -auth required pam_permit.so +auth required pam_faillock.so preauth audit deny=3 even_deny_root unlock_time=300 +auth sufficient pam_unix.so nullok try_first_pass +auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=300 +auth requisite pam_listfile.so item=user onerr=succeed sense=deny file=/etc/login.user.deny +auth [success=1 default=ignore] pam_unix.so +auth required pam_deny.so +auth required pam_permit.so diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-password b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-password index 155775e57e7..06335bf722e 100644 --- a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-password +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-password @@ -1,5 +1,5 @@ -password requisite pam_pwquality.so try_first_pass minclass=3 minlen=8 lcredit=0 ucredit=0 dcredit=0 ocredit=0 reject_username gecoscheck retry=3 enforce_for_root -password required pam_pwhistory.so remember=5 use_authtok enforce_for_root -password [success=1 default=ignore] pam_unix.so use_authtok nullok sha512 -password requisite pam_deny.so -password required pam_permit.so +password requisite pam_pwquality.so try_first_pass minclass=3 minlen=8 lcredit=0 ucredit=0 dcredit=0 ocredit=0 reject_username gecoscheck retry=3 enforce_for_root +password required pam_pwhistory.so remember=5 use_authtok enforce_for_root +password [success=1 default=ignore] pam_unix.so use_authtok nullok sha512 +password requisite pam_deny.so +password required pam_permit.so diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session index 7a1e3a52707..94765c85d4d 100644 --- a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session @@ -1,19 +1,19 @@ -# -# /etc/pam.d/common-session - session-related modules common to all services -# -# This file is included from other service-specific PAM config files, -# and should contain a list of modules that define tasks to be performed -# at the start and end of sessions of *any* kind (both interactive and -# non-interactive). -# - -# here are the per-package modules (the "Primary" block) -session [default=1] pam_permit.so -# here's the fallback if no module succeeds -session requisite pam_deny.so -# prime the stack with a positive return value if there isn't one already; -# this avoids us returning an error just because nothing sets a success code -# since the modules above will each just jump around -session required pam_permit.so -# and here are more per-package modules (the "Additional" block) -session required pam_unix.so +# +# /etc/pam.d/common-session - session-related modules common to all services +# +# This file is included from other service-specific PAM config files, +# and should contain a list of modules that define tasks to be performed +# at the start and end of sessions of *any* kind (both interactive and +# non-interactive). +# + +# here are the per-package modules (the "Primary" block) +session [default=1] pam_permit.so +# here's the fallback if no module succeeds +session requisite pam_deny.so +# prime the stack with a positive return value if there isn't one already; +# this avoids us returning an error just because nothing sets a success code +# since the modules above will each just jump around +session required pam_permit.so +# and here are more per-package modules (the "Additional" block) +session required pam_unix.so diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session-noninteractive b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session-noninteractive index 79518d1de1c..a9c830d4c9b 100644 --- a/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session-noninteractive +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/common-session-noninteractive @@ -1,19 +1,19 @@ -# -# /etc/pam.d/common-session-noninteractive - session-related modules -# common to all non-interactive services -# -# This file is included from other service-specific PAM config files, -# and should contain a list of modules that define tasks to be performed -# at the start and end of all non-interactive sessions. -# - -# here are the per-package modules (the "Primary" block) -session [default=1] pam_permit.so -# here's the fallback if no module succeeds -session requisite pam_deny.so -# prime the stack with a positive return value if there isn't one already; -# this avoids us returning an error just because nothing sets a success code -# since the modules above will each just jump around -session required pam_permit.so -# and here are more per-package modules (the "Additional" block) -session required pam_unix.so +# +# /etc/pam.d/common-session-noninteractive - session-related modules +# common to all non-interactive services +# +# This file is included from other service-specific PAM config files, +# and should contain a list of modules that define tasks to be performed +# at the start and end of all non-interactive sessions. +# + +# here are the per-package modules (the "Primary" block) +session [default=1] pam_permit.so +# here's the fallback if no module succeeds +session requisite pam_deny.so +# prime the stack with a positive return value if there isn't one already; +# this avoids us returning an error just because nothing sets a success code +# since the modules above will each just jump around +session required pam_permit.so +# and here are more per-package modules (the "Additional" block) +session required pam_unix.so diff --git a/meta-openeuler/recipes-core/pam/libpam/pam.d/other b/meta-openeuler/recipes-core/pam/libpam/pam.d/other index 696f789eb97..010d5d11d82 100644 --- a/meta-openeuler/recipes-core/pam/libpam/pam.d/other +++ b/meta-openeuler/recipes-core/pam/libpam/pam.d/other @@ -1,24 +1,24 @@ -# -# /etc/pam.d/other - specify the PAM fallback behaviour -# -# Note that this file is used for any unspecified service; for example -#if /etc/pam.d/cron specifies no session modules but cron calls -#pam_open_session, the session module out of /etc/pam.d/other is -#used. - -# We use pam_warn.so to generate syslog notes that the 'other' -#fallback rules are being used (as a hint to suggest you should setup -#specific PAM rules for the service and aid to debugging). Then to be -#secure, deny access to all services by default. - -auth required pam_warn.so -auth required pam_deny.so - -account required pam_warn.so -account required pam_deny.so - -password required pam_warn.so -password required pam_deny.so - -session required pam_warn.so -session required pam_deny.so +# +# /etc/pam.d/other - specify the PAM fallback behaviour +# +# Note that this file is used for any unspecified service; for example +#if /etc/pam.d/cron specifies no session modules but cron calls +#pam_open_session, the session module out of /etc/pam.d/other is +#used. + +# We use pam_warn.so to generate syslog notes that the 'other' +#fallback rules are being used (as a hint to suggest you should setup +#specific PAM rules for the service and aid to debugging). Then to be +#secure, deny access to all services by default. + +auth required pam_warn.so +auth required pam_deny.so + +account required pam_warn.so +account required pam_deny.so + +password required pam_warn.so +password required pam_deny.so + +session required pam_warn.so +session required pam_deny.so -- Gitee From b081760ad26e7b7efec1b7dd86ff229680f51e9e Mon Sep 17 00:00:00 2001 From: zhuyan Date: Sat, 18 Sep 2021 21:02:29 +0800 Subject: [PATCH 046/304] add packages to release image Signed-off-by: zhuyan --- meta-openeuler/recipes-core/images/openeuler-image.bb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 83d27cff7dd..580a722dec0 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -48,4 +48,13 @@ xxdo_image_complete() { IMAGE_INSTALL += " \ busybox \ linux-openeuler \ +glibc \ +zlib \ +libcap-ng \ +cracklib \ +libpam \ +audit \ +libpwquality \ +shadow \ +openssh \ " -- Gitee From 601480d44333eda8673df8f8ecb2980f797c9eb9 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Sun, 19 Sep 2021 16:03:40 +0800 Subject: [PATCH 047/304] add shadow pam.d files to release Signed-off-by: zhuyan --- meta-openeuler/recipes-core/shadow/shadow.inc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/meta-openeuler/recipes-core/shadow/shadow.inc b/meta-openeuler/recipes-core/shadow/shadow.inc index 75945a2e139..666231dd2b2 100644 --- a/meta-openeuler/recipes-core/shadow/shadow.inc +++ b/meta-openeuler/recipes-core/shadow/shadow.inc @@ -70,8 +70,8 @@ SRC_URI = "file://shadow/shadow-4.8.1.tar.xz" LIC_FILES_CHKSUM="file://COPYING;md5=ed80ff1c2b40843cf5768e5229cf16e5" -PAM_SRC_URI = "file://pam.d" -SRC_URI_EXTRA = "file://pam.d/chfn \ +#PAM_SRC_URI = "file://pam.d" +SRC_URI += "file://pam.d/chfn \ file://login_defs_pam.sed \ file://pam.d/chpasswd \ file://pam.d/chsh \ @@ -152,6 +152,7 @@ do_install_append() { fi install -d ${D}${sbindir} ${D}${base_sbindir} ${D}${base_bindir} + cp ${WORKDIR}/pam.d/* ${D}${sysconfdir}/pam.d/ # Move binaries to the locations we want rm ${D}${sbindir}/vigr -- Gitee From c44f3edfa6de060ac0cf76b5612bacb5c4cb5738 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Sun, 19 Sep 2021 17:09:02 +0800 Subject: [PATCH 048/304] fix shadow compile error Signed-off-by: zhuyan --- meta-openeuler/conf/local.conf.sample | 4 ++-- meta-openeuler/recipes-core/images/openeuler-image.bb | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index f712b954e27..94b42d637f2 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -271,8 +271,8 @@ BB_DISKMON_DIRS ??= "\ # track the version of this file when it was generated. This can safely be ignored if # this doesn't mean anything to you. CONF_VERSION = "2" -HOSTTOOLS += "patchelf python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader autoupdate libtool libtoolize pkg-config cmake fmt gperf" -HOSTTOOLS_remove += "diffstat lz4c pzstd rpcgen" +HOSTTOOLS += "patchelf python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader autoupdate libtool libtoolize pkg-config cmake fmt gperf m4" +HOSTTOOLS_remove += "diffstat lz4c pzstd rpcgen g++" SANITY_REQUIRED_UTILITIES_remove += "diffstat chrpath" CONNECTIVITY_CHECK_URIS = "" #PREFERRED_VERSION_linux-yocto = "5.10%" diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 580a722dec0..25f913306aa 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -48,7 +48,6 @@ xxdo_image_complete() { IMAGE_INSTALL += " \ busybox \ linux-openeuler \ -glibc \ zlib \ libcap-ng \ cracklib \ -- Gitee From 30ea326e65121f013e400ec0b6f050262bad815f Mon Sep 17 00:00:00 2001 From: zhuyan Date: Sun, 19 Sep 2021 17:25:20 +0800 Subject: [PATCH 049/304] add os-base to release Signed-off-by: zhuyan --- meta-openeuler/recipes-core/images/openeuler-image.bb | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 25f913306aa..f487b848bbf 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -48,6 +48,7 @@ xxdo_image_complete() { IMAGE_INSTALL += " \ busybox \ linux-openeuler \ +os-base \ zlib \ libcap-ng \ cracklib \ -- Gitee From 2513d363ff5479725d0dd672cc32424c1eeeb503 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Wed, 22 Sep 2021 16:45:27 +0800 Subject: [PATCH 050/304] iSulad support arm32 Signed-off-by: zhuyan --- .../iSulad/modify_printf_to_arm32.patch | 208 ++++++++++++++++++ .../recipes-core/iSulad/iSulad_2.0.9.bb | 1 + .../recipes-core/lxc/lxc/support_arm32.patch | 81 +++++++ meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb | 1 + 4 files changed, 291 insertions(+) create mode 100644 meta-openeuler/recipes-core/iSulad/iSulad/modify_printf_to_arm32.patch create mode 100644 meta-openeuler/recipes-core/lxc/lxc/support_arm32.patch diff --git a/meta-openeuler/recipes-core/iSulad/iSulad/modify_printf_to_arm32.patch b/meta-openeuler/recipes-core/iSulad/iSulad/modify_printf_to_arm32.patch new file mode 100644 index 00000000000..7d3947be0d7 --- /dev/null +++ b/meta-openeuler/recipes-core/iSulad/iSulad/modify_printf_to_arm32.patch @@ -0,0 +1,208 @@ +commit 5c290cec5e0022eb81e082ebcbc3bbcdf4f9807d +Author: lisimin +Date: Wed Sep 22 10:05:34 2021 +0800 + + modify printf to arm32 + + Signed-off-by: lisimin + +diff --git a/src/cmd/isula/extend/stats.c b/src/cmd/isula/extend/stats.c +index b35156a..8fd23a7 100644 +--- a/src/cmd/isula/extend/stats.c ++++ b/src/cmd/isula/extend/stats.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + + #include "client_arguments.h" + #include "utils.h" +@@ -169,7 +170,7 @@ static void stats_print_original_data(const struct isula_container_info *stats) + short_id[SHORTIDLEN] = '\0'; + } + +- printf("%-16s %-10llu %-10s %-20lu %-20lu %-15u %-15lu %-15lu %-15lu %-15lu %-15lu %-15lu %-40s", short_id, ++ printf("%-16s %-10llu %-10s %-20"PRIu64" %-20"PRIu64" %-15u %-15"PRIu64" %-15"PRIu64" %-15"PRIu64" %-15"PRIu64" %-15"PRIu64" %-15"PRIu64" %-40s", short_id, + (unsigned long long)stats->pids_current, stats->status, stats->cpu_use_nanos, stats->cpu_system_use, + stats->online_cpus, stats->blkio_read, stats->blkio_write, stats->mem_used, stats->mem_limit, + stats->kmem_used, stats->cache, stats->name); +diff --git a/src/cmd/isulad/isulad_commands.c b/src/cmd/isulad/isulad_commands.c +index d0ab029..8df1dbc 100644 +--- a/src/cmd/isulad/isulad_commands.c ++++ b/src/cmd/isulad/isulad_commands.c +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + + #include "config.h" + #include "isula_libutils/log.h" +@@ -250,7 +251,7 @@ static int check_args_log_conf(const struct service_arguments *args) + /* validate max-size */ + if ((args->json_confs->log_driver && strcasecmp("file", args->json_confs->log_driver) == 0) && + (args->max_size < (4 * 1024))) { +- ERROR("Max-size \"%ld\" must large than 4KB.", args->max_size); ++ ERROR("Max-size \"%"PRId64"\" must large than 4KB.", args->max_size); + ret = -1; + goto out; + } +diff --git a/src/daemon/executor/container_cb/execution_stream.c b/src/daemon/executor/container_cb/execution_stream.c +index 7d165fb..c83162f 100644 +--- a/src/daemon/executor/container_cb/execution_stream.c ++++ b/src/daemon/executor/container_cb/execution_stream.c +@@ -40,6 +40,7 @@ + #include + #include + #include ++#include + + #include "isula_libutils/log.h" + #include "io_wrapper.h" +@@ -1622,7 +1623,7 @@ static int container_logs_cb(const struct isulad_logs_request *request, stream_f + goto out; + } + +- EVENT("Event: {Object: %s, Content: path: %s, rotate: %d, size: %ld }", id, log_config->path, log_config->rotate, ++ EVENT("Event: {Object: %s, Content: path: %s, rotate: %d, size: %"PRId64" }", id, log_config->path, log_config->rotate, + log_config->size); + + nret = check_log_config(log_config); +diff --git a/src/daemon/executor/container_cb/list.c b/src/daemon/executor/container_cb/list.c +index d8f2632..fee7d23 100644 +--- a/src/daemon/executor/container_cb/list.c ++++ b/src/daemon/executor/container_cb/list.c +@@ -620,7 +620,7 @@ static int pack_list_containers(char **idsarray, const struct list_context *ctx, + } + + if (container_nums > (SIZE_MAX / sizeof(container_container *))) { +- ERROR("Get too many containers:%ld", container_nums); ++ ERROR("Get too many containers: %zu", container_nums); + ret = -1; + goto out; + } +diff --git a/src/daemon/modules/log/log_gather.c b/src/daemon/modules/log/log_gather.c +index b981391..2c42f84 100644 +--- a/src/daemon/modules/log/log_gather.c ++++ b/src/daemon/modules/log/log_gather.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + + #include "log_gather_api.h" + #include "isula_libutils/log.h" +@@ -223,7 +224,7 @@ static int check_log_file() + if (ret != 0) { + COMMAND_ERROR("Rotate log file %s failed.", g_log_file); + } else { +- INFO("Log file large than %lu, rotate it.", g_max_size); ++ INFO("Log file large than %"PRId64", rotate it.", g_max_size); + } + } else { + ret = 0; +diff --git a/src/daemon/modules/plugin/plugin.c b/src/daemon/modules/plugin/plugin.c +index 2532656..20ce4ec 100644 +--- a/src/daemon/modules/plugin/plugin.c ++++ b/src/daemon/modules/plugin/plugin.c +@@ -31,6 +31,7 @@ + #include + #include + #include ++#include + + #include "isula_libutils/log.h" + #include "plugin_api.h" +@@ -519,7 +520,7 @@ static int pm_register_plugin(const char *name, const char *addr) + goto failed; + } + +- INFO("add activated plugin %s 0x%lx", plugin->name, plugin->manifest->watch_event); ++ INFO("add activated plugin %s %"PRIu64"", plugin->name, plugin->manifest->watch_event); + return 0; + + failed: +@@ -854,7 +855,7 @@ bool plugin_is_watching(plugin_t *plugin, uint64_t pe) + } + plugin_unlock(plugin); + +- INFO("plugin %s watching=%s for event 0x%lx", plugin->name, (ok ? "true" : "false"), pe); ++ INFO("plugin %s watching=%s for event %"PRIu64"", plugin->name, (ok ? "true" : "false"), pe); + + return ok; + } +@@ -885,7 +886,7 @@ static int unpack_activate_response(const struct parsed_http_message *message, v + goto out; + } + +- INFO("get resp 0x%lx", resp->watch_event); ++ INFO("get resp %"PRIu64"", resp->watch_event); + manifest->init_type = resp->init_type; + manifest->watch_event = resp->watch_event; + +@@ -1371,7 +1372,7 @@ static int plugin_event_handle_dispath_impl(const char *cid, const char *plugins + ret = plugin_event_post_remove_handle(plugin, cid); + break; + default: +- ERROR("plugin event %ld not support.", pe); ++ ERROR("plugin event %"PRIu64" not support.", pe); + ret = -1; + break; + } +diff --git a/src/daemon/modules/spec/verify.c b/src/daemon/modules/spec/verify.c +index 57501cd..42300b6 100644 +--- a/src/daemon/modules/spec/verify.c ++++ b/src/daemon/modules/spec/verify.c +@@ -34,6 +34,7 @@ + #include + #include + #include ++#include + + #include "constants.h" + #include "err_msg.h" +@@ -962,7 +963,7 @@ static bool check_hugetlbs_repeated(size_t newlen, const char *pagesize, + + for (j = 0; j < newlen; j++) { + if (newtlb[j] != NULL && newtlb[j]->page_size != NULL && !strcmp(newtlb[j]->page_size, pagesize)) { +- WARN("hugetlb-limit setting of %s is repeated, former setting %lu will be replaced with %lu", pagesize, ++ WARN("hugetlb-limit setting of %s is repeated, former setting %"PRIu64" will be replaced with %"PRIu64"", pagesize, + newtlb[j]->limit, hugetlb->limit); + newtlb[j]->limit = hugetlb->limit; + repeated = true; +@@ -1090,9 +1091,9 @@ static int verify_resources_device(defs_resources *resources) + + for (i = 0; i < resources->devices_len; i++) { + if (!util_valid_device_mode(resources->devices[i]->access)) { +- ERROR("Invalid device mode \"%s\" for device \"%ld %ld\"", resources->devices[i]->access, ++ ERROR("Invalid device mode \"%s\" for device \"%"PRId64" %"PRId64"\"", resources->devices[i]->access, + resources->devices[i]->major, resources->devices[i]->minor); +- isulad_set_error_message("Invalid device mode \"%s\" for device \"%ld %ld\"", resources->devices[i]->access, ++ isulad_set_error_message("Invalid device mode \"%s\" for device \"%"PRId64" %"PRId64"\"", resources->devices[i]->access, + resources->devices[i]->major, resources->devices[i]->minor); + ret = -1; + goto out; +@@ -1678,7 +1679,7 @@ static int add_hugetbl_element(host_config_hugetlbs_element ***hugetlb, size_t * + for (j = 0; j < *len; j++) { + if (strcmp((*hugetlb)[j]->page_size, pagesize) == 0) { + WARN("Hostconfig: hugetlb-limit setting of %s is repeated, " +- "former setting %lu will be replaced with %lu", ++ "former setting %"PRIu64" will be replaced with %"PRIu64"", + pagesize, (*hugetlb)[j]->limit, element->limit); + (*hugetlb)[j]->limit = element->limit; + goto out; +diff --git a/src/utils/cutils/utils_base64.c b/src/utils/cutils/utils_base64.c +index 2eb6b6b..aebf097 100644 +--- a/src/utils/cutils/utils_base64.c ++++ b/src/utils/cutils/utils_base64.c +@@ -115,7 +115,7 @@ size_t util_base64_decode_len(const char *input, size_t len) + size_t padding_count = 0; + + if (input == NULL || len < 4 || len % 4 != 0) { +- ERROR("Invalid param for base64 decode length, length is %ld", len); ++ ERROR("Invalid param for base64 decode length, length is %zu ", len); + return -1; + } + diff --git a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb index 1cc15310e9c..a363466deaa 100644 --- a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb +++ b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb @@ -6,6 +6,7 @@ LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;m SRC_URI = "file://iSulad/v2.0.9.tar.gz \ file://fix_bug_disable_selinux_not_selinux_label_file.patch \ file://delete_call_setlocale.patch \ + file://modify_printf_to_arm32.patch \ " FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" diff --git a/meta-openeuler/recipes-core/lxc/lxc/support_arm32.patch b/meta-openeuler/recipes-core/lxc/lxc/support_arm32.patch new file mode 100644 index 00000000000..6b4a9eace24 --- /dev/null +++ b/meta-openeuler/recipes-core/lxc/lxc/support_arm32.patch @@ -0,0 +1,81 @@ +commit 05f1ae3dac69f1c677d3d8d0fabfb1536b8c2583 +Author: lisimin +Date: Wed Sep 22 09:34:22 2021 +0800 + + support arm32 + + Signed-off-by: lisimin + +diff --git a/configure.ac b/configure.ac +index 9eb6dcb..929d670 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -812,6 +812,7 @@ AM_CONDITIONAL([HAVE_ISULAD], [test "x$adapt_isulad" = "xyes"]) + if test "x$adapt_isulad" = "xyes"; then + AC_DEFINE([HAVE_ISULAD], 1, [adapt to iSulad]) + AC_MSG_RESULT([yes]) ++ AC_SUBST([YAJL_LIBS], [-lyajl]) + else + AC_MSG_RESULT([no]) + fi +diff --git a/src/lxc/confile.c b/src/lxc/confile.c +index e898e23..522fefa 100644 +--- a/src/lxc/confile.c ++++ b/src/lxc/confile.c +@@ -6233,21 +6233,21 @@ static int set_config_init_args(const char *key, const char *value, + struct lxc_conf *lxc_conf, void *data) + { + int ret = 0; +- char *tmp = NULL; ++ char **tmp = NULL; + char *new_value = NULL; + + ret = set_config_string_item(&new_value, value); + if (ret || !new_value) + return ret; + +- tmp = realloc(lxc_conf->init_argv, (lxc_conf->init_argc + 1) * sizeof(char *)); ++ tmp = (char **)realloc(lxc_conf->init_argv, (lxc_conf->init_argc + 1) * sizeof(char *)); + if (!tmp) { + ERROR("Out of memory"); + free(new_value); + return -1; + } + +- lxc_conf->init_argv = (char **)tmp; ++ lxc_conf->init_argv = tmp; + + lxc_conf->init_argv[lxc_conf->init_argc] = new_value; + lxc_conf->init_argc++; +diff --git a/src/lxc/json/json_common.c b/src/lxc/json/json_common.c +index ec20c59..87895b0 100755 +--- a/src/lxc/json/json_common.c ++++ b/src/lxc/json/json_common.c +@@ -764,11 +764,11 @@ int append_json_map_int_string(json_map_int_string *map, int key, const char *va + if (map == NULL) { + return -1; + } +- ++#if 0 + if ((SIZE_MAX / sizeof(int) - 1) < map->len || (SIZE_MAX / sizeof(char *) - 1) < map->len) { + return -1; + } +- ++#endif + len = map->len + 1; + keys = safe_malloc(len * sizeof(int)); + vals = safe_malloc(len * sizeof(char *)); +@@ -886,11 +886,11 @@ int append_json_map_string_int(json_map_string_int *map, const char *key, int va + if (map == NULL) { + return -1; + } +- ++#if 0 + if ((SIZE_MAX / sizeof(char *) - 1) < map->len || (SIZE_MAX / sizeof(int) - 1) < map->len) { + return -1; + } +- ++#endif + len = map->len + 1; + keys = safe_malloc(len * sizeof(char *)); + vals = safe_malloc(len * sizeof(int)); diff --git a/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb b/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb index b7eda6378d7..9d7ba8c1378 100644 --- a/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb +++ b/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb @@ -32,6 +32,7 @@ SRC_URI = "file://lxc/lxc-4.0.3.tar.gz \ file://lxc/0024-log-adjust-log-level-from-error-to-warn.patch \ file://lxc/0025-get-cgroup-data-len-first-and-malloc-read-buff-by-le.patch \ file://lxc/0026-coredump-fix-coredump-when-cgroup-get-return-error.patch \ + file://support_arm32.patch \ " FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -- Gitee From b65bcfdd41e4195cf3b9394071177072b14b8c8b Mon Sep 17 00:00:00 2001 From: zhuyan Date: Wed, 22 Sep 2021 17:48:57 +0800 Subject: [PATCH 051/304] add audit security config files Signed-off-by: zhuyan --- meta-openeuler/recipes-core/audit/audit_3.0.bb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/meta-openeuler/recipes-core/audit/audit_3.0.bb b/meta-openeuler/recipes-core/audit/audit_3.0.bb index 90288d847c3..01235508283 100644 --- a/meta-openeuler/recipes-core/audit/audit_3.0.bb +++ b/meta-openeuler/recipes-core/audit/audit_3.0.bb @@ -10,7 +10,10 @@ LICENSE = "GPLv2+ & LGPLv2+" inherit autotools LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" -SRC_URI = "file://audit/audit-${PV}.tar.gz" +SRC_URI = "file://audit/audit-${PV}.tar.gz \ + file://auditd.conf \ + file://audit.rules \ + " UPDATERCPN = "auditd" @@ -88,7 +91,8 @@ do_install_append() { # audit-2.5 doesn't install any rules by default, so we do that here mkdir -p ${D}/etc/audit ${D}/etc/audit/rules.d - cp ${S}/rules/10-base-config.rules ${D}/etc/audit/rules.d/audit.rules + cp ${WORKDIR}/audit.rules ${D}/etc/audit/rules.d/audit.rules + cp ${WORKDIR}/auditd.conf ${D}/etc/audit/auditd.conf chmod 750 ${D}/etc/audit ${D}/etc/audit/rules.d chmod 640 ${D}/etc/audit/auditd.conf ${D}/etc/audit/rules.d/audit.rules -- Gitee From 143fa4b65c9797a3e6e26ae280a6d228a33221c4 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Wed, 22 Sep 2021 18:56:31 +0800 Subject: [PATCH 052/304] add openssh security config files Signed-off-by: zhuyan --- meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb b/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb index 91125344602..cbe83402e86 100644 --- a/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb +++ b/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb @@ -71,6 +71,9 @@ file://sshd@.service \ file://sshdgenkeys.service \ file://volatiles.99_sshd \ file://config/common/sshd_check_keys \ +file://sshd_config \ +file://sshd_config_readonly \ +file://sshd \ " @@ -128,6 +131,11 @@ do_install_append () { sed -i -e 's,@LIBEXECDIR@,${libexecdir}/${BPN},g' \ ${D}${sysconfdir}/init.d/sshd + cp ${WORKDIR}/ssh_config ${D}${sysconfdir}/ssh/ssh_config + cp ${WORKDIR}/sshd_config ${D}${sysconfdir}/ssh/sshd_config + cp ${WORKDIR}/sshd_config_readonly ${D}${sysconfdir}/ssh/sshd_config_readonly + install -d ${D}${sysconfdir}/pam.d + cp ${WORKDIR}/sshd ${D}${sysconfdir}/pam.d/sshd install -D -m 0755 ${WORKDIR}/config/common/sshd_check_keys ${D}${libexecdir}/${BPN}/sshd_check_keys chmod -s ${D}/usr/libexec/ssh-keysign -- Gitee From 3a3ce0702e984f2315616dec973b73aaf3d27315 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Wed, 22 Sep 2021 19:38:37 +0800 Subject: [PATCH 053/304] fix sshd running error Signed-off-by: zhuyan --- meta-openeuler/recipes-core/openssh/openssh/init | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/recipes-core/openssh/openssh/init b/meta-openeuler/recipes-core/openssh/openssh/init index 8887e3af130..837340d84ad 100644 --- a/meta-openeuler/recipes-core/openssh/openssh/init +++ b/meta-openeuler/recipes-core/openssh/openssh/init @@ -4,7 +4,7 @@ set -e PIDFILE=/var/run/sshd.pid # source function library -. /etc/init.d/functions +#. /etc/init.d/functions # /etc/init.d/ssh: start and stop the OpenBSD "secure shell" daemon -- Gitee From c2155374a798152d744a3ad0c4527a546635ecf9 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Wed, 22 Sep 2021 20:12:01 +0800 Subject: [PATCH 054/304] add rc.local to start auditd and syslogd Signed-off-by: zhuyan --- meta-openeuler/recipes-core/os-base/os-base/rc.local | 4 ++++ meta-openeuler/recipes-core/os-base/os-base_1.0.bb | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 meta-openeuler/recipes-core/os-base/os-base/rc.local diff --git a/meta-openeuler/recipes-core/os-base/os-base/rc.local b/meta-openeuler/recipes-core/os-base/os-base/rc.local new file mode 100644 index 00000000000..8a74590bcec --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/rc.local @@ -0,0 +1,4 @@ +#!/bin/bash + +/sbin/auditd +/sbin/syslogd diff --git a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb index 942954a8f15..82521a72fd0 100644 --- a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb +++ b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb @@ -23,7 +23,8 @@ SRC_URI = "file://bashrc \ file://shadow \ file://sysctl.conf \ file://rc.functions \ - file://rc.sysinit" + file://rc.sysinit \ + file://rc.local" do_install() { install -d ${D}/etc @@ -43,6 +44,7 @@ do_install() { install -d ${D}/etc/rc.d cp ${WORKDIR}/rc.functions ${D}/etc/rc.d cp ${WORKDIR}/rc.sysinit ${D}/etc/rc.d + cp ${WORKDIR}/rc.local ${D}/etc/rc.d } -- Gitee From 45c7d0222a2362f3f23e4474e8b9468b7047feaf Mon Sep 17 00:00:00 2001 From: zhuyan Date: Thu, 23 Sep 2021 12:03:01 +0800 Subject: [PATCH 055/304] check only rootfs as filesystem type Signed-off-by: dongxinhua Signed-off-by: zhuyan --- ...check_only_rootfs_as_filesystem_type.patch | 21 +++++++++++++++++++ meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb | 1 + 2 files changed, 22 insertions(+) create mode 100644 meta-openeuler/recipes-core/lxc/lxc/check_only_rootfs_as_filesystem_type.patch diff --git a/meta-openeuler/recipes-core/lxc/lxc/check_only_rootfs_as_filesystem_type.patch b/meta-openeuler/recipes-core/lxc/lxc/check_only_rootfs_as_filesystem_type.patch new file mode 100644 index 00000000000..c37318d3308 --- /dev/null +++ b/meta-openeuler/recipes-core/lxc/lxc/check_only_rootfs_as_filesystem_type.patch @@ -0,0 +1,21 @@ +commit 4f16f60b4ad67a11da4cf7a38391a28724e49f18 +Author: lisimin +Date: Thu Sep 23 11:10:59 2021 +0800 + + check only rootfs as filesytem type + + Signed-off-by: lisimin + +diff --git a/src/lxc/utils.c b/src/lxc/utils.c +index 95c00cf..46e9d35 100644 +--- a/src/lxc/utils.c ++++ b/src/lxc/utils.c +@@ -730,7 +730,7 @@ bool detect_ramfs_rootfs(void) + if (strcmp(p + 1, "/") == 0) { + /* This is '/'. Is it the ramfs? */ + p = strchr(p2 + 1, '-'); +- if (p && strncmp(p, "- rootfs rootfs ", 16) == 0) ++ if (p && strncmp(p, "- rootfs ", 9) == 0) + return true; + } + } diff --git a/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb b/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb index 9d7ba8c1378..6d4b3fc82f7 100644 --- a/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb +++ b/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb @@ -33,6 +33,7 @@ SRC_URI = "file://lxc/lxc-4.0.3.tar.gz \ file://lxc/0025-get-cgroup-data-len-first-and-malloc-read-buff-by-le.patch \ file://lxc/0026-coredump-fix-coredump-when-cgroup-get-return-error.patch \ file://support_arm32.patch \ + file://check_only_rootfs_as_filesystem_type.patch \ " FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -- Gitee From 406f55a26ebf48f453e9e017d5486636262eaf1a Mon Sep 17 00:00:00 2001 From: lisimin Date: Wed, 22 Sep 2021 21:22:20 +0800 Subject: [PATCH 056/304] add g++, delete patchelf, and fix build warnings Signed-off-by: lisimin --- meta-openeuler/conf/distro/openeuler.conf | 1 + meta-openeuler/conf/local.conf.sample | 4 ++-- meta-openeuler/recipes-core/glibc/glibc_2.25.bb | 4 +++- meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb | 1 + .../recipes-core/images/openeuler-image.bb | 7 ++----- meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb | 4 ---- meta-openeuler/recipes-core/shadow/shadow.inc | 12 ------------ .../recipes-devtools/gcc/gcc-bin-toolchain-cross.bb | 3 ++- 8 files changed, 11 insertions(+), 25 deletions(-) diff --git a/meta-openeuler/conf/distro/openeuler.conf b/meta-openeuler/conf/distro/openeuler.conf index af415eaf7cd..51820d338e0 100644 --- a/meta-openeuler/conf/distro/openeuler.conf +++ b/meta-openeuler/conf/distro/openeuler.conf @@ -78,3 +78,4 @@ DL_DIR = "downloads" export RPMDEPS = "default" INHERIT += "get_dl_dir get_rpmdeps" do_fetch[file-checksums] = "" +SDK_INCLUDE_BUILDTOOLS = "0" diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index 94b42d637f2..01f32c56cd9 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -271,8 +271,8 @@ BB_DISKMON_DIRS ??= "\ # track the version of this file when it was generated. This can safely be ignored if # this doesn't mean anything to you. CONF_VERSION = "2" -HOSTTOOLS += "patchelf python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader autoupdate libtool libtoolize pkg-config cmake fmt gperf m4" -HOSTTOOLS_remove += "diffstat lz4c pzstd rpcgen g++" +HOSTTOOLS += "python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader autoupdate libtool libtoolize pkg-config cmake fmt gperf m4" +HOSTTOOLS_remove += "diffstat lz4c pzstd rpcgen" SANITY_REQUIRED_UTILITIES_remove += "diffstat chrpath" CONNECTIVITY_CHECK_URIS = "" #PREFERRED_VERSION_linux-yocto = "5.10%" diff --git a/meta-openeuler/recipes-core/glibc/glibc_2.25.bb b/meta-openeuler/recipes-core/glibc/glibc_2.25.bb index ad573508dff..ac596c9e955 100644 --- a/meta-openeuler/recipes-core/glibc/glibc_2.25.bb +++ b/meta-openeuler/recipes-core/glibc/glibc_2.25.bb @@ -7,7 +7,7 @@ SECTION = "kernel" LICENSE = "GPLv2" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" -#PACKAGES = "${PN}-dbg catchsegv sln nscd ldconfig ldd tzcode glibc-thread-db ${PN}-pic libcidn libmemusage malloc-debug libnss-db libsegfault ${PN}-pcprofile libsotruss ${PN} ${PN}-utils glibc-extra-nss ${PN}-dev ${PN}-staticdev ${PN}-doc ${PN}-src" +PACKAGES = "${PN}-dbg catchsegv sln nscd ldconfig ldd tzcode glibc-thread-db ${PN}-pic libcidn libmemusage malloc-debug libnss-db libsegfault ${PN}-pcprofile libsotruss ${PN} ${PN}-utils glibc-extra-nss ${PN}-dev ${PN}-staticdev ${PN}-doc ${PN}-src" #DEPENDS = "virtual/${TARGET_PREFIX}gcc libgcc-initial linux-libc-headers" PROVIDES += " \ @@ -69,3 +69,5 @@ deltask do_package_write_rpm do_packagedata () { : } + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb index 1cc15310e9c..c6cef1a329a 100644 --- a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb +++ b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb @@ -11,6 +11,7 @@ SRC_URI = "file://iSulad/v2.0.9.tar.gz \ FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}" +WARN_QA_remove += "uppercase-pn" inherit cmake OECMAKE_GENERATOR = "Unix Makefiles" diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index f487b848bbf..b6dab15949e 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -28,7 +28,8 @@ TOOLCHAIN_TARGET_TASK_remove += "${@multilib_pkg_extend(d, 'packagegroup-core-st python do_package() { bb.note("do nothing"); } -#deltask package +TOOLCHAIN_HOST_TASK_task-populate-sdk-ext = "" +TOOLCHAIN_HOST_TASK = "" #do_rootfs depends to command createrepo_c, so create an empty rootfs for do_image_tar python do_rootfs() { bb.note("do nothing"); @@ -41,10 +42,6 @@ python do_image() { os.makedirs(rootfs) } -xxdo_image_complete() { - : -} - IMAGE_INSTALL += " \ busybox \ linux-openeuler \ diff --git a/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb b/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb index 91125344602..6f3c0c85903 100644 --- a/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb +++ b/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb @@ -161,8 +161,4 @@ RCONFLICTS_${PN}-sshd = "dropbear" CONFFILES_${PN}-sshd = "${sysconfdir}/ssh/sshd_config" CONFFILES_${PN}-ssh = "${sysconfdir}/ssh/ssh_config" -ALTERNATIVE_PRIORITY = "90" -ALTERNATIVE_${PN}-scp = "scp" -ALTERNATIVE_${PN}-ssh = "ssh" - BBCLASSEXTEND += "nativesdk" diff --git a/meta-openeuler/recipes-core/shadow/shadow.inc b/meta-openeuler/recipes-core/shadow/shadow.inc index 666231dd2b2..d227de122c9 100644 --- a/meta-openeuler/recipes-core/shadow/shadow.inc +++ b/meta-openeuler/recipes-core/shadow/shadow.inc @@ -182,18 +182,6 @@ FILES_${PN}-base = "\ " RDEPENDS_${PN} += "${PN}-base" -#inherit update-alternatives - -ALTERNATIVE_PRIORITY = "200" - -ALTERNATIVE_${PN} = "passwd chfn chsh chpasswd vipw vigr nologin login su" -ALTERNATIVE_LINK_NAME[chpasswd] = "${sbindir}/chpasswd" -ALTERNATIVE_LINK_NAME[vipw] = "${base_sbindir}/vipw" -ALTERNATIVE_LINK_NAME[vigr] = "${base_sbindir}/vigr" -ALTERNATIVE_LINK_NAME[nologin] = "${base_sbindir}/nologin" - -ALTERNATIVE_${PN}-base = "newgrp groups" - PACKAGE_WRITE_DEPS += "shadow-native" pkg_postinst_${PN}_class-target () { if [ "x$D" != "x" ]; then diff --git a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb index 4c3a396b8c1..7cd1f94ba16 100644 --- a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb +++ b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb @@ -4,6 +4,7 @@ inherit eulertoolchain require gcc-bin-toolchain.inc INHIBIT_DEFAULT_DEPS = "1" +INHIBIT_SYSROOT_STRIP = "1" PROVIDES = "\ virtual/${EULER_TOOLCHAIN_TARGET_PREFIX}binutils \ @@ -40,4 +41,4 @@ do_packagedata () { } addtask do_packagedata -INSANE_SKIP += "already-stripped" +INSANE_SKIP_${PN} += " already-stripped " -- Gitee From 567973275dec8ed6a55a2936e1422c0548e0e3d7 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Thu, 23 Sep 2021 21:04:27 +0800 Subject: [PATCH 057/304] update security config files Signed-off-by: zhuyan --- meta-openeuler/recipes-core/audit/files/audit.rules | 4 ++-- meta-openeuler/recipes-core/os-base/os-base/shadow | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/meta-openeuler/recipes-core/audit/files/audit.rules b/meta-openeuler/recipes-core/audit/files/audit.rules index 09ccf53281e..8b8f2e59828 100644 --- a/meta-openeuler/recipes-core/audit/files/audit.rules +++ b/meta-openeuler/recipes-core/audit/files/audit.rules @@ -27,8 +27,8 @@ -w /etc/issue.net -p wa -k system-locale -w /etc/hosts -p wa -k system-locale -w /etc/network -p wa -k system-locale --w /etc/sysconfig/network -p wa -k system-locale --w /etc/sysconfig/network-scripts -p wa -k system-locale +#-w /etc/sysconfig/network -p wa -k system-locale +#-w /etc/sysconfig/network-scripts -p wa -k system-locale -w /etc/selinux/ -p wa -k MAC-policy -w /var/log/lastlog -p wa -k logins -w /var/log/tallylog -p wa -k logins diff --git a/meta-openeuler/recipes-core/os-base/os-base/shadow b/meta-openeuler/recipes-core/os-base/os-base/shadow index 21dbde6ce92..988556e4555 100644 --- a/meta-openeuler/recipes-core/os-base/os-base/shadow +++ b/meta-openeuler/recipes-core/os-base/os-base/shadow @@ -1,2 +1,2 @@ -root:$6$sHTXIVQU$r8zE6YB6fyJfbvTzEUl3R1tVlY7L/3R1G8Gf4c9dvJx3E4hMv8GS.IN3naMh2bfL7RBd1JlnnfGcru3Ko9gkQ.:16056:0:99999:7::: +root:$6$WthYamqr$nkDUajqkYZ0HWYLY93LOa79W0Bgoc1sNY357EXjsJ4d/VtZBIZGQHAP3/GJ42.QvEwTy7LCwWn0FQ.QRyfkjW/:0:0:99999:7::: sshd:!:11880:0:90:7:-1:-1:0 -- Gitee From 6de9b5c441379d08c466d04a895ee505545c6dca Mon Sep 17 00:00:00 2001 From: zhuyan Date: Mon, 1 Nov 2021 03:30:39 +0800 Subject: [PATCH 058/304] add recipe for ncurses Signed-off-by: zhuyan --- .../recipes-labtools/ncurses/ncurses.inc | 322 ++++++++++++++++++ .../recipes-labtools/ncurses/ncurses_6.2.bb | 13 + 2 files changed, 335 insertions(+) create mode 100644 meta-openeuler/recipes-labtools/ncurses/ncurses.inc create mode 100644 meta-openeuler/recipes-labtools/ncurses/ncurses_6.2.bb diff --git a/meta-openeuler/recipes-labtools/ncurses/ncurses.inc b/meta-openeuler/recipes-labtools/ncurses/ncurses.inc new file mode 100644 index 00000000000..d83134b72d3 --- /dev/null +++ b/meta-openeuler/recipes-labtools/ncurses/ncurses.inc @@ -0,0 +1,322 @@ +SUMMARY = "The New Curses library" +DESCRIPTION = "SVr4 and XSI-Curses compatible curses library and terminfo tools including tic, infocmp, captoinfo. Supports color, multiple highlights, forms-drawing characters, and automatic recognition of keypad and function-key sequences. Extensions include resizable windows and mouse support on both xterm and Linux console using the gpm library." +HOMEPAGE = "http://www.gnu.org/software/ncurses/ncurses.html" +LICENSE = "MIT" +SECTION = "libs" +DEPENDS = "ncurses-native" +DEPENDS_class-native = "" + +BINCONFIG = "${bindir}/ncurses5-config ${bindir}/ncursesw5-config \ + ${bindir}/ncurses6-config ${bindir}/ncursesw6-config" + +inherit autotools binconfig-disabled multilib_header pkgconfig + +#SRC_URI = "" + +EXTRA_AUTORECONF = "-I m4" +CONFIG_SITE =+ "${WORKDIR}/config.cache" + +EXTRASITECONFIG = "CFLAGS='${CFLAGS} -I${SYSROOT_DESTDIR}${includedir}'" + +# Whether to enable separate widec libraries; must be 'true' or 'false' +# +# TODO: remove this variable when widec is supported in every setup? +ENABLE_WIDEC ?= "true" + +# _GNU_SOURCE is required for widec stuff and is detected automatically +# for target objects. But it must be set manually for native and sdk +# builds. +BUILD_CPPFLAGS += "-D_GNU_SOURCE" + +# natives don't generally look in base_libdir +base_libdir_class-native = "${libdir}" + +# Display corruption occurs on 64 bit hosts without these settings +# This was derrived from the upstream debian ncurses which uses +# these settings for 32 and 64 bit hosts. +EXCONFIG_ARGS = "" +EXCONFIG_ARGS_class-native = " \ + --disable-lp64 \ + --with-chtype='long' \ + --with-mmask-t='long'" +EXCONFIG_ARGS_class-nativesdk = " \ + --disable-lp64 \ + --with-chtype='long' \ + --with-mmask-t='long'" + +PACKAGES_DYNAMIC = "^${PN}-lib.*" + + +# Fall back to the host termcap / terminfo for -nativesdk and -native +# The reality is a work around for strange problems with things like +# "bitbake -c menuconfig busybox" where it cannot find the terminfo +# because the sstate had a hard coded search path. Until this is fixed +# another way this is deemed good enough. +EX_TERMCAP = "" +EX_TERMCAP_class-native = ":/etc/termcap:/usr/share/misc/termcap" +EX_TERMCAP_class-nativesdk = ":/etc/termcap:/usr/share/misc/termcap" +EX_TERMINFO = "" +EX_TERMINFO_class-native = ":/etc/terminfo:/usr/share/terminfo:/usr/share/misc/terminfo:/lib/terminfo" +EX_TERMINFO_class-nativesdk = ":/etc/terminfo:/usr/share/terminfo:/usr/share/misc/terminfo:/lib/terminfo" +EX_TERMLIB ?= "tinfo" + +# Helper function for do_configure to allow multiple configurations +# $1 the directory to run configure in +# $@ the arguments to pass to configure +ncurses_configure() { + mkdir -p $1 + cd $1 + shift + oe_runconf \ + --without-debug \ + --without-ada \ + --without-gpm \ + --enable-hard-tabs \ + --enable-xmc-glitch \ + --enable-colorfgbg \ + --with-termpath='${sysconfdir}/termcap:${datadir}/misc/termcap${EX_TERMCAP}' \ + --with-terminfo-dirs='${sysconfdir}/terminfo:${datadir}/terminfo${EX_TERMINFO}' \ + --with-shared \ + --disable-big-core \ + --program-prefix= \ + --with-ticlib \ + --with-termlib=${EX_TERMLIB} \ + --enable-sigwinch \ + --enable-pc-files \ + --disable-rpath-hack \ + ${EXCONFIG_ARGS} \ + --with-manpage-format=normal \ + --disable-stripping \ + "$@" || return 1 + cd .. +} + +# Override the function from the autotools class; ncurses requires a +# patched autoconf213 to generate the configure script. This autoconf +# is not available so that the shipped script will be used. +do_configure() { + +# rm -rf ${S}/../ncurses-6.2 +# mv ${S}/../ncurses-6.2-20200411 ${S}/../ncurses-6.2 + + # check does not work with cross-compiling and is generally + # broken because it requires stdin to be pollable (which is + # not the case for /dev/null redirections) + export cf_cv_working_poll=yes + #Remove ${includedir} from CPPFLAGS, need for cross compile + sed -i 's#-I${cf_includedir}##g' ${S}/configure || die "sed CPPFLAGS" + + # The --enable-pc-files requires PKG_CONFIG_LIBDIR existed + mkdir -p ${PKG_CONFIG_LIBDIR} + ( cd ${S}; gnu-configize --force ) + ncurses_configure "narrowc" || \ + return 1 + ! ${ENABLE_WIDEC} || \ + ncurses_configure "widec" "--enable-widec" "--without-progs" + +} + +do_compile() { + oe_runmake -C narrowc libs + oe_runmake -C narrowc/progs + + ! ${ENABLE_WIDEC} || \ + oe_runmake -C widec libs +} + +# set of expected differences between narrowc and widec header +# +# TODO: the NCURSES_CH_T difference can cause real problems :( +_unifdef_cleanup = " \ + -e '\!/\* \$Id: curses.wide,v!,\!/\* \$Id: curses.tail,v!d' \ + -e '/^#define NCURSES_CH_T /d' \ + -e '/^#include /d' \ + -e '\!^/\* .* \*/!d' \ +" + +do_test[depends] = "unifdef-native:do_populate_sysroot" +do_test[dirs] = "${S}" +do_test() { + ${ENABLE_WIDEC} || return 0 + + # make sure that the narrow and widec header are compatible + # and differ only in minor details. + unifdef -k narrowc/include/curses.h | \ + sed ${_unifdef_cleanup} > curses-narrowc.h + unifdef -k widec/include/curses.h | \ + sed ${_unifdef_cleanup} > curses-widec.h + + diff curses-narrowc.h curses-widec.h +} + +# Split original _install_opts to two parts. +# One is the options to install contents, the other is the parameters \ +# when running command "make install" +# Note that install.libs will also implicitly install header files, +# so we do not need to explicitly specify install.includes. +# Doing so could in fact result in a race condition, as both targets +# (install.libs and install.includes) would install the same headers +# at the same time + +_install_opts = " install.libs install.man " + +_install_cfgs = "\ + DESTDIR='${D}' \ + PKG_CONFIG_LIBDIR='${libdir}/pkgconfig' \ +" + +do_install() { + # Order of installation is important; widec installs a 'curses.h' + # header with more definitions and must be installed last hence. + # Compatibility of these headers will be checked in 'do_test()'. + oe_runmake -C narrowc ${_install_cfgs} ${_install_opts} \ + install.progs + + # The install.data should run after install.libs, otherwise + # there would be a race issue in a very critical conditon, since + # tic will be run by install.data, and tic needs libtinfo.so + # which would be regenerated by install.libs. + oe_runmake -C narrowc ${_install_cfgs} \ + install.data + + + ! ${ENABLE_WIDEC} || \ + oe_runmake -C widec ${_install_cfgs} ${_install_opts} + + cd narrowc + + # include some basic terminfo files + # stolen ;) from gentoo and modified a bit + for x in ansi console dumb linux rxvt screen screen-256color sun vt52 vt100 vt102 vt200 vt220 xterm-color xterm-xfree86 xterm-256color + do + local termfile="$(find "${D}${datadir}/terminfo/" -name "${x}" 2>/dev/null)" + local basedir="$(basename $(dirname "${termfile}"))" + + if [ -n "${termfile}" ] + then + install -d ${D}${sysconfdir}/terminfo/${basedir} + mv ${termfile} ${D}${sysconfdir}/terminfo/${basedir}/ + ln -s /etc/terminfo/${basedir}/${x} \ + ${D}${datadir}/terminfo/${basedir}/${x} + fi + done + # i think we can use xterm-color as default xterm + if [ -e ${D}${sysconfdir}/terminfo/x/xterm-color ] + then + ln -sf xterm-color ${D}${sysconfdir}/terminfo/x/xterm + fi + + # When changing ${libdir} to e.g. /usr/lib/myawesomelib/ ncurses + # still installs '/usr/lib/terminfo', so try to rm both + # the proper path and a slightly hardcoded one + rm -f ${D}${libdir}/terminfo ${D}${prefix}/lib/terminfo + + # create linker scripts for libcurses.so and libncurses to + # link against -ltinfo when needed. Some builds might break + # else when '-Wl,--no-copy-dt-needed-entries' has been set in + # linker flags. + for i in libncurses libncursesw; do + f=${D}${libdir}/$i.so + test -h $f || continue + rm -f $f + echo '/* GNU ld script */' >$f + echo "INPUT($i.so.5 AS_NEEDED(-ltinfo))" >>$f + done + + # Make sure that libcurses is linked so that it get -ltinfo + # also, this should be addressed upstream really. + ln -sf libncurses.so ${D}${libdir}/libcurses.so + + # create libtermcap.so linker script for backward compatibility + f=${D}${libdir}/libtermcap.so + echo '/* GNU ld script */' >$f + echo 'INPUT(AS_NEEDED(-ltinfo))' >>$f + + if [ ! -d "${D}${base_libdir}" ]; then + # Setting base_libdir to libdir as is done in the -native + # case will skip this code + mkdir -p ${D}${base_libdir} + mv ${D}${libdir}/libncurses.so.* ${D}${base_libdir} + ! ${ENABLE_WIDEC} || \ + mv ${D}${libdir}/libncursesw.so.* ${D}${base_libdir} + + mv ${D}${libdir}/libtinfo.so.* ${D}${base_libdir} + rm ${D}${libdir}/libtinfo.so + + # Use lnr to ensure this is a relative link despite absolute paths + # (as we can't know the relationship between base_libdir and libdir). + # At some point we can rely on coreutils 8.16 which has ln -r. + lnr ${D}${base_libdir}/libtinfo.so.5 ${D}${libdir}/libtinfo.so + fi + if [ -d "${D}${includedir}/ncurses" ]; then + for f in `find ${D}${includedir}/ncurses -name "*.h"` + do + f=`basename $f` + test -e ${D}${includedir}/$f && continue + ln -sf ncurses/$f ${D}${includedir}/$f + done + fi + oe_multilib_header curses.h +} + +python populate_packages_prepend () { + libdir = d.expand("${libdir}") + base_libdir = d.expand("${base_libdir}") + pnbase = d.expand("${PN}-lib%s") + do_split_packages(d, libdir, r'^lib(.*)\.so\..*', pnbase, 'ncurses %s library', prepend=True, extra_depends = '', allow_links=True) + if libdir is not base_libdir: + do_split_packages(d, base_libdir, r'^lib(.*)\.so\..*', pnbase, 'ncurses %s library', prepend=True, extra_depends = '', allow_links=True) +} + + +#inherit update-alternatives + +ALTERNATIVE_PRIORITY = "100" + +ALTERNATIVE_ncurses-tools_class-target = "clear reset" + +BBCLASSEXTEND = "native nativesdk" + +PACKAGES += " \ + ${PN}-tools \ + ${PN}-terminfo-base \ + ${PN}-terminfo \ +" + +FILES_${PN} = "\ + ${bindir}/tput \ + ${bindir}/tset \ + ${bindir}/ncurses5-config \ + ${bindir}/ncursesw5-config \ + ${bindir}/ncurses6-config \ + ${bindir}/ncursesw6-config \ + ${datadir}/tabset \ +" + +# This keeps only tput/tset in ncurses +# clear/reset are in already busybox +FILES_${PN}-tools = "\ + ${bindir}/tic \ + ${bindir}/toe \ + ${bindir}/infotocap \ + ${bindir}/captoinfo \ + ${bindir}/infocmp \ + ${bindir}/clear \ + ${bindir}/reset \ + ${bindir}/tack \ + ${bindir}/tabs \ +" + +# 'reset' is a symlink to 'tset' which is in the 'ncurses' package +RDEPENDS_${PN}-tools = "${PN}" + +FILES_${PN}-terminfo = "\ + ${datadir}/terminfo \ +" + +FILES_${PN}-terminfo-base = "\ + ${sysconfdir}/terminfo \ +" + +RSUGGESTS_${PN}-libtinfo = "${PN}-terminfo" +RRECOMMENDS_${PN}-libtinfo = "${PN}-terminfo-base" diff --git a/meta-openeuler/recipes-labtools/ncurses/ncurses_6.2.bb b/meta-openeuler/recipes-labtools/ncurses/ncurses_6.2.bb new file mode 100644 index 00000000000..28cb1402f52 --- /dev/null +++ b/meta-openeuler/recipes-labtools/ncurses/ncurses_6.2.bb @@ -0,0 +1,13 @@ +require ncurses.inc +FILESEXTRAPATHS_append := "${THISDIR}/../../../../meta/recipes-core/ncurses/files/:" +LIC_FILES_CHKSUM="file://COPYING;md5=910e05334f7e0b7631da6b4ebb1e1aab" +SRC_URI = "file://ncurses/ncurses-6.2.tar.gz" + +CFLAGS_remove_arm64eb += "-O2" +CXXFLAGS_remove_arm64eb += "-O2" +CPPFLAGS_remove_arm64eb += "-O2" +CPPFLAGS_append_arm64eb += "-Os" + +EXTRA_OECONF += "--with-abi-version=5 --cache-file=${B}/config.cache" +UPSTREAM_CHECK_GITTAGREGEX = "(?P\d+(\.\d+)+(\+\d+)*)" + -- Gitee From ad84c09e6ba08f6a3845a9e030c79e0027930f91 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Mon, 1 Nov 2021 03:30:40 +0800 Subject: [PATCH 059/304] add recipe for bash Signed-off-by: zhuyan --- meta-openeuler/recipes-labtools/bash/bash.inc | 52 +++++++++++++++++++ .../recipes-labtools/bash/bash_5.1.bb | 11 ++++ 2 files changed, 63 insertions(+) create mode 100644 meta-openeuler/recipes-labtools/bash/bash.inc create mode 100644 meta-openeuler/recipes-labtools/bash/bash_5.1.bb diff --git a/meta-openeuler/recipes-labtools/bash/bash.inc b/meta-openeuler/recipes-labtools/bash/bash.inc new file mode 100644 index 00000000000..82d5bf94680 --- /dev/null +++ b/meta-openeuler/recipes-labtools/bash/bash.inc @@ -0,0 +1,52 @@ +DESCRIPTION = "An sh-compatible command language interpreter." +HOMEPAGE = "http://cnswww.cns.cwru.edu/~chet/bash/bashtop.html" +SECTION = "base/shell" + +DEPENDS = "ncurses bison-native" + +#inherit autotools gettext update-alternatives ptest +inherit autotools gettext + +EXTRA_OECONF = "--enable-job-control" + +ALTERNATIVE_${PN} = "sh" +ALTERNATIVE_LINK_NAME[sh] = "${base_bindir}/sh" +ALTERNATIVE_TARGET[sh] = "${base_bindir}/bash" +ALTERNATIVE_PRIORITY = "100" + +export AUTOHEADER = "true" + +RDEPENDS_${PN}-ptest += "make" + +PARALLEL_MAKE = "" +do_configure_prepend () { + rm -f ${S}/y.tab.c + if [ ! -e ${S}/acinclude.m4 ]; then + cat ${S}/aclocal.m4 > ${S}/acinclude.m4 + fi +} + +do_compile_ptest () { + oe_runmake buildtest +} + +do_install_append () { + # Move /usr/bin/bash to /bin/bash, if need + if [ "${base_bindir}" != "${bindir}" ]; then + mkdir -p ${D}${base_bindir} + mv ${D}${bindir}/bash ${D}${base_bindir} + fi +} + +do_install_ptest () { + make INSTALL_TEST_DIR=${D}${PTEST_PATH}/tests install-test + cp ${B}/Makefile ${D}${PTEST_PATH} + sed -i 's/^Makefile/_Makefile/' ${D}${PTEST_PATH}/Makefile +} + +pkg_postinst_${PN} () { + touch $D${sysconfdir}/shells + grep -q "bin/bash" $D${sysconfdir}/shells || echo /bin/bash >> $D${sysconfdir}/shells + grep -q "bin/sh" $D${sysconfdir}/shells || echo /bin/sh >> $D${sysconfdir}/shells +} +FILES_${PN}-dev += "${libdir}/bash/*" diff --git a/meta-openeuler/recipes-labtools/bash/bash_5.1.bb b/meta-openeuler/recipes-labtools/bash/bash_5.1.bb new file mode 100644 index 00000000000..5f67a448c72 --- /dev/null +++ b/meta-openeuler/recipes-labtools/bash/bash_5.1.bb @@ -0,0 +1,11 @@ +require bash.inc + +LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" + +SRC_URI = "file://bash/bash-5.1.tar.gz" + +# GPLv2+ (< 4.0), GPLv3+ (>= 4.0) +LICENSE = "GPLv3+" + + +BBCLASSEXTEND = "nativesdk" -- Gitee From 77b693b84cb3682eeb4da7c0f1f29e714542381b Mon Sep 17 00:00:00 2001 From: zhuyan Date: Thu, 23 Sep 2021 22:50:58 +0800 Subject: [PATCH 060/304] fix bash compile error Signed-off-by: zhuyan --- meta-openeuler/recipes-labtools/bash/bash.inc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/meta-openeuler/recipes-labtools/bash/bash.inc b/meta-openeuler/recipes-labtools/bash/bash.inc index 82d5bf94680..64f82c4a897 100644 --- a/meta-openeuler/recipes-labtools/bash/bash.inc +++ b/meta-openeuler/recipes-labtools/bash/bash.inc @@ -19,6 +19,11 @@ export AUTOHEADER = "true" RDEPENDS_${PN}-ptest += "make" PARALLEL_MAKE = "" + +do_configure () { + oe_runconf +} + do_configure_prepend () { rm -f ${S}/y.tab.c if [ ! -e ${S}/acinclude.m4 ]; then -- Gitee From 6f5e491dc8fd6e98b8134c781041dcfce95101b0 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Fri, 24 Sep 2021 19:34:21 +0800 Subject: [PATCH 061/304] remove root login passwd for the first startup Signed-off-by: zhuyan --- meta-openeuler/recipes-core/os-base/os-base/shadow | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/recipes-core/os-base/os-base/shadow b/meta-openeuler/recipes-core/os-base/os-base/shadow index 988556e4555..c2935329305 100644 --- a/meta-openeuler/recipes-core/os-base/os-base/shadow +++ b/meta-openeuler/recipes-core/os-base/os-base/shadow @@ -1,2 +1,2 @@ -root:$6$WthYamqr$nkDUajqkYZ0HWYLY93LOa79W0Bgoc1sNY357EXjsJ4d/VtZBIZGQHAP3/GJ42.QvEwTy7LCwWn0FQ.QRyfkjW/:0:0:99999:7::: +root::0:0:99999:7::: sshd:!:11880:0:90:7:-1:-1:0 -- Gitee From 974ee26ad9e4f4b44fe279ec0ad3c5ebcb218d94 Mon Sep 17 00:00:00 2001 From: jenneyhe Date: Sun, 26 Sep 2021 19:55:02 +0800 Subject: [PATCH 062/304] rc.local: 1. change the way of starting auditd 2. change some files' permission to ensure security Signed-off-by: jenneyhe --- meta-openeuler/recipes-core/os-base/os-base/rc.local | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/meta-openeuler/recipes-core/os-base/os-base/rc.local b/meta-openeuler/recipes-core/os-base/os-base/rc.local index 8a74590bcec..6bea6a95f54 100644 --- a/meta-openeuler/recipes-core/os-base/os-base/rc.local +++ b/meta-openeuler/recipes-core/os-base/os-base/rc.local @@ -1,4 +1,8 @@ #!/bin/bash -/sbin/auditd +. /etc/init.d/auditd start /sbin/syslogd + +chmod 640 /var/log/* +chmod 640 /dev/mem +chmod 600 /var/log/audit/audit.log -- Gitee From 15e3ead4ded2be09d08b58da611b5defe24e152c Mon Sep 17 00:00:00 2001 From: zhuyan Date: Sun, 26 Sep 2021 19:57:44 +0800 Subject: [PATCH 063/304] deamon do not support attach and pause Signed-off-by: dongxinhua Signed-off-by: zhuyan --- ...able-selinux-not-selinux-label-file.patch} | 0 ...patch => 0002-delete-call-setlocale.patch} | 0 ...atch => 0003-modify-printf-to-arm32.patch} | 0 ...amon-do-not-support-attach-and-pause.patch | 46 +++++++++++++++++++ .../recipes-core/iSulad/iSulad_2.0.9.bb | 7 +-- 5 files changed, 50 insertions(+), 3 deletions(-) rename meta-openeuler/recipes-core/iSulad/iSulad/{fix_bug_disable_selinux_not_selinux_label_file.patch => 0001-fix-bug-disable-selinux-not-selinux-label-file.patch} (100%) rename meta-openeuler/recipes-core/iSulad/iSulad/{delete_call_setlocale.patch => 0002-delete-call-setlocale.patch} (100%) rename meta-openeuler/recipes-core/iSulad/iSulad/{modify_printf_to_arm32.patch => 0003-modify-printf-to-arm32.patch} (100%) create mode 100644 meta-openeuler/recipes-core/iSulad/iSulad/0004-deamon-do-not-support-attach-and-pause.patch diff --git a/meta-openeuler/recipes-core/iSulad/iSulad/fix_bug_disable_selinux_not_selinux_label_file.patch b/meta-openeuler/recipes-core/iSulad/iSulad/0001-fix-bug-disable-selinux-not-selinux-label-file.patch similarity index 100% rename from meta-openeuler/recipes-core/iSulad/iSulad/fix_bug_disable_selinux_not_selinux_label_file.patch rename to meta-openeuler/recipes-core/iSulad/iSulad/0001-fix-bug-disable-selinux-not-selinux-label-file.patch diff --git a/meta-openeuler/recipes-core/iSulad/iSulad/delete_call_setlocale.patch b/meta-openeuler/recipes-core/iSulad/iSulad/0002-delete-call-setlocale.patch similarity index 100% rename from meta-openeuler/recipes-core/iSulad/iSulad/delete_call_setlocale.patch rename to meta-openeuler/recipes-core/iSulad/iSulad/0002-delete-call-setlocale.patch diff --git a/meta-openeuler/recipes-core/iSulad/iSulad/modify_printf_to_arm32.patch b/meta-openeuler/recipes-core/iSulad/iSulad/0003-modify-printf-to-arm32.patch similarity index 100% rename from meta-openeuler/recipes-core/iSulad/iSulad/modify_printf_to_arm32.patch rename to meta-openeuler/recipes-core/iSulad/iSulad/0003-modify-printf-to-arm32.patch diff --git a/meta-openeuler/recipes-core/iSulad/iSulad/0004-deamon-do-not-support-attach-and-pause.patch b/meta-openeuler/recipes-core/iSulad/iSulad/0004-deamon-do-not-support-attach-and-pause.patch new file mode 100644 index 00000000000..fd79536eba3 --- /dev/null +++ b/meta-openeuler/recipes-core/iSulad/iSulad/0004-deamon-do-not-support-attach-and-pause.patch @@ -0,0 +1,46 @@ +From 6a691ebaed9ecee727623d677501956500f86576 Mon Sep 17 00:00:00 2001 +From: lisimin +Date: Sun, 26 Sep 2021 17:07:32 +0800 +Subject: [PATCH] deamon do not support attach and pause + +Signed-off-by: lisimin +--- + src/cmd/isula/main.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/src/cmd/isula/main.c b/src/cmd/isula/main.c +index 476750a..e1eff2b 100644 +--- a/src/cmd/isula/main.c ++++ b/src/cmd/isula/main.c +@@ -86,6 +86,7 @@ struct command g_commands[] = { + // `inspect` sub-command + "inspect", false, cmd_inspect_main, g_cmd_inspect_desc, NULL, &g_cmd_inspect_args + }, ++#ifdef GRPC_CONNECTOR + { + // `pause` sub-command + "pause", false, cmd_pause_main, g_cmd_pause_desc, NULL, &g_cmd_pause_args +@@ -94,6 +95,7 @@ struct command g_commands[] = { + // `unpause` sub-command + "unpause", false, cmd_resume_main, g_cmd_resume_desc, NULL, &g_cmd_resume_args + }, ++#endif + #ifdef ENABLE_OCI_IMAGE + { + // `stats` sub-command +@@ -158,10 +160,12 @@ struct command g_commands[] = { + "update", false, cmd_update_main, g_cmd_update_desc, NULL, &g_cmd_update_args + }, + #endif ++#ifdef GRPC_CONNECTOR + { + // `attach` sub-command + "attach", false, cmd_attach_main, g_cmd_attach_desc, NULL, &g_cmd_attach_args + }, ++#endif + #ifdef ENABLE_OCI_IMAGE + { + // `export` sub-command +-- +2.16.4 + diff --git a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb index 14a71b8665a..cc1ca675ba7 100644 --- a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb +++ b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb @@ -4,9 +4,10 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" SRC_URI = "file://iSulad/v2.0.9.tar.gz \ - file://fix_bug_disable_selinux_not_selinux_label_file.patch \ - file://delete_call_setlocale.patch \ - file://modify_printf_to_arm32.patch \ + 0001-fix-bug-disable-selinux-not-selinux-label-file.patch \ + 0002-delete-call-setlocale.patch \ + 0003-modify-printf-to-arm32.patch \ + 0004-deamon-do-not-support-attach-and-pause.patch \ " FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -- Gitee From 18e02517df92847e6beae890393ece78efd6cdca Mon Sep 17 00:00:00 2001 From: zhuyan Date: Sun, 26 Sep 2021 20:20:26 +0800 Subject: [PATCH 064/304] fix exec 30s exit Signed-off-by: zhuyan --- .../iSulad/0005-fix-exec-30s-exit.patch | 26 +++++++++++++++++++ .../recipes-core/iSulad/iSulad_2.0.9.bb | 9 ++++--- 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 meta-openeuler/recipes-core/iSulad/iSulad/0005-fix-exec-30s-exit.patch diff --git a/meta-openeuler/recipes-core/iSulad/iSulad/0005-fix-exec-30s-exit.patch b/meta-openeuler/recipes-core/iSulad/iSulad/0005-fix-exec-30s-exit.patch new file mode 100644 index 00000000000..76a79ee04b6 --- /dev/null +++ b/meta-openeuler/recipes-core/iSulad/iSulad/0005-fix-exec-30s-exit.patch @@ -0,0 +1,26 @@ +From 17355d674552731da40d80855ad2c50db3d60f25 Mon Sep 17 00:00:00 2001 +From: lisimin +Date: Sun, 26 Sep 2021 20:05:54 +0800 +Subject: [PATCH] fix exec 30s exit + +Signed-off-by: lisimin +--- + src/utils/http/http.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/src/utils/http/http.c b/src/utils/http/http.c +index 0dcbcd5..72f9c9e 100644 +--- a/src/utils/http/http.c ++++ b/src/utils/http/http.c +@@ -424,8 +424,6 @@ int http_request(const char *url, struct http_get_options *options, long *respon + /* complete connection within 30 seconds */ + curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT, 30L); + /* if less than 1k data is received in 30s, abort */ +- curl_easy_setopt(curl_handle, CURLOPT_LOW_SPEED_LIMIT, 1024L); +- curl_easy_setopt(curl_handle, CURLOPT_LOW_SPEED_TIME, 30L); + /* provide a buffer to store errors in */ + curl_easy_setopt(curl_handle, CURLOPT_ERRORBUFFER, errbuf); + curl_easy_setopt(curl_handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); +-- +2.16.4 + diff --git a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb index cc1ca675ba7..80267cbbb35 100644 --- a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb +++ b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb @@ -4,10 +4,11 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" SRC_URI = "file://iSulad/v2.0.9.tar.gz \ - 0001-fix-bug-disable-selinux-not-selinux-label-file.patch \ - 0002-delete-call-setlocale.patch \ - 0003-modify-printf-to-arm32.patch \ - 0004-deamon-do-not-support-attach-and-pause.patch \ + file://0001-fix-bug-disable-selinux-not-selinux-label-file.patch \ + file://0002-delete-call-setlocale.patch \ + file://0003-modify-printf-to-arm32.patch \ + file://0004-deamon-do-not-support-attach-and-pause.patch \ + file://0005-fix-exec-30s-exit.patch \ " FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -- Gitee From 824740507f5c695f3724f7faff325adc67835513 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Mon, 27 Sep 2021 11:32:49 +0800 Subject: [PATCH 065/304] remove /opt mount Signed-off-by: zhuyan --- meta-openeuler/recipes-core/os-base/os-base/fstab | 1 - 1 file changed, 1 deletion(-) diff --git a/meta-openeuler/recipes-core/os-base/os-base/fstab b/meta-openeuler/recipes-core/os-base/os-base/fstab index a1ddb366b70..bf3c16e8aa9 100644 --- a/meta-openeuler/recipes-core/os-base/os-base/fstab +++ b/meta-openeuler/recipes-core/os-base/os-base/fstab @@ -6,4 +6,3 @@ devtmpfs /dev devtmpfs defaults 0 0 tmpfs /dev/shm tmpfs nodev,nosuid,mode=1777,noexec 0 0 devpts /dev/pts devpts mode=620 0 0 tmpfs /tmp tmpfs nodev,nosuid,noexec 0 0 -tmpfs /opt tmpfs defaults,mode=0750 0 0 -- Gitee From 387a701bc8f754fccaba254c79cbe24819656632 Mon Sep 17 00:00:00 2001 From: zhuyan Date: Mon, 27 Sep 2021 11:34:49 +0800 Subject: [PATCH 066/304] fix alarms during audit startup Signed-off-by: zhuyan --- meta-openeuler/recipes-core/audit/files/auditd | 4 ---- 1 file changed, 4 deletions(-) diff --git a/meta-openeuler/recipes-core/audit/files/auditd b/meta-openeuler/recipes-core/audit/files/auditd index 9abf2f9f367..938dd8892f3 100644 --- a/meta-openeuler/recipes-core/audit/files/auditd +++ b/meta-openeuler/recipes-core/audit/files/auditd @@ -28,10 +28,6 @@ SCRIPTNAME=/etc/init.d/"$NAME" # Read configuration variable file if it is present [ -r /etc/default/"$NAME" ] && . /etc/default/"$NAME" -. /etc/default/rcS - -. /etc/init.d/functions - # # Function that starts the daemon/service # -- Gitee From 06046a56587bd5021084fd6efb762c93e835f15c Mon Sep 17 00:00:00 2001 From: zhuyan Date: Tue, 28 Sep 2021 20:05:58 +0800 Subject: [PATCH 067/304] fix serval files permission problem Signed-off-by: zhuyan --- .../openssh/openssh/config/common/sshd_check_keys | 1 + meta-openeuler/recipes-core/os-base/os-base_1.0.bb | 4 +--- .../{os-base/os-base => shadow/files}/login.defs | 0 meta-openeuler/recipes-core/shadow/shadow.inc | 5 ++++- 4 files changed, 6 insertions(+), 4 deletions(-) rename meta-openeuler/recipes-core/{os-base/os-base => shadow/files}/login.defs (100%) diff --git a/meta-openeuler/recipes-core/openssh/openssh/config/common/sshd_check_keys b/meta-openeuler/recipes-core/openssh/openssh/config/common/sshd_check_keys index 1931dc71537..dbd50743863 100644 --- a/meta-openeuler/recipes-core/openssh/openssh/config/common/sshd_check_keys +++ b/meta-openeuler/recipes-core/openssh/openssh/config/common/sshd_check_keys @@ -25,6 +25,7 @@ generate_key() { sync "${FILE}.pub" "$DIR" "${FILE}.tmp" mv "${FILE}.tmp" "$FILE" + chmod 400 "$FILE" # sync to ensure the atomic rename is committed sync "$DIR" diff --git a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb index 82521a72fd0..e32abb8290b 100644 --- a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb +++ b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb @@ -15,7 +15,6 @@ SRC_URI = "file://bashrc \ file://issue \ file://issue.net \ file://LICENSE \ - file://login.defs \ file://motd \ file://passwd \ file://profile \ @@ -34,8 +33,7 @@ do_install() { cp ${WORKDIR}/inittab ${D}/etc/ cp ${WORKDIR}/issue ${D}/etc/ cp ${WORKDIR}/issue.net ${D}/etc/ - cp ${WORKDIR}/login.defs ${D}/etc/ - cp ${WORKDIR}/motd ${D}/etc/ + cp ${WORKDIR}/motd ${D}/etc/ cp ${WORKDIR}/passwd ${D}/etc/ cp ${WORKDIR}/profile ${D}/etc/ cp ${WORKDIR}/securetty ${D}/etc/ diff --git a/meta-openeuler/recipes-core/os-base/os-base/login.defs b/meta-openeuler/recipes-core/shadow/files/login.defs similarity index 100% rename from meta-openeuler/recipes-core/os-base/os-base/login.defs rename to meta-openeuler/recipes-core/shadow/files/login.defs diff --git a/meta-openeuler/recipes-core/shadow/shadow.inc b/meta-openeuler/recipes-core/shadow/shadow.inc index d227de122c9..86bb18f4c19 100644 --- a/meta-openeuler/recipes-core/shadow/shadow.inc +++ b/meta-openeuler/recipes-core/shadow/shadow.inc @@ -79,7 +79,9 @@ SRC_URI += "file://pam.d/chfn \ file://pam.d/newusers \ file://pam.d/passwd \ file://pam.d/su \ - file://pam.d/groupmems" + file://pam.d/groupmems \ + file://login.defs \ + " do_install() { oe_runmake DESTDIR="${D}" sbindir="${base_sbindir}" usbindir="${sbindir}" install @@ -169,6 +171,7 @@ do_install_append() { # Handle link properly after rename, otherwise missing files would # lead rpm failed dependencies. ln -sf newgrp.${BPN} ${D}${bindir}/sg + cp ${WORKDIR}/login.defs ${D}${sysconfdir}/ } PACKAGES =+ "${PN}-base" -- Gitee From f663b8096c1ad014dcb8e61f2cb164aec234c591 Mon Sep 17 00:00:00 2001 From: lisimin Date: Wed, 27 Oct 2021 16:03:33 +0800 Subject: [PATCH 068/304] lcr upgrade to 2.0.6 Signed-off-by: zhuyan --- .../recipes-core/lcr/{lcr_2.0.5.bb => lcr_2.0.6.bb} | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) rename meta-openeuler/recipes-core/lcr/{lcr_2.0.5.bb => lcr_2.0.6.bb} (59%) diff --git a/meta-openeuler/recipes-core/lcr/lcr_2.0.5.bb b/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb similarity index 59% rename from meta-openeuler/recipes-core/lcr/lcr_2.0.5.bb rename to meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb index 8e16d95504e..bb40590b561 100644 --- a/meta-openeuler/recipes-core/lcr/lcr_2.0.5.bb +++ b/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb @@ -3,18 +3,7 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" -SRC_URI = "file://lcr/v2.0.5.tar.gz \ - file://lcr/0001-support-quiet-of-log-config.patch \ - file://lcr/0002-lcr-add-inactive-file-total-metric.patch \ - file://lcr/0003-lcr-add-default-runtime-field-for-isula-info.patch \ - file://lcr/0004-support-isula-exec-workdir.patch \ - file://lcr/0005-add-secure-compile-options.patch \ - file://lcr/0006-remove-invalid-fuzz-option.patch \ - file://lcr/0007-support-cgroup-v2.patch \ - file://lcr/0008-fix-pause-container-error.patch \ - file://lcr/0009-Fix-spelling-errors.patch \ - file://lcr/0010-fix-memory-usage-of-stats-not-right-when-runtime-is-.patch \ - file://lcr/0011-support-auto-resize-of-isulad-shim.patch \ +SRC_URI = "file://lcr/v2.0.6.tar.gz \ " FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -- Gitee From 785cd756d56df66edf9255c54c62c2f771c324b8 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Wed, 10 Nov 2021 23:03:42 +0800 Subject: [PATCH 069/304] do some code style clean and typo fixes * bbclash->bbclass * replace HM** with EULER * replace deprecated e.data.xxx with d.xxxx Signed-off-by: Wayne Ren --- meta-openeuler/classes/eulertoolchain.bbclass | 21 +++++++++---------- ...onfig.bbclash => get_euler_config.bbclass} | 0 2 files changed, 10 insertions(+), 11 deletions(-) rename meta-openeuler/classes/{get_euler_config.bbclash => get_euler_config.bbclass} (100%) diff --git a/meta-openeuler/classes/eulertoolchain.bbclass b/meta-openeuler/classes/eulertoolchain.bbclass index 39670fd598f..7529057b2c4 100644 --- a/meta-openeuler/classes/eulertoolchain.bbclass +++ b/meta-openeuler/classes/eulertoolchain.bbclass @@ -20,30 +20,29 @@ def eulertoolchain_euler_prefix_to_raw(euler_prefix): return eulertoolchain_raw_prefix(arch) python eulertoolchain_virtclass_handler () { - cls = e.data.getVar("BBEXTENDCURR") - variant = e.data.getVar("BBEXTENDVARIANT") + cls = d.getVar("BBEXTENDCURR") + variant = d.getVar("BBEXTENDVARIANT") if cls != "eulertoolchain" or not variant: return - e.data.setVar("PN", e.data.getVar("PN", False) + '-' + variant) - e.data.setVar("TARGET_ARCH", variant) + d.setVar("PN", d.getVar("PN", False) + '-' + variant) + d.setVar("TARGET_ARCH", variant) - e.data.setVar("EULER_TOOLCHAIN_SYSNAME", eulertoolchain_raw_prefix(variant)) - e.data.setVar("EULER_TOOLCHAIN_TARGET_PREFIX", eulertoolchain_euler_prefix(variant) + '-') - e.data.setVar("EULER_TOOLCHAIN_TARGET_PREFIX_RAW", eulertoolchain_euler_prefix(variant)) + d.setVar("EULER_TOOLCHAIN_SYSNAME", eulertoolchain_raw_prefix(variant)) + d.setVar("EULER_TOOLCHAIN_TARGET_PREFIX", eulertoolchain_euler_prefix(variant) + '-') + d.setVar("EULER_TOOLCHAIN_TARGET_PREFIX_RAW", eulertoolchain_euler_prefix(variant)) - e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + + d.setVar("OVERRIDES", d.getVar("OVERRIDES", False) + ":{}".format(variant.replace('_', '-'))) } addhandler eulertoolchain_virtclass_handler eulertoolchain_virtclass_handler[eventmask] = "bb.event.RecipePreFinalise" -#_HMTOOLCHAIN_SUPPORT_ARCHS := "aarch64 aarch64_be arm armeb" -_HMTOOLCHAIN_SUPPORT_ARCHS := "aarch64 arm" +_EULERTOOLCHAIN_SUPPORT_ARCHS := "aarch64 arm" def toolchain_bbclassextend(d, cls, variant): - support_archs = d.getVar("_HMTOOLCHAIN_SUPPORT_ARCHS", True) + support_archs = d.getVar("_EULERTOOLCHAIN_SUPPORT_ARCHS", True) exts = [] for arch in support_archs.split(): exts.append('{}:{}{}'.format(cls, variant, arch)) diff --git a/meta-openeuler/classes/get_euler_config.bbclash b/meta-openeuler/classes/get_euler_config.bbclass similarity index 100% rename from meta-openeuler/classes/get_euler_config.bbclash rename to meta-openeuler/classes/get_euler_config.bbclass -- Gitee From 236c131450066a537c6d7e33ed2276d9368f7586 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 11 Nov 2021 16:18:25 +0800 Subject: [PATCH 070/304] add recipe for sed Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/sed/sed/run-ptest | 5 ++ meta-openeuler/recipes-core/sed/sed_4.8.bb | 69 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 meta-openeuler/recipes-core/sed/sed/run-ptest create mode 100644 meta-openeuler/recipes-core/sed/sed_4.8.bb diff --git a/meta-openeuler/recipes-core/sed/sed/run-ptest b/meta-openeuler/recipes-core/sed/sed/run-ptest new file mode 100644 index 00000000000..993d7d5d75e --- /dev/null +++ b/meta-openeuler/recipes-core/sed/sed/run-ptest @@ -0,0 +1,5 @@ +#!/bin/sh + +chown nobody testsuite +chown nobody ../ptest +su nobody -c "make test-suite.log" diff --git a/meta-openeuler/recipes-core/sed/sed_4.8.bb b/meta-openeuler/recipes-core/sed/sed_4.8.bb new file mode 100644 index 00000000000..bd33baf32b5 --- /dev/null +++ b/meta-openeuler/recipes-core/sed/sed_4.8.bb @@ -0,0 +1,69 @@ +SUMMARY = "Stream EDitor (text filtering utility)" +HOMEPAGE = "http://www.gnu.org/software/sed/" +DESCRIPTION = "sed (stream editor) is a non-interactive command-line text editor." +LICENSE = "GPLv3+" +LIC_FILES_CHKSUM = "file://COPYING;md5=c678957b0c8e964aa6c70fd77641a71e \ + file://sed/sed.h;beginline=1;endline=15;md5=fb3c7e6fbca6f66943859153d4be8efe \ + " +SECTION = "console/utils" + +SRC_URI = "${GNU_MIRROR}/sed/sed-${PV}.tar.xz \ + file://run-ptest \ +" + +SRC_URI[md5sum] = "6d906edfdb3202304059233f51f9a71d" +SRC_URI[sha256sum] = "f79b0cfea71b37a8eeec8490db6c5f7ae7719c35587f21edb0617f370eeff633" + +#inherit autotools texinfo update-alternatives gettext ptest +inherit autotools texinfo gettext + +PACKAGECONFIG[selinux] = "--with-selinux,--without-selinux,libselinux" + +RDEPENDS_${PN}-ptest += "make gawk perl perl-module-filehandle perl-module-file-compare perl-module-file-find perl-module-file-temp perl-module-file-stat" +RRECOMMENDS_${PN}-ptest_append_libc-glibc = " locale-base-ru-ru locale-base-en-us locale-base-el-gr.iso-8859-7" + +EXTRA_OECONF = "--disable-acl \ + " + +do_install () { + autotools_do_install + install -d ${D}${base_bindir} + if [ ! ${D}${bindir} -ef ${D}${base_bindir} ]; then + mv ${D}${bindir}/sed ${D}${base_bindir}/sed + rmdir ${D}${bindir}/ + fi +} + +ALTERNATIVE_${PN} = "sed" +ALTERNATIVE_LINK_NAME[sed] = "${base_bindir}/sed" +ALTERNATIVE_PRIORITY = "100" + +do_compile_ptest() { + oe_runmake testsuite/get-mb-cur-max testsuite/test-mbrtowc +} + +do_install_ptest() { + cp -rf ${S}/testsuite/ ${D}${PTEST_PATH} + cp -rf ${B}/testsuite/* ${D}${PTEST_PATH}/testsuite/ + cp -rf ${S}/build-aux/ ${D}${PTEST_PATH}/ + cp ${B}/Makefile ${D}${PTEST_PATH} + cp ${S}/init.cfg ${D}${PTEST_PATH} + + sed -e 's/^Makefile:/_Makefile:/' -e 's/^srcdir = \(.*\)/srcdir = ./' -e 's/bash/sh/' -i ${D}${PTEST_PATH}/Makefile + for i in `grep -rl "sed/sed" ${D}${PTEST_PATH}`; do sed -e 's/..\/sed\/sed/sed/' -i $i; done + + sed -e 's,--sysroot=${STAGING_DIR_TARGET},,g' \ + -e 's|${DEBUG_PREFIX_MAP}||g' \ + -e 's:${HOSTTOOLS_DIR}/::g' \ + -e 's:${RECIPE_SYSROOT_NATIVE}::g' \ + -e 's:abs_top_builddir =.*:abs_top_builddir = ..:g' \ + -e 's:abs_top_srcdir =.*:abs_top_srcdir = ..:g' \ + -e 's:abs_srcdir =.*:abs_srcdir = ..:g' \ + -e 's:top_srcdir =.*:top_srcdir = ..:g' \ + -e 's:${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}::g' \ + -i ${D}${PTEST_PATH}/Makefile +} + +RPROVIDES_${PN} += "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '/bin/sed', '', d)}" + +BBCLASSEXTEND = "nativesdk" -- Gitee From 69670ad7bd9ccaf0a677c7b6cb56da8b69c69797 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 11 Nov 2021 16:19:55 +0800 Subject: [PATCH 071/304] add recipe for grep Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/grep/grep_3.6.bb | 46 ++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 meta-openeuler/recipes-core/grep/grep_3.6.bb diff --git a/meta-openeuler/recipes-core/grep/grep_3.6.bb b/meta-openeuler/recipes-core/grep/grep_3.6.bb new file mode 100644 index 00000000000..0e648199734 --- /dev/null +++ b/meta-openeuler/recipes-core/grep/grep_3.6.bb @@ -0,0 +1,46 @@ +SUMMARY = "GNU grep utility" +HOMEPAGE = "http://savannah.gnu.org/projects/grep/" +DESCRIPTION = "Grep searches one or more input files for lines containing a match to a specified pattern. By default, grep prints the matching lines." +BUGTRACKER = "http://savannah.gnu.org/bugs/?group=grep" +SECTION = "console/utils" +LICENSE = "GPLv3" +LIC_FILES_CHKSUM = "file://COPYING;md5=1ebbd3e34237af26da5dc08a4e440464" + +SRC_URI = "${GNU_MIRROR}/grep/grep-${PV}.tar.xz" + +SRC_URI[sha256sum] = "667e15e8afe189e93f9f21a7cd3a7b3f776202f417330b248c2ad4f997d9373e" + +inherit autotools gettext texinfo pkgconfig + +# Fix "Argument list too long" error when len(TMPDIR) = 410 +acpaths = "-I ./m4" + +do_configure_prepend () { + sed -i -e '1s,#!@SHELL@,#!/bin/sh,' ${S}/src/egrep.sh + rm -f ${S}/m4/init.m4 +} + +do_install () { + autotools_do_install + if [ "${base_bindir}" != "${bindir}" ]; then + install -d ${D}${base_bindir} + mv ${D}${bindir}/grep ${D}${base_bindir}/grep + mv ${D}${bindir}/egrep ${D}${base_bindir}/egrep + mv ${D}${bindir}/fgrep ${D}${base_bindir}/fgrep + rmdir ${D}${bindir}/ + fi +} + +#inherit update-alternatives + +PACKAGECONFIG ??= "pcre" +PACKAGECONFIG[pcre] = "--enable-perl-regexp,--disable-perl-regexp,libpcre" + +ALTERNATIVE_PRIORITY = "100" + +ALTERNATIVE_${PN} = "grep egrep fgrep" +ALTERNATIVE_LINK_NAME[grep] = "${base_bindir}/grep" +ALTERNATIVE_LINK_NAME[egrep] = "${base_bindir}/egrep" +ALTERNATIVE_LINK_NAME[fgrep] = "${base_bindir}/fgrep" + +BBCLASSEXTEND = "nativesdk" -- Gitee From 0ab9df98449df6f5778444ab29924254ea01ee5f Mon Sep 17 00:00:00 2001 From: liangfangping Date: Tue, 23 Nov 2021 11:36:19 +0800 Subject: [PATCH 072/304] modify the conf for compiling error Signed-off-by: liangfangping --- meta-openeuler/conf/bblayers.conf.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/conf/bblayers.conf.sample b/meta-openeuler/conf/bblayers.conf.sample index 3053c1ed1a1..4661f5027db 100644 --- a/meta-openeuler/conf/bblayers.conf.sample +++ b/meta-openeuler/conf/bblayers.conf.sample @@ -9,5 +9,5 @@ BBLAYERS ?= " \ ##OEROOT##/meta \ ##OEROOT##/meta-poky \ ##OEROOT##/meta-yocto-bsp \ - ##OEROOT##/../yocto-meta-embedded/meta-openeuler \ + ##OEROOT##/../yocto-meta-openeuler/meta-openeuler \ " -- Gitee From b1e429688ea3360b985413a89617707b7087a9cc Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Wed, 17 Nov 2021 09:37:51 +0800 Subject: [PATCH 073/304] add recipe for xz Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/xz/xz_5.2.5.bb | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 meta-openeuler/recipes-core/xz/xz_5.2.5.bb diff --git a/meta-openeuler/recipes-core/xz/xz_5.2.5.bb b/meta-openeuler/recipes-core/xz/xz_5.2.5.bb new file mode 100644 index 00000000000..63a91fc556a --- /dev/null +++ b/meta-openeuler/recipes-core/xz/xz_5.2.5.bb @@ -0,0 +1,45 @@ +SUMMARY = "Utilities for managing LZMA compressed files" +HOMEPAGE = "https://tukaani.org/xz/" +DESCRIPTION = "XZ Utils is free general-purpose data compression software with a high compression ratio. XZ Utils were written for POSIX-like systems, but also work on some not-so-POSIX systems. XZ Utils are the successor to LZMA Utils." +SECTION = "base" + +# The source includes bits of PD, GPLv2, GPLv3, LGPLv2.1+, but the only file +# which is GPLv3 is an m4 macro which isn't shipped in any of our packages, +# and the LGPL bits are under lib/, which appears to be used for libgnu, which +# appears to be used for DOS builds. So we're left with GPLv2+ and PD. +LICENSE = "GPLv2+ & GPL-3.0-with-autoconf-exception & LGPLv2.1+ & PD" +LICENSE_${PN} = "GPLv2+" +LICENSE_${PN}-dev = "GPLv2+" +LICENSE_${PN}-staticdev = "GPLv2+" +LICENSE_${PN}-doc = "GPLv2+" +LICENSE_${PN}-dbg = "GPLv2+" +LICENSE_${PN}-locale = "GPLv2+" +LICENSE_liblzma = "PD" + +LIC_FILES_CHKSUM = "file://COPYING;md5=97d554a32881fee0aa283d96e47cb24a \ + file://COPYING.GPLv2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ + file://COPYING.GPLv3;md5=d32239bcb673463ab874e80d47fae504 \ + file://COPYING.LGPLv2.1;md5=4fbd65380cdd255951079008b364516c \ + file://lib/getopt.c;endline=23;md5=2069b0ee710572c03bb3114e4532cd84 \ + " + +SRC_URI = "https://tukaani.org/xz/xz-${PV}.tar.gz" +SRC_URI[md5sum] = "0d270c997aff29708c74d53f599ef717" +SRC_URI[sha256sum] = "f6f4910fd033078738bd82bfba4f49219d03b17eb0794eb91efbae419f4aba10" +UPSTREAM_CHECK_REGEX = "xz-(?P\d+(\.\d+)+)\.tar" + +CACHED_CONFIGUREVARS += "gl_cv_posix_shell=/bin/sh" + +inherit autotools gettext + +PACKAGES =+ "liblzma" + +FILES_liblzma = "${libdir}/liblzma*${SOLIBS}" + +#inherit update-alternatives + +ALTERNATIVE_PRIORITY = "100" +ALTERNATIVE_${PN} = "xz xzcat unxz \ + lzma lzcat unlzma" + +BBCLASSEXTEND = "native nativesdk" -- Gitee From 199a8b7b84e3f61fae80cbcb2c39a4c14c378df3 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Wed, 17 Nov 2021 10:52:53 +0800 Subject: [PATCH 074/304] add recipe for gzip Signed-off-by: lixiaoyong --- .../recipes-core/gzip/files/run-ptest | 6 +++ .../gzip/gzip-1.10/wrong-path-fix.patch | 36 +++++++++++++++++ meta-openeuler/recipes-core/gzip/gzip.inc | 33 +++++++++++++++ meta-openeuler/recipes-core/gzip/gzip_1.10.bb | 40 +++++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 meta-openeuler/recipes-core/gzip/files/run-ptest create mode 100644 meta-openeuler/recipes-core/gzip/gzip-1.10/wrong-path-fix.patch create mode 100644 meta-openeuler/recipes-core/gzip/gzip.inc create mode 100644 meta-openeuler/recipes-core/gzip/gzip_1.10.bb diff --git a/meta-openeuler/recipes-core/gzip/files/run-ptest b/meta-openeuler/recipes-core/gzip/files/run-ptest new file mode 100644 index 00000000000..cf7c64949ab --- /dev/null +++ b/meta-openeuler/recipes-core/gzip/files/run-ptest @@ -0,0 +1,6 @@ +#!/bin/sh + +cd src/tests + +make check + diff --git a/meta-openeuler/recipes-core/gzip/gzip-1.10/wrong-path-fix.patch b/meta-openeuler/recipes-core/gzip/gzip-1.10/wrong-path-fix.patch new file mode 100644 index 00000000000..7c37bc8d2d9 --- /dev/null +++ b/meta-openeuler/recipes-core/gzip/gzip-1.10/wrong-path-fix.patch @@ -0,0 +1,36 @@ +fix MakeMaker issues with using wrong SHELL/GREP + +A set of substitution is being processed to all target scripts with sed by +replacing some key words with the detected values at configure time, this +is exactly not compliant with cross compling, and will cause missing path +errors at run time like: +"/usr/bin/zgrep: line 230: /usr/bin/grep: No such file or directory" + +Fixed by removing unneeded substitution and using real runtime paths +instead. + +Signed-off-by: Ming Liu + +Upstream-Status: Pending + +--- + Makefile.am | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index d4ecc3f..e4657d2 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -82,8 +82,7 @@ SUFFIXES = .in + .in: + $(AM_V_GEN)rm -f $@-t $@ \ + && sed \ +- -e 's|/bin/sh|$(SHELL)|g' \ +- -e 's|[@]GREP@|$(GREP)|g' \ ++ -e 's|[@]GREP@|$(base_bindir)/grep|g' \ + -e 's|[@]VERSION@|$(VERSION)|g' \ + $(srcdir)/$@.in >$@-t \ + && chmod a=rx $@-t \ +-- +2.7.4 + diff --git a/meta-openeuler/recipes-core/gzip/gzip.inc b/meta-openeuler/recipes-core/gzip/gzip.inc new file mode 100644 index 00000000000..1a0747dff83 --- /dev/null +++ b/meta-openeuler/recipes-core/gzip/gzip.inc @@ -0,0 +1,33 @@ +SUMMARY = "Standard GNU compressor" +DESCRIPTION = "GNU Gzip is a popular data compression program originally written by Jean-loup Gailly for the GNU \ +project. Mark Adler wrote the decompression part" +HOMEPAGE = "http://www.gnu.org/software/gzip/" +SECTION = "console/utils" +# change to GPLv3+ in 2007/07. Previous GPLv2 version is 1.3.12 + +inherit autotools texinfo +export DEFS="NO_ASM" + +EXTRA_OEMAKE_class-target = "GREP=${base_bindir}/grep" +EXTRA_OECONF_append_libc-musl = " gl_cv_func_fflush_stdin=yes " + +do_install_append () { + if [ "${base_bindir}" != "${bindir}" ]; then + # Rename and move files into /bin (FHS), which is typical place for gzip + install -d ${D}${base_bindir} + mv ${D}${bindir}/gunzip ${D}${base_bindir}/gunzip + mv ${D}${bindir}/gzip ${D}${base_bindir}/gzip + mv ${D}${bindir}/zcat ${D}${base_bindir}/zcat + mv ${D}${bindir}/uncompress ${D}${base_bindir}/uncompress + fi +} + +#inherit update-alternatives + +ALTERNATIVE_PRIORITY = "100" +ALTERNATIVE_${PN} = "gunzip gzip zcat" +ALTERNATIVE_LINK_NAME[gunzip] = "${base_bindir}/gunzip" +ALTERNATIVE_LINK_NAME[gzip] = "${base_bindir}/gzip" +ALTERNATIVE_LINK_NAME[zcat] = "${base_bindir}/zcat" + +export CONFIG_SHELL="/bin/sh" diff --git a/meta-openeuler/recipes-core/gzip/gzip_1.10.bb b/meta-openeuler/recipes-core/gzip/gzip_1.10.bb new file mode 100644 index 00000000000..9778e687e1a --- /dev/null +++ b/meta-openeuler/recipes-core/gzip/gzip_1.10.bb @@ -0,0 +1,40 @@ +require gzip.inc + +LICENSE = "GPLv3+" + +SRC_URI = "${GNU_MIRROR}/gzip/${BP}.tar.gz \ + file://run-ptest \ + " +SRC_URI_append_class-target = " file://wrong-path-fix.patch" + +LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504 \ + file://gzip.h;beginline=8;endline=20;md5=6e47caaa630e0c8bf9f1bc8d94a8ed0e" + +PROVIDES_append_class-native = " gzip-replacement-native" + +RDEPENDS_${PN}-ptest += "make perl grep diffutils" + +BBCLASSEXTEND = "native nativesdk" + +inherit ptest + +do_install_ptest() { + mkdir -p ${D}${PTEST_PATH}/src/build-aux + cp ${S}/build-aux/test-driver ${D}${PTEST_PATH}/src/build-aux/ + mkdir -p ${D}${PTEST_PATH}/src/tests + cp -r ${S}/tests/* ${D}${PTEST_PATH}/src/tests + sed -e 's/^abs_srcdir = ..*/abs_srcdir = \.\./' \ + -e 's/^top_srcdir = ..*/top_srcdir = \.\./' \ + -e 's/^GREP = ..*/GREP = grep/' \ + -e 's/^AWK = ..*/AWK = awk/' \ + -e 's/^srcdir = ..*/srcdir = \./' \ + -e 's/^Makefile: ..*/Makefile: /' \ + -e 's,--sysroot=${STAGING_DIR_TARGET},,g' \ + -e 's|${DEBUG_PREFIX_MAP}||g' \ + -e 's:${HOSTTOOLS_DIR}/::g' \ + -e 's:${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}::g' \ + ${B}/tests/Makefile > ${D}${PTEST_PATH}/src/tests/Makefile +} + +SRC_URI[md5sum] = "cf9ee51aff167ff69844d5d7d71c8b20" +SRC_URI[sha256sum] = "c91f74430bf7bc20402e1f657d0b252cb80aa66ba333a25704512af346633c68" -- Gitee From 6da0fced81645d1fb17bfa998971f6373f038cc9 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Fri, 26 Nov 2021 10:04:59 +0800 Subject: [PATCH 075/304] add recipe for bzip2 Signed-off-by: lixiaoyong --- .../recipes-core/bzip2/bzip2/Makefile.am | 74 +++++++++++++++++++ .../recipes-core/bzip2/bzip2/configure.ac | 11 +++ .../recipes-core/bzip2/bzip2/run-ptest | 2 + .../recipes-core/bzip2/bzip2_1.0.8.bb | 71 ++++++++++++++++++ 4 files changed, 158 insertions(+) create mode 100644 meta-openeuler/recipes-core/bzip2/bzip2/Makefile.am create mode 100644 meta-openeuler/recipes-core/bzip2/bzip2/configure.ac create mode 100644 meta-openeuler/recipes-core/bzip2/bzip2/run-ptest create mode 100644 meta-openeuler/recipes-core/bzip2/bzip2_1.0.8.bb diff --git a/meta-openeuler/recipes-core/bzip2/bzip2/Makefile.am b/meta-openeuler/recipes-core/bzip2/bzip2/Makefile.am new file mode 100644 index 00000000000..7338df03ebe --- /dev/null +++ b/meta-openeuler/recipes-core/bzip2/bzip2/Makefile.am @@ -0,0 +1,74 @@ + +lib_LTLIBRARIES = libbz2.la +libbz2_la_LDFLAGS = -version-info 1:6:0 + +libbz2_la_SOURCES = blocksort.c \ + huffman.c \ + crctable.c \ + randtable.c \ + compress.c \ + decompress.c \ + bzlib.c + +bin_PROGRAMS = bzip2 bzip2recover + +bzip2_SOURCES = bzip2.c +bzip2_LDADD = libbz2.la +bzip2_DEPENDENCIES = libbz2.la + +include_HEADERS = bzlib.h + +bzip2recover_SOURCES = bzip2recover.c +bzip2recover_LDADD = libbz2.la +bzip2recover_DEPENDENCIES = libbz2.la + +bin_SCRIPTS = bzgrep bzmore bzdiff + +man_MANS = bzip2.1 bzgrep.1 bzmore.1 bzdiff.1 +EXTRA_DIST = $(man_MANS) + +runtest: + ./bzip2 -1 < sample1.ref > sample1.rb2 + ./bzip2 -2 < sample2.ref > sample2.rb2 + ./bzip2 -3 < sample3.ref > sample3.rb2 + ./bzip2 -d < sample1.bz2 > sample1.tst + ./bzip2 -d < sample2.bz2 > sample2.tst + ./bzip2 -ds < sample3.bz2 > sample3.tst + @if cmp sample1.bz2 sample1.rb2; then echo "PASS: sample1 compress";\ + else echo "FAIL: sample1 compress"; fi + @if cmp sample2.bz2 sample2.rb2; then echo "PASS: sample2 compress";\ + else echo "FAIL: sample2 compress"; fi + @if cmp sample3.bz2 sample3.rb2; then echo "PASS: sample3 compress";\ + else echo "FAIL: sample3 compress"; fi + @if cmp sample1.tst sample1.ref; then echo "PASS: sample1 decompress";\ + else echo "FAIL: sample1 decompress"; fi + @if cmp sample2.tst sample2.ref; then echo "PASS: sample2 decompress";\ + else echo "FAIL: sample2 decompress"; fi + @if cmp sample3.tst sample3.ref; then echo "PASS: sample3 decompress";\ + else echo "FAIL: sample3 decompress"; fi + ./bzip2-tests/run-tests.sh --without-valgrind --tests-dir="$(PWD)/bzip2-tests" + +install-ptest: + sed -n '/^runtest:/,/^install-ptest:/{/^install-ptest:/!p}' \ + $(srcdir)/Makefile.am > $(DESTDIR)/Makefile + cp $(srcdir)/sample1.ref $(DESTDIR)/ + cp $(srcdir)/sample2.ref $(DESTDIR)/ + cp $(srcdir)/sample3.ref $(DESTDIR)/ + cp $(srcdir)/sample1.bz2 $(DESTDIR)/ + cp $(srcdir)/sample2.bz2 $(DESTDIR)/ + cp $(srcdir)/sample3.bz2 $(DESTDIR)/ + ln -s $(bindir)/bzip2 $(DESTDIR)/bzip2 + +install-exec-hook: + ln -s $(bindir)/bzip2$(EXEEXT) $(DESTDIR)$(bindir)/bunzip2$(EXEEXT) + ln -s $(bindir)/bzip2$(EXEEXT) $(DESTDIR)$(bindir)/bzcat$(EXEEXT) + ln -s $(bindir)/bzgrep$(EXEEXT) $(DESTDIR)$(bindir)/bzegrep$(EXEEXT) + ln -s $(bindir)/bzgrep$(EXEEXT) $(DESTDIR)$(bindir)/bzfgrep$(EXEEXT) + ln -s $(bindir)/bzmore$(EXEEXT) $(DESTDIR)$(bindir)/bzless$(EXEEXT) + ln -s $(bindir)/bzdiff$(EXEEXT) $(DESTDIR)$(bindir)/bzcmp$(EXEEXT) + +install-data-hook: + echo ".so man1/bzgrep.1" > $(DESTDIR)$(mandir)/man1/bzegrep.1 + echo ".so man1/bzgrep.1" > $(DESTDIR)$(mandir)/man1/bzfgrep.1 + echo ".so man1/bzmore.1" > $(DESTDIR)$(mandir)/man1/bzless.1 + echo ".so man1/bzdiff.1" > $(DESTDIR)$(mandir)/man1/bzcmp.1 diff --git a/meta-openeuler/recipes-core/bzip2/bzip2/configure.ac b/meta-openeuler/recipes-core/bzip2/bzip2/configure.ac new file mode 100644 index 00000000000..b8abade2d96 --- /dev/null +++ b/meta-openeuler/recipes-core/bzip2/bzip2/configure.ac @@ -0,0 +1,11 @@ +AC_PREREQ([2.57]) + +AC_INIT(bzip2, %BZIP2_VERSION%) +AM_INIT_AUTOMAKE(foreign) +AM_MAINTAINER_MODE + +AC_PROG_CC +AC_PROG_LIBTOOL + +AC_OUTPUT([Makefile]) + diff --git a/meta-openeuler/recipes-core/bzip2/bzip2/run-ptest b/meta-openeuler/recipes-core/bzip2/bzip2/run-ptest new file mode 100644 index 00000000000..3b20fce1ee9 --- /dev/null +++ b/meta-openeuler/recipes-core/bzip2/bzip2/run-ptest @@ -0,0 +1,2 @@ +#!/bin/sh +make -k runtest diff --git a/meta-openeuler/recipes-core/bzip2/bzip2_1.0.8.bb b/meta-openeuler/recipes-core/bzip2/bzip2_1.0.8.bb new file mode 100644 index 00000000000..c200a7a33ce --- /dev/null +++ b/meta-openeuler/recipes-core/bzip2/bzip2_1.0.8.bb @@ -0,0 +1,71 @@ +SUMMARY = "Very high-quality data compression program" +DESCRIPTION = "bzip2 compresses files using the Burrows-Wheeler block-sorting text compression algorithm, and \ +Huffman coding. Compression is generally considerably better than that achieved by more conventional \ +LZ77/LZ78-based compressors, and approaches the performance of the PPM family of statistical compressors." +HOMEPAGE = "https://sourceware.org/bzip2/" +SECTION = "console/utils" +LICENSE = "bzip2-1.0.6 & GPLv3+ & Apache-2.0 & MS-PL & BSD-3-Clause & Zlib" +LICENSE_${PN} = "bzip2-1.0.6" +LICENSE_${PN}-dev = "bzip2-1.0.6" +LICENSE_${PN}-dbg = "bzip2-1.0.6" +LICENSE_${PN}-doc = "bzip2-1.0.6" +LICENSE_${PN}-src = "bzip2-1.0.6" +LICENSE_libbz2 = "bzip2-1.0.6" +LICENSE_${PN}-ptest = "bzip2-1.0.6 & GPLv3+ & Apache-2.0 & MS-PL & BSD-3-Clause & Zlib" + +LIC_FILES_CHKSUM = "file://LICENSE;beginline=4;endline=37;md5=600af43c50f1fcb82e32f19b32df4664 \ + file://${WORKDIR}/git/commons-compress/LICENSE.txt;md5=86d3f3a95c324c9479bd8986968f4327 \ + file://${WORKDIR}/git/dotnetzip/License.txt;md5=9cb56871eed4e748c3bc7e8ff352a54f \ + file://${WORKDIR}/git/dotnetzip/License.zlib.txt;md5=cc421ccd22eeb2e5db6b79e6de0a029f \ + file://${WORKDIR}/git/go/LICENSE;md5=5d4950ecb7b26d2c5e4e7b4e0dd74707 \ + file://${WORKDIR}/git/lbzip2/COPYING;md5=d32239bcb673463ab874e80d47fae504 \ +" + +SRC_URI = "https://sourceware.org/pub/${BPN}/${BPN}-${PV}.tar.gz \ + git://sourceware.org/git/bzip2-tests.git;name=bzip2-tests \ + file://configure.ac;subdir=${BP} \ + file://Makefile.am;subdir=${BP} \ + file://run-ptest \ + " +SRC_URI[md5sum] = "67e051268d0c475ea773822f7500d0e5" +SRC_URI[sha256sum] = "ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269" + +SRCREV_bzip2-tests = "f9061c030a25de5b6829e1abf373057309c734c0" + +UPSTREAM_CHECK_URI = "https://www.sourceware.org/pub/bzip2/" + +PACKAGES =+ "libbz2" + +CFLAGS_append = " -fPIC -fpic -Winline -fno-strength-reduce -D_FILE_OFFSET_BITS=64" + +#inherit autotools update-alternatives ptest relative_symlinks +inherit autotools ptest relative_symlinks + +ALTERNATIVE_PRIORITY = "100" +ALTERNATIVE_${PN} = "bunzip2 bzcat bzip2" + +#install binaries to bzip2-native under sysroot for replacement-native +EXTRA_OECONF_append_class-native = " --bindir=${STAGING_BINDIR_NATIVE}/${PN}" + +do_configure_prepend () { + sed -i -e "s|%BZIP2_VERSION%|${PV}|" ${S}/configure.ac +} + +do_install_ptest () { + install -d ${D}${PTEST_PATH}/bzip2-tests + cp -r ${WORKDIR}/git/commons-compress ${D}${PTEST_PATH}/bzip2-tests/commons-compress + cp -r ${WORKDIR}/git/dotnetzip ${D}${PTEST_PATH}/bzip2-tests/dotnetzip + cp -r ${WORKDIR}/git/go ${D}${PTEST_PATH}/bzip2-tests/go + cp -r ${WORKDIR}/git/lbzip2 ${D}${PTEST_PATH}/bzip2-tests/lbzip2 + cp -r ${WORKDIR}/git/pyflate ${D}${PTEST_PATH}/bzip2-tests/pyflate + cp ${WORKDIR}/git/README ${D}${PTEST_PATH}/bzip2-tests/ + cp ${WORKDIR}/git/run-tests.sh ${D}${PTEST_PATH}/bzip2-tests/ + sed -i -e "s|^Makefile:|_Makefile:|" ${D}${PTEST_PATH}/Makefile +} + +FILES_libbz2 = "${libdir}/lib*${SOLIBS}" + +RDEPENDS_${PN}-ptest += "make bash" + +PROVIDES_append_class-native = " bzip2-replacement-native" +BBCLASSEXTEND = "native nativesdk" -- Gitee From 38423eeeba71363571b4cff9b7358273ea29f330 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Fri, 26 Nov 2021 10:08:07 +0800 Subject: [PATCH 076/304] add recipe for less Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/less/less_563.bb | 43 ++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 meta-openeuler/recipes-core/less/less_563.bb diff --git a/meta-openeuler/recipes-core/less/less_563.bb b/meta-openeuler/recipes-core/less/less_563.bb new file mode 100644 index 00000000000..763176ae222 --- /dev/null +++ b/meta-openeuler/recipes-core/less/less_563.bb @@ -0,0 +1,43 @@ +SUMMARY = "Text file viewer similar to more" +DESCRIPTION = "Less is a program similar to more, i.e. a terminal \ +based program for viewing text files and the output from other \ +programs. Less offers many features beyond those that more does." +HOMEPAGE = "http://www.greenwoodsoftware.com/" +SECTION = "console/utils" + +# (GPLv2+ (<< 418), GPLv3+ (>= 418)) | less +# Including email author giving permissing to use BSD +# +# From: Mark Nudelman +# To: Elizabeth Flanagan Date: Fri, 3 Dec 2021 20:17:33 +0800 Subject: [PATCH 077/304] 1)change linaro gcc to openeuler gcc 2)change lib to lib64 3)for aarch64 add new patch or new pkgs in bb file after update under source code Signed-off-by: lisimin --- meta-openeuler/classes/eulertoolchain.bbclass | 14 +++++----- .../conf/distro/include/tcmode-gcc-bin.inc | 13 +--------- meta-openeuler/conf/local.conf.sample | 1 - .../conf/machine/qemu-aarch64-common.inc | 14 +++------- meta-openeuler/conf/machine/qemu-aarch64.conf | 17 +++++------- .../conf/machine/qemu-aarch64_be.conf | 3 --- .../conf/machine/qemu-arm-common.inc | 5 ---- meta-openeuler/conf/machine/qemu-arm.conf | 3 --- meta-openeuler/conf/machine/qemu-arm_be.conf | 3 --- meta-openeuler/config.xml | 4 +-- .../recipes-core/glibc/glibc_2.25.bb | 26 +++++++++---------- .../recipes-core/iSulad/iSulad_2.0.9.bb | 2 +- .../recipes-core/images/openeuler-image.bb | 1 + meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb | 9 +++---- .../libarchive/libarchive_3.5.1.bb | 3 ++- .../recipes-core/libevent/libevent_2.1.12.bb | 4 +++ .../libpwquality/libpwquality_1.4.4.bb | 2 +- .../libwebsockets/libwebsockets_4.0.20.bb | 5 +--- meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb | 8 ++++++ .../recipes-core/yajl/yajl_2.1.0.bb | 6 +---- .../gcc/gcc-bin-toolchain-compilerlibs.bb | 17 +++++------- .../gcc/gcc-bin-toolchain-cross.bb | 26 ++++++++++--------- .../gcc/gcc-bin-toolchain.inc | 8 ++++-- 23 files changed, 84 insertions(+), 110 deletions(-) diff --git a/meta-openeuler/classes/eulertoolchain.bbclass b/meta-openeuler/classes/eulertoolchain.bbclass index 7529057b2c4..f6b6ad15f62 100644 --- a/meta-openeuler/classes/eulertoolchain.bbclass +++ b/meta-openeuler/classes/eulertoolchain.bbclass @@ -1,7 +1,7 @@ def eulertoolchain_raw_prefix(arch): raw_prefix_dict = { "arm" : "arm-linux-gnueabi", - "aarch64" : "aarch64-linux-gnu", + "aarch64" : "aarch64-openeuler-linux-gnu", } return raw_prefix_dict[arch] @@ -25,12 +25,14 @@ python eulertoolchain_virtclass_handler () { if cls != "eulertoolchain" or not variant: return - d.setVar("PN", d.getVar("PN", False) + '-' + variant) + multilib = d.getVar("MULTILIB", True) + prefix = "" + if "64" not in variant and multilib: + prefix = "lib32-" d.setVar("TARGET_ARCH", variant) - - d.setVar("EULER_TOOLCHAIN_SYSNAME", eulertoolchain_raw_prefix(variant)) - d.setVar("EULER_TOOLCHAIN_TARGET_PREFIX", eulertoolchain_euler_prefix(variant) + '-') - d.setVar("EULER_TOOLCHAIN_TARGET_PREFIX_RAW", eulertoolchain_euler_prefix(variant)) + d.setVar("EULER_TOOLCHAIN_SYSNAME", prefix + eulertoolchain_raw_prefix(variant)) + d.setVar("EULER_TOOLCHAIN_TARGET_PREFIX", prefix + eulertoolchain_euler_prefix(variant) + '-') + d.setVar("EULER_TOOLCHAIN_TARGET_PREFIX_RAW", prefix + eulertoolchain_euler_prefix(variant)) d.setVar("OVERRIDES", d.getVar("OVERRIDES", False) + ":{}".format(variant.replace('_', '-'))) diff --git a/meta-openeuler/conf/distro/include/tcmode-gcc-bin.inc b/meta-openeuler/conf/distro/include/tcmode-gcc-bin.inc index 27c94bdf591..bc67dbce44c 100644 --- a/meta-openeuler/conf/distro/include/tcmode-gcc-bin.inc +++ b/meta-openeuler/conf/distro/include/tcmode-gcc-bin.inc @@ -11,18 +11,7 @@ PREFERRED_PROVIDER_virtual/libc-headers = "linux-libc-headers" PREFERRED_PROVIDER_libstdc++ = "gcc-bin-toolchain-compilerlibs-${TARGET_ARCH}" PREFERRED_PROVIDER_libgcc-initial = "gcc-bin-toolchain-compilerlibs-${TARGET_ARCH}" -# PREFERRED_PROVIDER_libgcc-initial = "gcc-bin-toolchain-libgcc" -# PREFERRED_PROVIDER_libgcc = "gcc-bin-toolchain-libgcc" -# PREFERRED_PROVIDER_compiler-rt = "gcc-bin-toolchain-libgcc" -# PREFERRED_PROVIDER_libunwind-llvm = "gcc-bin-toolchain-libgcc" -# PREFERRED_PROVIDER_libcxx = "gcc-bin-toolchain-runtime" -# PREFERRED_PROVIDER_libcxxabi = "gcc-bin-toolchain-runtime" - -GCCVERSION = "7.3.0" - -PATH_append = ":${COMPONENTS_DIR}/${BUILD_ARCH}/gcc-bin-toolchain-cross-${TARGET_ARCH}/usr/bin" +PATH_append = ":${COMPONENTS_DIR}/${BUILD_ARCH}/gcc-bin-toolchain-cross-${TARGET_ARCH}/bin" #cannot set with linaro gcc,set it null DEBUG_PREFIX_MAP = "" -#STAGING_DIR_TARGET:arm = "/usr1/openeuler/gcc/sysroot-glibc-linaro-2.25-2018.05-arm-linux-gnueabi" -#STAGING_DIR_TARGET:aarch64 = "/usr1/openeuler/gcc/sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu" diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index 01f32c56cd9..087491cd0e6 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -297,5 +297,4 @@ https://.*/.* file:////usr1/openeuler/src \n" #PF = "${PN}-${EXTENDPE}${PV}" #STAMP = "${STAMPS_DIR}/${MULTIMACH_TARGET_SYS}/${PN}/${EXTENDPE}${PV}" #WORKDIR = "${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}/${PN}/${EXTENDPE}${PV}" -LOCAL_SYSROOT_DL_DIR = "/usr1/openeuler/gcc/" LOCAL_FILES = "/usr1/openeuler/src/" diff --git a/meta-openeuler/conf/machine/qemu-aarch64-common.inc b/meta-openeuler/conf/machine/qemu-aarch64-common.inc index d20a003bfc0..dd032e0c6df 100644 --- a/meta-openeuler/conf/machine/qemu-aarch64-common.inc +++ b/meta-openeuler/conf/machine/qemu-aarch64-common.inc @@ -1,7 +1,4 @@ -# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. # Description: Config for arm64 machine -# Author: Huawei OS Kernel Lab -# Create: Sat Aug 29 01:15:17 2020 MACHINEOVERRIDES =. "march64:" require conf/machine/qemu-common.inc @@ -20,10 +17,7 @@ require conf/machine/include/arm/arch-armv8a.inc TUNE_CCARGS .= "${@bb.utils.contains('TUNE_FEATURES', 'cortexa9', ' -mtune=cortex-a9', '', d)}" MACHINEOVERRIDES =. "${@bb.utils.contains('TUNE_FEATURES', 'cortexa9', 'armv7a:', '' ,d)}" -COMPAT32_MACHINEOVERRIDES_DEL =. "march64:" -COMPAT32_MACHINEOVERRIDES_ADD =. "march32:" -COMPAT32_TUNE_FEATURES_APPEND += " cortexa9" -COMPAT32_TUNE_FEATURES_REMOVE += " vfp" - -HMKERNEL_ARCH_march64 = 'aarch64' -HMKERNEL_ARCH_compat32 = 'arm' +MACHINEOVERRIDES_remove_virtclass-multilib-lib32 =. "march64:" +MACHINEOVERRIDES_append_virtclass-multilib-lib32 =. "march32:" +TUNE_FEATURES_append_virtclass-multilib-lib32 += " cortexa9" +TUNE_FEATURES_remove_virtclass-multilib-lib32 += " vfp" diff --git a/meta-openeuler/conf/machine/qemu-aarch64.conf b/meta-openeuler/conf/machine/qemu-aarch64.conf index 6d6bd10baea..521706cb1d8 100644 --- a/meta-openeuler/conf/machine/qemu-aarch64.conf +++ b/meta-openeuler/conf/machine/qemu-aarch64.conf @@ -1,7 +1,4 @@ -# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. # Description: Machine description for little-endian aarch64 -# Author: Huawei OS Kernel Lab -# Create: Sat Aug 29 02:49:36 2020 MACHINEOVERRIDES =. "march64le:" DEFAULTTUNE = "aarch64" @@ -11,11 +8,11 @@ require conf/machine/qemu-aarch64-common.inc # need to consider compat32. TUNE_CCARGS .= " -mlittle-endian" -COMPAT32_MACHINEOVERRIDES_DEL =. "march64le:aarch64:qemu-aarch64:" -COMPAT32_MACHINEOVERRIDES_ADD =. "march32le:arm:qemu-arm:" -COMPAT32_DEFAULTTUNE = "armv7a" -# For SDK only. It depends on both arm64 and arm32 packages -# so require extra package arch. +DEFAULTTUNE_virtclass-multilib-lib32 = "armv7a" PACKAGE_EXTRA_ARCHS_tune-armv7a += " armv7a" -COMPAT32_PACKAGE_EXTRA_ARCHS = "armv7a" -COMPAT32_QA_REMOVE += "arch" +PACKAGE_EXTRA_ARCHS_virtclass-multilib-lib32 = "armv7a" + +require conf/multilib.conf +MULTILIB += "multilib:lib32" +MULTILIB += "multilib:ilp32" +DEFAULTTUNE_virtclass-multilib-ilp32 =. "aarch64_ilp32:" diff --git a/meta-openeuler/conf/machine/qemu-aarch64_be.conf b/meta-openeuler/conf/machine/qemu-aarch64_be.conf index cdaff7585b8..40cbfc2f9e0 100644 --- a/meta-openeuler/conf/machine/qemu-aarch64_be.conf +++ b/meta-openeuler/conf/machine/qemu-aarch64_be.conf @@ -1,7 +1,4 @@ -# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. # Description: Machine description for little-endian aarch64 -# Author: Huawei OS Kernel Lab -# Create: Sat Aug 29 02:49:36 2020 MACHINEOVERRIDES =. "march64be:bigendian:" DEFAULTTUNE = "aarch64_be" diff --git a/meta-openeuler/conf/machine/qemu-arm-common.inc b/meta-openeuler/conf/machine/qemu-arm-common.inc index 99dab0d57c1..57f0c3cbbcd 100644 --- a/meta-openeuler/conf/machine/qemu-arm-common.inc +++ b/meta-openeuler/conf/machine/qemu-arm-common.inc @@ -1,7 +1,4 @@ -# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. # Description: Conf for arm -# Author: Huawei OS Kernel Lab -# Create: Thu Sep 10 15:06:26 2020 MACHINEOVERRIDES =. "march32:" require conf/machine/qemu-common.inc @@ -11,5 +8,3 @@ TUNE_FEATURES_append += " cortexa9" TUNE_FEATURES_remove += " vfp" TUNE_CCARGS .= " -mno-unaligned-access" - -HMKERNEL_ARCH_march32 = 'arm' diff --git a/meta-openeuler/conf/machine/qemu-arm.conf b/meta-openeuler/conf/machine/qemu-arm.conf index 7b7244763c8..01c0924d880 100644 --- a/meta-openeuler/conf/machine/qemu-arm.conf +++ b/meta-openeuler/conf/machine/qemu-arm.conf @@ -1,7 +1,4 @@ -# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. # Description: Machine description for little-endian aarch64 -# Author: Huawei OS Kernel Lab -# Create: Sat Aug 29 02:49:36 2020 MACHINEOVERRIDES =. "march32le:" DEFAULTTUNE = "armv7a" diff --git a/meta-openeuler/conf/machine/qemu-arm_be.conf b/meta-openeuler/conf/machine/qemu-arm_be.conf index 0c79ac08fd4..88149b3d3cc 100644 --- a/meta-openeuler/conf/machine/qemu-arm_be.conf +++ b/meta-openeuler/conf/machine/qemu-arm_be.conf @@ -1,7 +1,4 @@ -# Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. # Description: Machine description for little-endian aarch64 -# Author: Huawei OS Kernel Lab -# Create: Sat Aug 29 02:49:36 2020 MACHINEOVERRIDES =. "march32be:bigendian:" DEFAULTTUNE = "armv7ab" diff --git a/meta-openeuler/config.xml b/meta-openeuler/config.xml index 84640a6a931..32209e22c09 100644 --- a/meta-openeuler/config.xml +++ b/meta-openeuler/config.xml @@ -1,7 +1,7 @@ - /usr1/openeuler/gcc/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabi - /usr1/openeuler/gcc/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu + /usr1/openeuler/gcc/openeuler_gcc_arm32le + /usr1/openeuler/gcc/openeuler_gcc_arm64le /opt/buildtools/cmake-3.18.3/bin/ /opt/buildtools/python-3.9.2/bin/ /opt/buildtools/ninja-1.10.1/bin diff --git a/meta-openeuler/recipes-core/glibc/glibc_2.25.bb b/meta-openeuler/recipes-core/glibc/glibc_2.25.bb index ac596c9e955..d5167a4a458 100644 --- a/meta-openeuler/recipes-core/glibc/glibc_2.25.bb +++ b/meta-openeuler/recipes-core/glibc/glibc_2.25.bb @@ -22,12 +22,15 @@ INHIBIT_DEFAULT_DEPS = "1" PR = "r1" -SRC_URI_aarch64 = "file://sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu" -SRC_URI_arm = "file://sysroot-glibc-linaro-2.25-2018.05-arm-linux-gnueabi" +require ../../recipes-devtools/gcc/gcc-bin-toolchain.inc +SRC_URI_aarch64 = "file://openeuler_gcc_arm64le" +SRC_URI_arm = "file://openeuler_gcc_arm32le" +#Not strip toolchain +INHIBIT_SYSROOT_STRIP = "1" #FILESPATH_prepend += "${LOCAL_FILES}:" DL_DIR = "${LOCAL_SYSROOT_DL_DIR}" -S_aarch64 = "${WORKDIR}/sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu" -S_arm = "${WORKDIR}/sysroot-glibc-linaro-2.25-2018.05-arm-linux-gnueabi" +S_aarch64 = "${WORKDIR}/openeuler_gcc_arm64le/sysroot" +S_arm = "${WORKDIR}/openeuler_gcc_arm32le/sysroot" PSEUDO_DISABLED = "1" PRIVATE_LIBS_${PN}-dev_append = "libdl.so.2 libresolv.so.2 libm.so.6 librt.so.1 libnsl.so.1 libnss_files.so.2 " @@ -41,23 +44,20 @@ do_compile () { do_install() { install -m 0755 -d ${D}/ - cp -pPR ${B}/* ${D}/ + cp -pPR ${S}/* ${D}/ #for f in ${D}${bindir}/${EULER_TOOLCHAIN_SYSNAME}-*; do echo "EULER_TOOLCHAIN_SYSNAME:$EULER_TOOLCHAIN_SYSNAME" echo "TARGET_PREFIX:$TARGET_PREFIX" - EULER_TOOLCHAIN_SYSNAME="aarch64-linux-gnu" + EULER_TOOLCHAIN_SYSNAME="aarch64-openeuler-linux-gnu" EULER_TOOLCHAIN_TARGET_PREFIX="aarch64-openeuler-linux-" echo "D:${D}" rm -rf ${D}/etc/rpc - rm -rf ${D}/lib/debug - rm -f ${D}/lib/libgcc_s.so* - rm -r ${D}/usr/share/i18n - rm -r ${D}//usr/lib/gconv - rm -r ${D}/usr/lib/audit/ - rm -r ${D}/lib/*.spec - rm -r ${D}/lib/ld-2.25.so + rm -rf ${D}/${base_libdir}/debug + echo ${libdir} + echo ${base_libdir} } +SYSROOT_DIRS += "/*" #depends by glibc-locale do_stash_locale() { : diff --git a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb index 80267cbbb35..22cf83388f4 100644 --- a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb +++ b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb @@ -3,7 +3,7 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" -SRC_URI = "file://iSulad/v2.0.9.tar.gz \ +SRC_URI = "file://iSulad/v2.0.10.tar.gz \ file://0001-fix-bug-disable-selinux-not-selinux-label-file.patch \ file://0002-delete-call-setlocale.patch \ file://0003-modify-printf-to-arm32.patch \ diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index b6dab15949e..33a5c97c699 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -17,6 +17,7 @@ do_rootfs[depends] = "" #not depends to ldconfig-native #LDCONFIGDEPEND = "" DEPENDS_remove += "${@' '.join(["%s-qemuwrapper-cross" % m for m in d.getVar("MULTILIB_VARIANTS").split()])} qemuwrapper-cross depmodwrapper-cross cross-localedef-native" +SDK_DEPENDS_remove += "${@' '.join(["%s-qemuwrapper-cross" % m for m in d.getVar("MULTILIB_VARIANTS").split()])} depmodwrapper-cross cross-localedef-native" RPMROOTFSDEPENDS = "" FEATURE_PACKAGES_tools-sdk_remove = " packagegroup-core-sdk packagegroup-core-standalone-sdk-target" TOOLCHAIN_TARGET_TASK_remove += "${@multilib_pkg_extend(d, 'packagegroup-core-standalone-sdk-target')}" diff --git a/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb b/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb index bb40590b561..9602b852f94 100644 --- a/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb +++ b/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb @@ -18,8 +18,6 @@ DEPENDS = "yajl lxc" INHIBIT_PACKAGE_DEBUG_SPLIT = "1" FILES_${PN} += "${libdir}/* " -#FILES_${PN} += "/usr/local/lib/* " -#FILES_${PN}-dev = "/usr/local/*" do_configure_prepend() { grep -q CMAKE_SYSROOT ${WORKDIR}/toolchain.cmake || cat >> ${WORKDIR}/toolchain.cmake < Date: Mon, 6 Dec 2021 18:57:07 +0800 Subject: [PATCH 078/304] fix PN change missing error,after change lib to lib64 Signed-off-by: lisimin --- meta-openeuler/classes/eulertoolchain.bbclass | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-openeuler/classes/eulertoolchain.bbclass b/meta-openeuler/classes/eulertoolchain.bbclass index f6b6ad15f62..b0c8e904e17 100644 --- a/meta-openeuler/classes/eulertoolchain.bbclass +++ b/meta-openeuler/classes/eulertoolchain.bbclass @@ -25,6 +25,7 @@ python eulertoolchain_virtclass_handler () { if cls != "eulertoolchain" or not variant: return + d.setVar("PN", d.getVar("PN", False) + '-' + variant) multilib = d.getVar("MULTILIB", True) prefix = "" if "64" not in variant and multilib: -- Gitee From ca2b9cfe5ad45e4518c9fde93c792713eb9e090e Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 7 Dec 2021 11:23:59 +0800 Subject: [PATCH 079/304] support bitbake lib32-xxx for aarch64 Signed-off-by: lisimin --- meta-openeuler/classes/eulertoolchain.bbclass | 54 ------------------- .../recipes-core/images/openeuler-image.bb | 4 +- .../gcc/gcc-bin-toolchain-compilerlibs.bb | 21 ++------ .../gcc/gcc-bin-toolchain-cross.bb | 7 ++- .../gcc/gcc-bin-toolchain.inc | 4 +- 5 files changed, 12 insertions(+), 78 deletions(-) delete mode 100644 meta-openeuler/classes/eulertoolchain.bbclass diff --git a/meta-openeuler/classes/eulertoolchain.bbclass b/meta-openeuler/classes/eulertoolchain.bbclass deleted file mode 100644 index b0c8e904e17..00000000000 --- a/meta-openeuler/classes/eulertoolchain.bbclass +++ /dev/null @@ -1,54 +0,0 @@ -def eulertoolchain_raw_prefix(arch): - raw_prefix_dict = { - "arm" : "arm-linux-gnueabi", - "aarch64" : "aarch64-openeuler-linux-gnu", - } - return raw_prefix_dict[arch] - -def eulertoolchain_euler_prefix(arch): - euler_prefix_dict = { - "arm" : "arm-openeuler-linux-gnueabi", - "aarch64" : "aarch64-openeuler-linux", - } - return euler_prefix_dict[arch] - -def eulertoolchain_prefix_to_arch(prefix): - return prefix.split('-')[0] - -def eulertoolchain_euler_prefix_to_raw(euler_prefix): - arch = eulertoolchain_prefix_to_arch(euler_prefix) - return eulertoolchain_raw_prefix(arch) - -python eulertoolchain_virtclass_handler () { - cls = d.getVar("BBEXTENDCURR") - variant = d.getVar("BBEXTENDVARIANT") - if cls != "eulertoolchain" or not variant: - return - - d.setVar("PN", d.getVar("PN", False) + '-' + variant) - multilib = d.getVar("MULTILIB", True) - prefix = "" - if "64" not in variant and multilib: - prefix = "lib32-" - d.setVar("TARGET_ARCH", variant) - d.setVar("EULER_TOOLCHAIN_SYSNAME", prefix + eulertoolchain_raw_prefix(variant)) - d.setVar("EULER_TOOLCHAIN_TARGET_PREFIX", prefix + eulertoolchain_euler_prefix(variant) + '-') - d.setVar("EULER_TOOLCHAIN_TARGET_PREFIX_RAW", prefix + eulertoolchain_euler_prefix(variant)) - - d.setVar("OVERRIDES", d.getVar("OVERRIDES", False) + - ":{}".format(variant.replace('_', '-'))) -} - -addhandler eulertoolchain_virtclass_handler -eulertoolchain_virtclass_handler[eventmask] = "bb.event.RecipePreFinalise" - -_EULERTOOLCHAIN_SUPPORT_ARCHS := "aarch64 arm" - -def toolchain_bbclassextend(d, cls, variant): - support_archs = d.getVar("_EULERTOOLCHAIN_SUPPORT_ARCHS", True) - exts = [] - for arch in support_archs.split(): - exts.append('{}:{}{}'.format(cls, variant, arch)) - return ' '.join(exts) - -BBCLASSEXTEND = "${@toolchain_bbclassextend(d, 'eulertoolchain', '')}" diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 33a5c97c699..64869fec59a 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -16,8 +16,7 @@ IMAGE_CMD_tar = "${IMAGE_CMD_TAR} --format=posix --numeric-owner -cf ${IMGDEPLOY do_rootfs[depends] = "" #not depends to ldconfig-native #LDCONFIGDEPEND = "" -DEPENDS_remove += "${@' '.join(["%s-qemuwrapper-cross" % m for m in d.getVar("MULTILIB_VARIANTS").split()])} qemuwrapper-cross depmodwrapper-cross cross-localedef-native" -SDK_DEPENDS_remove += "${@' '.join(["%s-qemuwrapper-cross" % m for m in d.getVar("MULTILIB_VARIANTS").split()])} depmodwrapper-cross cross-localedef-native" +DEPENDS_remove += "qemuwrapper-cross depmodwrapper-cross cross-localedef-native" RPMROOTFSDEPENDS = "" FEATURE_PACKAGES_tools-sdk_remove = " packagegroup-core-sdk packagegroup-core-standalone-sdk-target" TOOLCHAIN_TARGET_TASK_remove += "${@multilib_pkg_extend(d, 'packagegroup-core-standalone-sdk-target')}" @@ -44,6 +43,7 @@ python do_image() { } IMAGE_INSTALL += " \ +bash \ busybox \ linux-openeuler \ os-base \ diff --git a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-compilerlibs.bb b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-compilerlibs.bb index 87958c0eb51..8abc48f6794 100644 --- a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-compilerlibs.bb +++ b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-compilerlibs.bb @@ -1,33 +1,20 @@ # Description: Extract libgcc and compiler-rt from toolchain -inherit eulertoolchain require gcc-bin-toolchain.inc +PN = "gcc-bin-toolchain-compilerlibs-${TARGET_ARCH}" INHIBIT_DEFAULT_DEPS = "1" -#DEPENDS = "virtual/${EULER_TOOLCHAIN_TARGET_PREFIX}gcc \ -# virtual/${EULER_TOOLCHAIN_TARGET_PREFIX}g++" DEPENDS = "virtual/${TARGET_PREFIX}gcc \ virtual/${TARGET_PREFIX}g++" - -#PROVIDES = "virtual/${EULER_TOOLCHAIN_TARGET_PREFIX}compilerlibs gcc-runtime libstdc++ libgcc-initial" PROVIDES = "gcc-runtime libstdc++ libgcc-initial virtual/${TARGET_PREFIX}compilerlibs" - -# Insert lib and usr/lib into SYSROOT_DIRS so these 2 dir -# will be found by building of bb depends on this bb. It -# is required because we set BASELIB to lib32, which makes -# yocto stage lib32 and usr/lib32. However, compiler has -# built-in path to find libgcc, which is /lib or /usr/lib. -#LIBDIR_COMPAT_EXTRA = "${@ '' if not is_compat(d) else '/lib /usr/lib'}" -#SYSROOT_DIRS += "${LIBDIR_COMPAT_EXTRA}" - do_install () { bbnote "Installing libgcc/libclang from Compiler CPU binary toolchain" install -m 0755 -d ${D}${libdir_native}/${EULER_TOOLCHAIN_GCC_PATH_INNER} finddirs='' - test -d ${B}/${EULER_TOOLCHAIN_SYSNAME}/lib && finddirs="$finddirs ${B}/${EULER_TOOLCHAIN_SYSNAME}/lib" - test -d ${B}/${EULER_TOOLCHAIN_SYSNAME}/lib64 && finddirs="$finddirs ${B}/${EULER_TOOLCHAIN_SYSNAME}/lib64" + test -d ${B}/${TOOLCHAIN_PREFIX}/lib && finddirs="$finddirs ${B}/${TOOLCHAIN_PREFIX}/lib" + test -d ${B}/${TOOLCHAIN_PREFIX}/lib64 && finddirs="$finddirs ${B}/${TOOLCHAIN_PREFIX}/lib64" test -d ${B}/lib/${EULER_TOOLCHAIN_GCC_PATH} && finddirs="$finddirs ${B}/lib/${EULER_TOOLCHAIN_GCC_PATH}" test -d ${B}/lib64/${EULER_TOOLCHAIN_GCC_PATH} && finddirs="$finddirs ${B}/lib64/${EULER_TOOLCHAIN_GCC_PATH}" @@ -71,7 +58,7 @@ do_install () { rel=$(realpath --relative-to=$(dirname $f) ${D}$destdir) ln -s $rel/$bn $(dirname $f) done - rm -r ${D}${libdir_native}/${EULER_TOOLCHAIN_SYSNAME} + rm -r ${D}${libdir_native}/${TOOLCHAIN_PREFIX} } # Package will be called as libgcc-s1. Don't know why. diff --git a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb index 8e77f8a5715..cd2055d8806 100644 --- a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb +++ b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb @@ -1,8 +1,7 @@ inherit cross -inherit eulertoolchain - require gcc-bin-toolchain.inc +PN = "gcc-bin-toolchain-cross-${TARGET_ARCH}" INHIBIT_DEFAULT_DEPS = "1" INHIBIT_SYSROOT_STRIP = "1" @@ -23,9 +22,9 @@ libexecdir = "${STAGING_DIR_NATIVE}/${prefix_native}/libexec/" do_install_class-cross() { install -m 0755 -d ${D}/${STAGING_DIR_NATIVE} cp -pPR ${B}/* ${D}/${STAGING_DIR_NATIVE} - for f in ${D}/${STAGING_DIR_NATIVE}/bin/${EULER_TOOLCHAIN_SYSNAME}-*; do + for f in ${D}/${STAGING_DIR_NATIVE}/bin/${TOOLCHAIN_PREFIX}-*; do bin=$(basename ${f}) - lnk=$(basename ${f} | sed "s/^${EULER_TOOLCHAIN_SYSNAME}-/${EULER_TOOLCHAIN_TARGET_PREFIX}/g") + lnk=$(basename ${f} | sed "s/^${TOOLCHAIN_PREFIX}-/${TARGET_PREFIX}/g") ln -svf ${bin} ${D}/${STAGING_DIR_NATIVE}/bin/${lnk} done } diff --git a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc index 38d0dff9b6c..f4ff4f66886 100644 --- a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc +++ b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc @@ -2,7 +2,9 @@ TOOLCHAIN_GCC_VERSION = "10.3.0" LICENSE = "CLOSED" SECTION = "toolchain" -EULER_TOOLCHAIN_GCC_PATH_INNER = "${EULER_TOOLCHAIN_SYSNAME}/${TOOLCHAIN_GCC_VERSION}" +TOOLCHAIN_PREFIX_arm = "arm-linux-gnueabi" +TOOLCHAIN_PREFIX_aarch64 = "aarch64-openeuler-linux-gnu" +EULER_TOOLCHAIN_GCC_PATH_INNER = "${TOOLCHAIN_PREFIX}/${TOOLCHAIN_GCC_VERSION}" EULER_TOOLCHAIN_GCC_PATH = "/gcc/${EULER_TOOLCHAIN_GCC_PATH_INNER}" python () { -- Gitee From c775ec16ef2f63d6f90857bbaf0a73780d9c8fb4 Mon Sep 17 00:00:00 2001 From: liangfangping Date: Tue, 7 Dec 2021 15:13:22 +0800 Subject: [PATCH 080/304] modify busybox bb file for glibc 2.34 Signed-off-by: liangfangping --- .../recipes-core/busybox/busybox_1.33.1.bb | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb index c08122ac9f7..c04d71af9ca 100644 --- a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb +++ b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb @@ -11,6 +11,7 @@ INHIBIT_DEFAULT_DEPS = "1" PR = "r1" DEPENDS += "virtual/libc" +DEPENDS += "libtirpc" #get arch info inherit kernel-arch @@ -69,7 +70,18 @@ RDEPENDS_${PN} = "${@["", "busybox-inittab"][(d.getVar('VIRTUAL-RUNTIME_init_man do_configure() { cp ../yocto-embedded-tools/config/arm64/defconfig-busybox .config - set -e + set +e + grep -E '^CONFIG_FEATURE_MOUNT_NFS=y|^CONFIG_FEATURE_INETD_RPC=y' .config + ret=$? + if [ $ret -eq 0 ]; then + grep -E '^CONFIG_EXTRA_CFLAGS=".*-I/usr/include/tirpc|^CONFIG_EXTRA_LDLIBS=".*tirpc' .config + ret=$? + if [ $ret -ne 0 ]; then + sed -i 's/^CONFIG_EXTRA_CFLAGS="/CONFIG_EXTRA_CFLAGS="-I\/usr\/include\/tirpc /g' .config + sed -i 's/^CONFIG_EXTRA_LDLIBS="/CONFIG_EXTRA_LDLIBS="tirpc /g' .config + fi + fi + set -e yes '' | oe_runmake oldconfig } -- Gitee From 428106829e9a10b416624fb63e8b540bc5690c23 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 9 Dec 2021 10:41:05 +0800 Subject: [PATCH 081/304] add recipe for libtirpc Signed-off-by: lixiaoyong --- .../recipes-core/libtirpc/libtirpc_1.3.2.bb | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb diff --git a/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb b/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb new file mode 100644 index 00000000000..755355a3f93 --- /dev/null +++ b/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb @@ -0,0 +1,25 @@ +SUMMARY = "Transport-Independent RPC library" +DESCRIPTION = "Libtirpc is a port of Suns Transport-Independent RPC library to Linux" +SECTION = "libs/network" +HOMEPAGE = "http://sourceforge.net/projects/libtirpc/" +BUGTRACKER = "http://sourceforge.net/tracker/?group_id=183075&atid=903784" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://COPYING;md5=f835cce8852481e4b2bbbdd23b5e47f3 \ + file://src/netname.c;beginline=1;endline=27;md5=f8a8cd2cb25ac5aa16767364fb0e3c24" + +PROVIDES = "virtual/librpc" + +SRC_URI = "file://libtirpc/libtirpc-${PV}.tar.bz2" +UPSTREAM_CHECK_URI = "https://sourceforge.net/projects/libtirpc/files/libtirpc/" +UPSTREAM_CHECK_REGEX = "(?P\d+(\.\d+)+)/" +SRC_URI[sha256sum] = "245895caf066bec5e3d4375942c8cb4366adad184c29c618d97f724ea309ee17" + +inherit autotools pkgconfig + +EXTRA_OECONF = "--disable-gssapi" + +do_install_append() { + chown root:root ${D}${sysconfdir}/netconfig +} + +BBCLASSEXTEND = "native nativesdk" -- Gitee From 7eb81ce3787aa30029605a6be261b11b3a34634a Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 9 Dec 2021 03:27:04 +0000 Subject: [PATCH 082/304] update meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb. --- meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb b/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb index 755355a3f93..b8f9de0da22 100644 --- a/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb +++ b/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb @@ -10,7 +10,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=f835cce8852481e4b2bbbdd23b5e47f3 \ PROVIDES = "virtual/librpc" SRC_URI = "file://libtirpc/libtirpc-${PV}.tar.bz2" -UPSTREAM_CHECK_URI = "https://sourceforge.net/projects/libtirpc/files/libtirpc/" +UPSTREAM_CHECK_URI = "https://gitee.com/src-openeuler/libtirpc/tree/openEuler-22.03-LTS-Next/" UPSTREAM_CHECK_REGEX = "(?P\d+(\.\d+)+)/" SRC_URI[sha256sum] = "245895caf066bec5e3d4375942c8cb4366adad184c29c618d97f724ea309ee17" -- Gitee From a51d7e70d4706cea6138b00dcc239450f5787dc4 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 9 Dec 2021 03:39:23 +0000 Subject: [PATCH 083/304] update meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb. --- meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb b/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb index b8f9de0da22..755355a3f93 100644 --- a/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb +++ b/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb @@ -10,7 +10,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=f835cce8852481e4b2bbbdd23b5e47f3 \ PROVIDES = "virtual/librpc" SRC_URI = "file://libtirpc/libtirpc-${PV}.tar.bz2" -UPSTREAM_CHECK_URI = "https://gitee.com/src-openeuler/libtirpc/tree/openEuler-22.03-LTS-Next/" +UPSTREAM_CHECK_URI = "https://sourceforge.net/projects/libtirpc/files/libtirpc/" UPSTREAM_CHECK_REGEX = "(?P\d+(\.\d+)+)/" SRC_URI[sha256sum] = "245895caf066bec5e3d4375942c8cb4366adad184c29c618d97f724ea309ee17" -- Gitee From f5ec18f38cab17f29dfd3eebe6f7fca18e6dcdfb Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 9 Dec 2021 04:00:24 +0000 Subject: [PATCH 084/304] update meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb. --- meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb b/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb index 755355a3f93..6905ee305d5 100644 --- a/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb +++ b/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb @@ -10,7 +10,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=f835cce8852481e4b2bbbdd23b5e47f3 \ PROVIDES = "virtual/librpc" SRC_URI = "file://libtirpc/libtirpc-${PV}.tar.bz2" -UPSTREAM_CHECK_URI = "https://sourceforge.net/projects/libtirpc/files/libtirpc/" +UPSTREAM_CHECK_URI = "https://gitee.com/src-openeuler/libtirpc" UPSTREAM_CHECK_REGEX = "(?P\d+(\.\d+)+)/" SRC_URI[sha256sum] = "245895caf066bec5e3d4375942c8cb4366adad184c29c618d97f724ea309ee17" -- Gitee From 9884bce7e07c4bdfde8a39417aff7528eb1ae65e Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 9 Dec 2021 16:23:04 +0800 Subject: [PATCH 085/304] add recipe for json-c Signed-off-by: lixiaoyong --- .../recipes-core/json-c/json-c_0.15.bb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 meta-openeuler/recipes-core/json-c/json-c_0.15.bb diff --git a/meta-openeuler/recipes-core/json-c/json-c_0.15.bb b/meta-openeuler/recipes-core/json-c/json-c_0.15.bb new file mode 100644 index 00000000000..306b6c3ca5e --- /dev/null +++ b/meta-openeuler/recipes-core/json-c/json-c_0.15.bb @@ -0,0 +1,16 @@ +SUMMARY = "C bindings for apps which will manipulate JSON data" +DESCRIPTION = "JSON-C implements a reference counting object model that allows you to easily construct JSON objects in C." +HOMEPAGE = "https://github.com/json-c/json-c/wiki" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://COPYING;md5=de54b60fbbc35123ba193fea8ee216f2" + +SRC_URI = "file://json-c/json-c-0.15-20200726.tar.gz" + +SRC_URI[sha256sum] = "4ba9a090a42cf1e12b84c64e4464bb6fb893666841d5843cc5bef90774028882" +UPSTREAM_CHECK_URI = "https://gitee.com/src-openeuler/json-c" +UPSTREAM_CHECK_REGEX = "json-c-(?P\d+(\.\d+)+)-\d+" +S = "${WORKDIR}/json-c-json-c-0.15-20200726" +RPROVIDES_${PN} = "libjson" + +inherit cmake +BBCLASSEXTEND = "native nativesdk" -- Gitee From 7e9a0654354fcfed3b8646077eef24792a8d935c Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 9 Dec 2021 16:56:27 +0800 Subject: [PATCH 086/304] add recipe for attr Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/attr/attr.inc | 66 +++++++++++++++++++ .../recipes-core/attr/attr/run-ptest | 3 + .../recipes-core/attr/attr_2.5.1.bb | 5 ++ 3 files changed, 74 insertions(+) create mode 100644 meta-openeuler/recipes-core/attr/attr.inc create mode 100644 meta-openeuler/recipes-core/attr/attr/run-ptest create mode 100644 meta-openeuler/recipes-core/attr/attr_2.5.1.bb diff --git a/meta-openeuler/recipes-core/attr/attr.inc b/meta-openeuler/recipes-core/attr/attr.inc new file mode 100644 index 00000000000..be4b2ceb815 --- /dev/null +++ b/meta-openeuler/recipes-core/attr/attr.inc @@ -0,0 +1,66 @@ +SUMMARY = "Utilities for manipulating filesystem extended attributes" +DESCRIPTION = "Implement the ability for a user to attach name:value pairs to objects within the XFS filesystem." + +HOMEPAGE = "http://savannah.nongnu.org/projects/attr/" +SECTION = "libs" + +DEPENDS = "virtual/libintl" + +LICENSE = "LGPLv2.1+ & GPLv2+" +LICENSE_${PN} = "GPLv2+" +LICENSE_lib${BPN} = "LGPLv2.1+" +LIC_FILES_CHKSUM = "file://doc/COPYING;md5=2d0aa14b3fce4694e4f615e30186335f \ + file://doc/COPYING.LGPL;md5=b8d31f339300bc239d73461d68e77b9c \ + file://tools/attr.c;endline=17;md5=be0403261f0847e5f43ed5b08d19593c \ + file://libattr/libattr.c;endline=17;md5=7970f77049f8fa1199fff62a7ab724fb" + +SRC_URI = "file://attr/attr-${PV}.tar.gz \ + file://run-ptest \ +" + +#inherit ptest update-alternatives autotools gettext +inherit autotools gettext + +PACKAGES =+ "lib${BPN}" + +FILES_lib${BPN} = "${libdir}/lib*${SOLIBS}" + +ALTERNATIVE_PRIORITY = "100" +ALTERNATIVE_${PN} = "setfattr" +ALTERNATIVE_TARGET[setfattr] = "${bindir}/setfattr" + +PTEST_BUILD_HOST_FILES = "builddefs" +PTEST_BUILD_HOST_PATTERN = "^RPM" + +do_install_ptest() { + cp ${B}/Makefile ${D}${PTEST_PATH} + sed -e 's,--sysroot=${STAGING_DIR_TARGET},,g' \ + -e 's|${DEBUG_PREFIX_MAP}||g' \ + -e 's:${HOSTTOOLS_DIR}/::g' \ + -e 's:${RECIPE_SYSROOT_NATIVE}::g' \ + -e 's:${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}::g' \ + -i ${D}${PTEST_PATH}/Makefile + + sed -i "s|^srcdir =.*|srcdir = \.|g" ${D}${PTEST_PATH}/Makefile + sed -i "s|^abs_srcdir =.*|abs_srcdir = \.|g" ${D}${PTEST_PATH}/Makefile + sed -i "s|^abs_top_srcdir =.*|abs_top_srcdir = \.\.|g" ${D}${PTEST_PATH}/Makefile + sed -i "s|^Makefile:.*|Makefile:|g" ${D}${PTEST_PATH}/Makefile + cp -rf ${S}/build-aux/ ${D}${PTEST_PATH} + cp -rf ${S}/test/ ${D}${PTEST_PATH} +} + +RDEPENDS_${PN}-ptest = "attr \ + coreutils \ + perl-module-filehandle \ + perl-module-getopt-std \ + perl-module-posix \ + make \ + perl \ + gawk \ + perl-module-cwd \ + perl-module-file-basename \ + perl-module-file-path \ + perl-module-file-spec \ + " + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-openeuler/recipes-core/attr/attr/run-ptest b/meta-openeuler/recipes-core/attr/attr/run-ptest new file mode 100644 index 00000000000..f64244f2393 --- /dev/null +++ b/meta-openeuler/recipes-core/attr/attr/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +make test-suite.log diff --git a/meta-openeuler/recipes-core/attr/attr_2.5.1.bb b/meta-openeuler/recipes-core/attr/attr_2.5.1.bb new file mode 100644 index 00000000000..5c5f7bcffb4 --- /dev/null +++ b/meta-openeuler/recipes-core/attr/attr_2.5.1.bb @@ -0,0 +1,5 @@ +require attr.inc + +SRC_URI[sha256sum] = "bae1c6949b258a0d68001367ce0c741cebdacdd3b62965d17e5eb23cd78adaf8" + +BBCLASSEXTEND = "native nativesdk" -- Gitee From c1151971756c8ad105d1c2059c32763475150f7a Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 9 Dec 2021 09:18:04 +0000 Subject: [PATCH 087/304] update meta-openeuler/recipes-core/attr/attr.inc. --- meta-openeuler/recipes-core/attr/attr.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-openeuler/recipes-core/attr/attr.inc b/meta-openeuler/recipes-core/attr/attr.inc index be4b2ceb815..442273d669d 100644 --- a/meta-openeuler/recipes-core/attr/attr.inc +++ b/meta-openeuler/recipes-core/attr/attr.inc @@ -15,6 +15,7 @@ LIC_FILES_CHKSUM = "file://doc/COPYING;md5=2d0aa14b3fce4694e4f615e30186335f \ file://libattr/libattr.c;endline=17;md5=7970f77049f8fa1199fff62a7ab724fb" SRC_URI = "file://attr/attr-${PV}.tar.gz \ + file://attr/0001-bypass-wrong-output-when-enabled-selinux.patch \ file://run-ptest \ " -- Gitee From ae2af2f5615587c1873fdfb15018674da37f392e Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 9 Dec 2021 10:02:42 +0000 Subject: [PATCH 088/304] update meta-openeuler/recipes-core/json-c/json-c_0.15.bb. --- meta-openeuler/recipes-core/json-c/json-c_0.15.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/recipes-core/json-c/json-c_0.15.bb b/meta-openeuler/recipes-core/json-c/json-c_0.15.bb index 306b6c3ca5e..4c4e1af275f 100644 --- a/meta-openeuler/recipes-core/json-c/json-c_0.15.bb +++ b/meta-openeuler/recipes-core/json-c/json-c_0.15.bb @@ -7,7 +7,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=de54b60fbbc35123ba193fea8ee216f2" SRC_URI = "file://json-c/json-c-0.15-20200726.tar.gz" SRC_URI[sha256sum] = "4ba9a090a42cf1e12b84c64e4464bb6fb893666841d5843cc5bef90774028882" -UPSTREAM_CHECK_URI = "https://gitee.com/src-openeuler/json-c" +UPSTREAM_CHECK_URI = "https://github.com/${BPN}/${BPN}/releases" UPSTREAM_CHECK_REGEX = "json-c-(?P\d+(\.\d+)+)-\d+" S = "${WORKDIR}/json-c-json-c-0.15-20200726" RPROVIDES_${PN} = "libjson" -- Gitee From 0607fd61899a4651702edba9b67278ebc22102d8 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 9 Dec 2021 19:02:11 +0800 Subject: [PATCH 089/304] add recipe for acl Signed-off-by: lixiaoyong --- .../0001-test-patch-out-failing-bits.patch | 63 +++++++++++++++ ...dcode-the-build-path-into-a-helper-l.patch | 24 ++++++ meta-openeuler/recipes-core/acl/acl/run-ptest | 10 +++ meta-openeuler/recipes-core/acl/acl_2.3.1.bb | 78 +++++++++++++++++++ 4 files changed, 175 insertions(+) create mode 100644 meta-openeuler/recipes-core/acl/acl/0001-test-patch-out-failing-bits.patch create mode 100644 meta-openeuler/recipes-core/acl/acl/0001-tests-do-not-hardcode-the-build-path-into-a-helper-l.patch create mode 100644 meta-openeuler/recipes-core/acl/acl/run-ptest create mode 100644 meta-openeuler/recipes-core/acl/acl_2.3.1.bb diff --git a/meta-openeuler/recipes-core/acl/acl/0001-test-patch-out-failing-bits.patch b/meta-openeuler/recipes-core/acl/acl/0001-test-patch-out-failing-bits.patch new file mode 100644 index 00000000000..ba2ffee5d27 --- /dev/null +++ b/meta-openeuler/recipes-core/acl/acl/0001-test-patch-out-failing-bits.patch @@ -0,0 +1,63 @@ +From 9e08219e0e99ee2589cf35fa8d52cef3515accce Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin +Date: Thu, 12 Dec 2019 15:47:49 +0100 +Subject: [PATCH] test: patch out failing bits + +I have confirmed on the host distro (Ubuntu 18.04) that they +fail as well; upstream probably haven't noticed because the +test is only executed under sudo. + +Upstream-Status: Inappropriate [disabling tests instead of fixing them properly] +Signed-off-by: Alexander Kanavin +--- + test/root/permissions.test | 13 ------------- + 1 file changed, 13 deletions(-) + +diff --git a/test/root/permissions.test b/test/root/permissions.test +index 8f8f825..21e8a95 100644 +--- a/test/root/permissions.test ++++ b/test/root/permissions.test +@@ -50,10 +50,6 @@ User daemon is a member in the owning group, which has only read access. + Verify this. + + $ su daemon +- $ cat f +- > root +- > bin +- + $ echo daemon >> f + >~ .*f: Permission denied$ + +@@ -146,8 +142,6 @@ the owning group, he should still have no write access. + $ setfacl -x g:daemon f + + $ su daemon +- $ echo daemon4 >> f +- >~ .*f: Permission denied$ + + + Change the owning group. The other permissions should now grant user +@@ -158,12 +152,6 @@ daemon write access. + + $ su daemon + $ echo daemon5 >> f +- $ cat f +- > root +- > bin +- > daemon +- > daemon2 +- > daemon5 + + + Verify that permissions in separate matching ACL entries do not +@@ -173,7 +161,6 @@ accumulate. + $ setfacl -m g:bin:r,g:daemon:w f + + $ su daemon +- $ : < f + $ : > f + $ : <> f + >~ .*f: Permission denied$ +-- +2.17.1 + diff --git a/meta-openeuler/recipes-core/acl/acl/0001-tests-do-not-hardcode-the-build-path-into-a-helper-l.patch b/meta-openeuler/recipes-core/acl/acl/0001-tests-do-not-hardcode-the-build-path-into-a-helper-l.patch new file mode 100644 index 00000000000..57ef0bb728c --- /dev/null +++ b/meta-openeuler/recipes-core/acl/acl/0001-tests-do-not-hardcode-the-build-path-into-a-helper-l.patch @@ -0,0 +1,24 @@ +From 39d332a8801de5d9ef09dacb3dba85c208b7b2ad Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin +Date: Thu, 12 Dec 2019 13:45:52 +0100 +Subject: [PATCH] tests: do not hardcode the build path into a helper library + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Alexander Kanavin +--- + test/Makemodule.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/test/Makemodule.am b/test/Makemodule.am +index 17d4927..015de7f 100644 +--- a/test/Makemodule.am ++++ b/test/Makemodule.am +@@ -30,7 +30,7 @@ EXTRA_DIST += \ + check_LTLIBRARIES = libtestlookup.la + + libtestlookup_la_SOURCES = test/test_passwd.c test/test_group.c +-libtestlookup_la_CFLAGS = -DBASEDIR=\"$(abs_srcdir)\" ++libtestlookup_la_CFLAGS = -DBASEDIR=\"/tmp/acl-ptest\" + libtestlookup_la_LDFLAGS = -rpath $(abs_builddir) + + AM_TESTS_ENVIRONMENT = PATH="$(abs_top_builddir):$$PATH"; diff --git a/meta-openeuler/recipes-core/acl/acl/run-ptest b/meta-openeuler/recipes-core/acl/acl/run-ptest new file mode 100644 index 00000000000..43128233654 --- /dev/null +++ b/meta-openeuler/recipes-core/acl/acl/run-ptest @@ -0,0 +1,10 @@ +#!/bin/sh +# +#This script is used to run acl test suites + +#umask 077 + +mkdir -p /tmp/acl-ptest/test +cp test/test.* /tmp/acl-ptest/test + +make test-suite.log diff --git a/meta-openeuler/recipes-core/acl/acl_2.3.1.bb b/meta-openeuler/recipes-core/acl/acl_2.3.1.bb new file mode 100644 index 00000000000..a285af482f6 --- /dev/null +++ b/meta-openeuler/recipes-core/acl/acl_2.3.1.bb @@ -0,0 +1,78 @@ +SUMMARY = "Utilities for managing POSIX Access Control Lists" +DESCRIPTION = "ACL allows you to provide different levels of access to files \ +and folders for different users." + +HOMEPAGE = "http://savannah.nongnu.org/projects/acl/" +BUGTRACKER = "http://savannah.nongnu.org/bugs/?group=acl" + +SECTION = "libs" + +LICENSE = "LGPLv2.1+ & GPLv2+" +LICENSE_${PN} = "GPLv2+" +LICENSE_lib${BPN} = "LGPLv2.1+" +LIC_FILES_CHKSUM = "file://doc/COPYING;md5=c781d70ed2b4d48995b790403217a249 \ + file://doc/COPYING.LGPL;md5=9e9a206917f8af112da634ce3ab41764" + +DEPENDS = "attr" + +SRC_URI = "file://acl/acl-${PV}.tar.gz \ + file://run-ptest \ + file://0001-tests-do-not-hardcode-the-build-path-into-a-helper-l.patch \ + file://0001-test-patch-out-failing-bits.patch \ + " + +SRC_URI[sha256sum] = "760c61c68901b37fdd5eefeeaf4c0c7a26bdfdd8ac747a1edff1ce0e243c11af" + +inherit autotools gettext ptest + +PACKAGES =+ "lib${BPN}" + +FILES_lib${BPN} = "${libdir}/lib*${SOLIBS}" + +PTEST_BUILD_HOST_FILES = "builddefs" +PTEST_BUILD_HOST_PATTERN = "^RPM" + +do_compile_ptest() { + oe_runmake libtestlookup.la +} + +do_install_ptest() { + cp -rf ${S}/test/ ${D}${PTEST_PATH} + cp -rf ${S}/build-aux/ ${D}${PTEST_PATH} + mkdir -p ${D}${PTEST_PATH}/.libs + cp -rf ${B}/.libs/libtestlookup* ${D}${PTEST_PATH}/.libs + cp ${B}/Makefile ${D}${PTEST_PATH} + + sed -e 's,--sysroot=${STAGING_DIR_TARGET},,g' \ + -e 's|${DEBUG_PREFIX_MAP}||g' \ + -e 's:${HOSTTOOLS_DIR}/::g' \ + -e 's:${RECIPE_SYSROOT_NATIVE}::g' \ + -e 's:${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}::g' \ + -i ${D}${PTEST_PATH}/Makefile + + sed -i "s|^srcdir =.*|srcdir = \.|g" ${D}${PTEST_PATH}/Makefile + sed -i "s|^abs_srcdir =.*|abs_srcdir = \.|g" ${D}${PTEST_PATH}/Makefile + sed -i "s|^abs_top_srcdir =.*|abs_top_srcdir = \.\.|g" ${D}${PTEST_PATH}/Makefile + sed -i "s|^Makefile:.*|Makefile:|g" ${D}${PTEST_PATH}/Makefile + + rm ${D}${PTEST_PATH}/.libs/libtestlookup.lai +} + +RDEPENDS_${PN}-ptest = "acl \ + bash \ + coreutils \ + perl \ + perl-module-filehandle \ + perl-module-getopt-std \ + perl-module-posix \ + shadow \ + make \ + gawk \ + e2fsprogs-mke2fs \ + perl-module-cwd \ + perl-module-file-basename \ + perl-module-file-path \ + perl-module-file-spec \ + " + +BBCLASSEXTEND = "native nativesdk" -- Gitee From 916d93226896a85d8214e75296c40be454c73345 Mon Sep 17 00:00:00 2001 From: lisimin Date: Thu, 9 Dec 2021 19:38:35 +0800 Subject: [PATCH 090/304] fix -mcpu=cortex-a9 confilict with -march=armv7-a Signed-off-by: lisimin --- meta-openeuler/conf/machine/qemu-arm-common.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/conf/machine/qemu-arm-common.inc b/meta-openeuler/conf/machine/qemu-arm-common.inc index 57f0c3cbbcd..41e617d0b25 100644 --- a/meta-openeuler/conf/machine/qemu-arm-common.inc +++ b/meta-openeuler/conf/machine/qemu-arm-common.inc @@ -2,7 +2,7 @@ MACHINEOVERRIDES =. "march32:" require conf/machine/qemu-common.inc -require conf/machine/include/tune-cortexa9.inc +require conf/machine/include/arm/arch-armv7a.inc TUNE_FEATURES_append += " cortexa9" TUNE_FEATURES_remove += " vfp" -- Gitee From c52fed281c0e6f5e286664aa79d0dfb29891191d Mon Sep 17 00:00:00 2001 From: Jiangfeng Xiao Date: Mon, 13 Dec 2021 17:55:41 +0800 Subject: [PATCH 091/304] modify yocto code for openeuler gcc upgrading Signed-off-by: Jiangfeng Xiao --- meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb | 2 +- meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb | 3 +++ meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb b/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb index 66b8af92b26..7f21b9c1946 100644 --- a/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb +++ b/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb @@ -57,4 +57,4 @@ inherit autotools BBCLASSEXTEND = "native nativesdk" - +CFLAGS_append = "-Wno-error=stringop-overflow" diff --git a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb index cd2055d8806..b561bdbb42b 100644 --- a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb +++ b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain-cross.bb @@ -22,6 +22,9 @@ libexecdir = "${STAGING_DIR_NATIVE}/${prefix_native}/libexec/" do_install_class-cross() { install -m 0755 -d ${D}/${STAGING_DIR_NATIVE} cp -pPR ${B}/* ${D}/${STAGING_DIR_NATIVE} + if [ ${TOOLCHAIN_PREFIX}- == ${TARGET_PREFIX} ]; then + return + fi for f in ${D}/${STAGING_DIR_NATIVE}/bin/${TOOLCHAIN_PREFIX}-*; do bin=$(basename ${f}) lnk=$(basename ${f} | sed "s/^${TOOLCHAIN_PREFIX}-/${TARGET_PREFIX}/g") diff --git a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc index f4ff4f66886..4f0e7a9efba 100644 --- a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc +++ b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc @@ -2,7 +2,7 @@ TOOLCHAIN_GCC_VERSION = "10.3.0" LICENSE = "CLOSED" SECTION = "toolchain" -TOOLCHAIN_PREFIX_arm = "arm-linux-gnueabi" +TOOLCHAIN_PREFIX_arm = "arm-openeuler-linux-gnueabi" TOOLCHAIN_PREFIX_aarch64 = "aarch64-openeuler-linux-gnu" EULER_TOOLCHAIN_GCC_PATH_INNER = "${TOOLCHAIN_PREFIX}/${TOOLCHAIN_GCC_VERSION}" EULER_TOOLCHAIN_GCC_PATH = "/gcc/${EULER_TOOLCHAIN_GCC_PATH_INNER}" -- Gitee From 59447eaf54436f4b4ba14b3460231d4019e124f7 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 13 Dec 2021 20:04:55 +0800 Subject: [PATCH 092/304] add recipe for libpcre Signed-off-by: lixiaoyong --- .../recipes-core/libpcre/libpcre/Makefile | 183 ++++++++++++++++++ .../recipes-core/libpcre/libpcre/run-ptest | 3 + .../recipes-core/libpcre/libpcre_8.44.bb | 74 +++++++ 3 files changed, 260 insertions(+) create mode 100644 meta-openeuler/recipes-core/libpcre/libpcre/Makefile create mode 100644 meta-openeuler/recipes-core/libpcre/libpcre/run-ptest create mode 100644 meta-openeuler/recipes-core/libpcre/libpcre_8.44.bb diff --git a/meta-openeuler/recipes-core/libpcre/libpcre/Makefile b/meta-openeuler/recipes-core/libpcre/libpcre/Makefile new file mode 100644 index 00000000000..708d807d085 --- /dev/null +++ b/meta-openeuler/recipes-core/libpcre/libpcre/Makefile @@ -0,0 +1,183 @@ +TESTS = pcre_stringpiece_unittest RunTest RunGrepTest +subdir = . +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +am__sh_e_setup = case $$- in *e*) set +e;; esac +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +MKDIR_P = /bin/mkdir -p +PACKAGE_STRING = PCRE 8.36 +SHELL = /bin/sh +srcdir = . +top_srcdir = . +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done; \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +pcre_stringpiece_unittest.log: pcre_stringpiece_unittest$(EXEEXT) + @p='pcre_stringpiece_unittest$(EXEEXT)'; \ + b='pcre_stringpiece_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) -- "$$tst" +RunTest.log: RunTest + @p='RunTest'; \ + b='RunTest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) -- "$$tst" +RunGrepTest.log: RunGrepTest + @p='RunGrepTest'; \ + b='RunGrepTest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) -- "$$tst" diff --git a/meta-openeuler/recipes-core/libpcre/libpcre/run-ptest b/meta-openeuler/recipes-core/libpcre/libpcre/run-ptest new file mode 100644 index 00000000000..990d4a12ad6 --- /dev/null +++ b/meta-openeuler/recipes-core/libpcre/libpcre/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +make check-TESTS diff --git a/meta-openeuler/recipes-core/libpcre/libpcre_8.44.bb b/meta-openeuler/recipes-core/libpcre/libpcre_8.44.bb new file mode 100644 index 00000000000..402992b4a3d --- /dev/null +++ b/meta-openeuler/recipes-core/libpcre/libpcre_8.44.bb @@ -0,0 +1,74 @@ +DESCRIPTION = "The PCRE library is a set of functions that implement regular \ +expression pattern matching using the same syntax and semantics as Perl 5. PCRE \ +has its own native API, as well as a set of wrapper functions that correspond \ +to the POSIX regular expression API." +SUMMARY = "Perl Compatible Regular Expressions" +HOMEPAGE = "http://www.pcre.org" +SECTION = "devel" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENCE;md5=3bb381a66a5385b246d4877922e7511e" +SRC_URI = "file://pcre/pcre-${PV}.tar.bz2 \ + file://run-ptest \ + file://Makefile \ + " + +SRC_URI[md5sum] = "cf7326204cc46c755b5b2608033d9d24" +SRC_URI[sha256sum] = "19108658b23b3ec5058edc9f66ac545ea19f9537234be1ec62b714c84399366d" + +CVE_PRODUCT = "pcre" + +S = "${WORKDIR}/pcre-${PV}" + +PROVIDES += "pcre" +DEPENDS += "bzip2 zlib" + +PACKAGECONFIG ??= "pcre8 unicode-properties jit" + +PACKAGECONFIG[pcre8] = "--enable-pcre8,--disable-pcre8" +PACKAGECONFIG[pcre16] = "--enable-pcre16,--disable-pcre16" +PACKAGECONFIG[pcre32] = "--enable-pcre32,--disable-pcre32" +PACKAGECONFIG[pcretest-readline] = "--enable-pcretest-libreadline,--disable-pcretest-libreadline,readline," +PACKAGECONFIG[unicode-properties] = "--enable-unicode-properties,--disable-unicode-properties" +PACKAGECONFIG[jit] = "--enable-jit=auto,--disable-jit" + +BINCONFIG = "${bindir}/pcre-config" + +inherit autotools binconfig-disabled ptest + +EXTRA_OECONF = "--enable-utf" + +PACKAGES =+ "libpcrecpp libpcreposix pcregrep pcregrep-doc pcretest pcretest-doc" + +SUMMARY_libpcrecpp = "${SUMMARY} - C++ wrapper functions" +SUMMARY_libpcreposix = "${SUMMARY} - C wrapper functions based on the POSIX regex API" +SUMMARY_pcregrep = "grep utility that uses perl 5 compatible regexes" +SUMMARY_pcregrep-doc = "grep utility that uses perl 5 compatible regexes - docs" +SUMMARY_pcretest = "program for testing Perl-comatible regular expressions" +SUMMARY_pcretest-doc = "program for testing Perl-comatible regular expressions - docs" + +FILES_libpcrecpp = "${libdir}/libpcrecpp.so.*" +FILES_libpcreposix = "${libdir}/libpcreposix.so.*" +FILES_pcregrep = "${bindir}/pcregrep" +FILES_pcregrep-doc = "${mandir}/man1/pcregrep.1" +FILES_pcretest = "${bindir}/pcretest" +FILES_pcretest-doc = "${mandir}/man1/pcretest.1" + +BBCLASSEXTEND = "native nativesdk" + +do_install_ptest() { + t=${D}${PTEST_PATH} + cp ${WORKDIR}/Makefile $t + cp -r ${S}/testdata $t + for i in pcre_stringpiece_unittest pcregrep pcretest; \ + do cp ${B}/.libs/$i $t; \ + done + for i in RunTest RunGrepTest test-driver; \ + do cp ${S}/$i $t; \ + done + # Skip the fr_FR locale test. If the locale fr_FR is found, it is tested. + # If not found, the test is skipped. The test program assumes fr_FR is non-UTF-8 + # locale so the test fails if fr_FR is UTF-8 locale. + sed -i -e 's:do3=yes:do3=no:g' ${D}${PTEST_PATH}/RunTest +} + +RDEPENDS_${PN}-ptest += "make" -- Gitee From 431526f90e531e38902ec1d0014e4f7119c6c15b Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 13 Dec 2021 20:06:03 +0800 Subject: [PATCH 093/304] add recipe for expat Signed-off-by: lixiaoyong --- .../expat/expat/libtool-tag.patch | 30 +++++++++++++++++++ .../recipes-core/expat/expat/run-ptest | 23 ++++++++++++++ .../recipes-core/expat/expat_2.4.1.bb | 28 +++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 meta-openeuler/recipes-core/expat/expat/libtool-tag.patch create mode 100644 meta-openeuler/recipes-core/expat/expat/run-ptest create mode 100644 meta-openeuler/recipes-core/expat/expat_2.4.1.bb diff --git a/meta-openeuler/recipes-core/expat/expat/libtool-tag.patch b/meta-openeuler/recipes-core/expat/expat/libtool-tag.patch new file mode 100644 index 00000000000..0a0aed23e5d --- /dev/null +++ b/meta-openeuler/recipes-core/expat/expat/libtool-tag.patch @@ -0,0 +1,30 @@ +From 10342e6b600858b091bc7771e454d9e06af06410 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Thu, 2 Nov 2017 18:20:57 +0800 +Subject: [PATCH] Add CC tag to build + +Add CC tag to build + +Upstream-Status: Pending +Signed-off-by: Khem Raj +Signed-off-by: Dengke Du +--- + Makefile.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile.in b/Makefile.in +index 9560a95..d444bd6 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -319,7 +319,7 @@ LIBCURRENT = @LIBCURRENT@ + LIBOBJS = @LIBOBJS@ + LIBREVISION = @LIBREVISION@ + LIBS = @LIBS@ +-LIBTOOL = @LIBTOOL@ ++LIBTOOL = @LIBTOOL@ --tag CC + LIPO = @LIPO@ + LN_S = @LN_S@ + LTLIBOBJS = @LTLIBOBJS@ +-- +2.7.4 + diff --git a/meta-openeuler/recipes-core/expat/expat/run-ptest b/meta-openeuler/recipes-core/expat/expat/run-ptest new file mode 100644 index 00000000000..1b39cec8e5e --- /dev/null +++ b/meta-openeuler/recipes-core/expat/expat/run-ptest @@ -0,0 +1,23 @@ +#!/bin/bash + +output=${1:-"expat_tests.log"} # default log file + +# logging function +function testCheck() { + testExec="$1" + shift + echo && echo ${testExec} && ./${testExec} "$@" + error=$? + result=$([[ ${error} -eq 0 ]] && echo "PASS" || echo "FAIL") + echo "${result}: ${testExec}" && echo "============================" +} + +export output +export -f testCheck +TIME=$(which time) + +echo "Architecture: $(uname -m)" > ${output} +echo "Image: $(uname -sr)" >> ${output} +${TIME} -f 'Execution time: %e s' bash -c "testCheck runtests -vv" |& tee -a ${output} +${TIME} -f 'Execution time: %e s' bash -c "testCheck runtestspp -vv" |& tee -a ${output} +echo diff --git a/meta-openeuler/recipes-core/expat/expat_2.4.1.bb b/meta-openeuler/recipes-core/expat/expat_2.4.1.bb new file mode 100644 index 00000000000..d396fb4191d --- /dev/null +++ b/meta-openeuler/recipes-core/expat/expat_2.4.1.bb @@ -0,0 +1,28 @@ +SUMMARY = "A stream-oriented XML parser library" +DESCRIPTION = "Expat is an XML parser library written in C. It is a stream-oriented parser in which an application registers handlers for things the parser might find in the XML document (like start tags)" +HOMEPAGE = "http://expat.sourceforge.net/" +SECTION = "libs" +LICENSE = "MIT" + +LIC_FILES_CHKSUM = "file://COPYING;md5=9e2ce3b3c4c0f2670883a23bbd7c37a9" + +SRC_URI = "file://expat/expat-${PV}.tar.gz \ + file://libtool-tag.patch \ + file://run-ptest \ + " + +SRC_URI[sha256sum] = "2f9b6a580b94577b150a7d5617ad4643a4301a6616ff459307df3e225bcfbf40" + +EXTRA_OECMAKE_class-native += "-DEXPAT_BUILD_DOCS=OFF" + +RDEPENDS_${PN}-ptest += "bash" + +inherit cmake lib_package ptest + +do_install_ptest_class-target() { + install -m 755 ${B}/tests/* ${D}${PTEST_PATH} +} + +BBCLASSEXTEND += "native nativesdk" + +CVE_PRODUCT = "expat libexpat" -- Gitee From c4829acbec2fcc84699e785043f1bfea344299ca Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 13 Dec 2021 20:06:55 +0800 Subject: [PATCH 094/304] add recipe for ethtool Signed-off-by: lixiaoyong --- .../ethtool/avoid_parallel_tests.patch | 29 +++++++++++++++ .../recipes-core/ethtool/ethtool/run-ptest | 2 + .../recipes-core/ethtool/ethtool_5.15.bb | 37 +++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 meta-openeuler/recipes-core/ethtool/ethtool/avoid_parallel_tests.patch create mode 100644 meta-openeuler/recipes-core/ethtool/ethtool/run-ptest create mode 100644 meta-openeuler/recipes-core/ethtool/ethtool_5.15.bb diff --git a/meta-openeuler/recipes-core/ethtool/ethtool/avoid_parallel_tests.patch b/meta-openeuler/recipes-core/ethtool/ethtool/avoid_parallel_tests.patch new file mode 100644 index 00000000000..c7f907f6487 --- /dev/null +++ b/meta-openeuler/recipes-core/ethtool/ethtool/avoid_parallel_tests.patch @@ -0,0 +1,29 @@ +From 1f9215b845a144e531536709b23cd5fb15e4f206 Mon Sep 17 00:00:00 2001 +From: Tudor Florea +Date: Wed, 28 May 2014 18:59:54 +0200 +Subject: [PATCH] ethtool: use serial-tests config needed by ptest. + +ptest needs buildtest-TESTS and runtest-TESTS targets. +serial-tests is required to generate those targets. + +Signed-off-by: Tudor Florea +Upstream-Status: Inappropriate +(default automake behavior incompatible with ptest) + +--- + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/configure.ac b/configure.ac +index d49eda6..c7fa195 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. + AC_INIT(ethtool, 5.15, netdev@vger.kernel.org) + AC_PREREQ(2.52) + AC_CONFIG_SRCDIR([ethtool.c]) +-AM_INIT_AUTOMAKE([gnu subdir-objects]) ++AM_INIT_AUTOMAKE([gnu subdir-objects serial-tests]) + AC_CONFIG_HEADERS([ethtool-config.h]) + + AM_MAINTAINER_MODE diff --git a/meta-openeuler/recipes-core/ethtool/ethtool/run-ptest b/meta-openeuler/recipes-core/ethtool/ethtool/run-ptest new file mode 100644 index 00000000000..1e245da112d --- /dev/null +++ b/meta-openeuler/recipes-core/ethtool/ethtool/run-ptest @@ -0,0 +1,2 @@ +#!/bin/sh +make -k runtest-TESTS diff --git a/meta-openeuler/recipes-core/ethtool/ethtool_5.15.bb b/meta-openeuler/recipes-core/ethtool/ethtool_5.15.bb new file mode 100644 index 00000000000..dc359e95c1d --- /dev/null +++ b/meta-openeuler/recipes-core/ethtool/ethtool_5.15.bb @@ -0,0 +1,37 @@ +SUMMARY = "Display or change ethernet card settings" +DESCRIPTION = "A small utility for examining and tuning the settings of your ethernet-based network interfaces." +HOMEPAGE = "http://www.kernel.org/pub/software/network/ethtool/" +SECTION = "console/network" +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ + file://ethtool.c;beginline=4;endline=17;md5=c19b30548c582577fc6b443626fc1216" + +SRC_URI = "file://ethtool/ethtool-${PV}.tar.xz \ + file://run-ptest \ + file://avoid_parallel_tests.patch \ + " + +SRC_URI[sha256sum] = "686fd6110389d49c2a120f00c3cd5dfe43debada8e021e4270d74bbe452a116d" + +UPSTREAM_CHECK_URI = "https://gitee/src-openeuler/ethtool" + +#inherit autotools ptest bash-completion pkgconfig +inherit autotools ptest + +RDEPENDS_${PN}-ptest += "make" + +#PACKAGECONFIG ?= "netlink" +PACKAGECONFIG[netlink] = "--disable-netlink,--disable-netlink,libmnl" +FILES_${PN}-bash-completion += "/usr/share/bash-completion/completions/*" +PACKAGES += "ethtool-bash-completion" + +do_compile_ptest() { + oe_runmake buildtest-TESTS +} + +do_install_ptest () { + cp ${B}/Makefile ${D}${PTEST_PATH} + install ${B}/test-cmdline ${D}${PTEST_PATH} + install ${B}/ethtool ${D}${PTEST_PATH}/ethtool + sed -i 's/^Makefile/_Makefile/' ${D}${PTEST_PATH}/Makefile +} -- Gitee From 3051945876dbb10f6020579e090244102ac1824b Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Tue, 14 Dec 2021 09:47:40 +0800 Subject: [PATCH 095/304] modify sed and grep Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/grep/grep_3.6.bb | 4 +++- meta-openeuler/recipes-core/sed/sed_4.8.bb | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/meta-openeuler/recipes-core/grep/grep_3.6.bb b/meta-openeuler/recipes-core/grep/grep_3.6.bb index 0e648199734..ee27996f1d6 100644 --- a/meta-openeuler/recipes-core/grep/grep_3.6.bb +++ b/meta-openeuler/recipes-core/grep/grep_3.6.bb @@ -6,7 +6,9 @@ SECTION = "console/utils" LICENSE = "GPLv3" LIC_FILES_CHKSUM = "file://COPYING;md5=1ebbd3e34237af26da5dc08a4e440464" -SRC_URI = "${GNU_MIRROR}/grep/grep-${PV}.tar.xz" +SRC_URI = "file://grep/grep-${PV}.tar.xz \ +" +#file://grep/grep-3.6-gnulib-c-stack-fix.patch SRC_URI[sha256sum] = "667e15e8afe189e93f9f21a7cd3a7b3f776202f417330b248c2ad4f997d9373e" diff --git a/meta-openeuler/recipes-core/sed/sed_4.8.bb b/meta-openeuler/recipes-core/sed/sed_4.8.bb index bd33baf32b5..7afff221731 100644 --- a/meta-openeuler/recipes-core/sed/sed_4.8.bb +++ b/meta-openeuler/recipes-core/sed/sed_4.8.bb @@ -7,7 +7,10 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=c678957b0c8e964aa6c70fd77641a71e \ " SECTION = "console/utils" -SRC_URI = "${GNU_MIRROR}/sed/sed-${PV}.tar.xz \ +SRC_URI = "file://sed/sed-${PV}.tar.xz \ + file://sed/backport-sed-c-flag.patch \ + file://sed/backport-sed-handle-very-long-execution-lines-tiny-change.patch \ + file://sed/backport-sed-handle-very-long-input-lines-with-R-tiny-change.patch \ file://run-ptest \ " -- Gitee From b1d8efad39bd59d2f05d16204aa4259fd66ee116 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Wed, 15 Dec 2021 16:59:42 +0800 Subject: [PATCH 096/304] modify bzip2, gzip and xz Signed-off-by: lixiaoyong --- .../recipes-core/bzip2/bzip2_1.0.8.bb | 19 ++++--------------- meta-openeuler/recipes-core/gzip/gzip_1.10.bb | 5 ++++- meta-openeuler/recipes-core/xz/xz_5.2.5.bb | 2 +- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/meta-openeuler/recipes-core/bzip2/bzip2_1.0.8.bb b/meta-openeuler/recipes-core/bzip2/bzip2_1.0.8.bb index c200a7a33ce..94a75631b15 100644 --- a/meta-openeuler/recipes-core/bzip2/bzip2_1.0.8.bb +++ b/meta-openeuler/recipes-core/bzip2/bzip2_1.0.8.bb @@ -14,15 +14,12 @@ LICENSE_libbz2 = "bzip2-1.0.6" LICENSE_${PN}-ptest = "bzip2-1.0.6 & GPLv3+ & Apache-2.0 & MS-PL & BSD-3-Clause & Zlib" LIC_FILES_CHKSUM = "file://LICENSE;beginline=4;endline=37;md5=600af43c50f1fcb82e32f19b32df4664 \ - file://${WORKDIR}/git/commons-compress/LICENSE.txt;md5=86d3f3a95c324c9479bd8986968f4327 \ - file://${WORKDIR}/git/dotnetzip/License.txt;md5=9cb56871eed4e748c3bc7e8ff352a54f \ - file://${WORKDIR}/git/dotnetzip/License.zlib.txt;md5=cc421ccd22eeb2e5db6b79e6de0a029f \ - file://${WORKDIR}/git/go/LICENSE;md5=5d4950ecb7b26d2c5e4e7b4e0dd74707 \ - file://${WORKDIR}/git/lbzip2/COPYING;md5=d32239bcb673463ab874e80d47fae504 \ " +#git://sourceware.org/git/bzip2-tests.git;name=bzip2-tests -SRC_URI = "https://sourceware.org/pub/${BPN}/${BPN}-${PV}.tar.gz \ - git://sourceware.org/git/bzip2-tests.git;name=bzip2-tests \ +SRC_URI = "file://bzip2/bzip2-${PV}.tar.gz \ + file://bzip2/0001-add-compile-option.patch \ + file://bzip2/0002-CVE-2019-12900.patch \ file://configure.ac;subdir=${BP} \ file://Makefile.am;subdir=${BP} \ file://run-ptest \ @@ -53,16 +50,8 @@ do_configure_prepend () { do_install_ptest () { install -d ${D}${PTEST_PATH}/bzip2-tests - cp -r ${WORKDIR}/git/commons-compress ${D}${PTEST_PATH}/bzip2-tests/commons-compress - cp -r ${WORKDIR}/git/dotnetzip ${D}${PTEST_PATH}/bzip2-tests/dotnetzip - cp -r ${WORKDIR}/git/go ${D}${PTEST_PATH}/bzip2-tests/go - cp -r ${WORKDIR}/git/lbzip2 ${D}${PTEST_PATH}/bzip2-tests/lbzip2 - cp -r ${WORKDIR}/git/pyflate ${D}${PTEST_PATH}/bzip2-tests/pyflate - cp ${WORKDIR}/git/README ${D}${PTEST_PATH}/bzip2-tests/ - cp ${WORKDIR}/git/run-tests.sh ${D}${PTEST_PATH}/bzip2-tests/ sed -i -e "s|^Makefile:|_Makefile:|" ${D}${PTEST_PATH}/Makefile } - FILES_libbz2 = "${libdir}/lib*${SOLIBS}" RDEPENDS_${PN}-ptest += "make bash" diff --git a/meta-openeuler/recipes-core/gzip/gzip_1.10.bb b/meta-openeuler/recipes-core/gzip/gzip_1.10.bb index 9778e687e1a..151fb48ad99 100644 --- a/meta-openeuler/recipes-core/gzip/gzip_1.10.bb +++ b/meta-openeuler/recipes-core/gzip/gzip_1.10.bb @@ -2,9 +2,12 @@ require gzip.inc LICENSE = "GPLv3+" -SRC_URI = "${GNU_MIRROR}/gzip/${BP}.tar.gz \ +SRC_URI = "file://gzip/gzip-${PV}.tar.xz \ + file://gzip/fix-verbose-disable.patch \ + file://gzip/gzexe.patch \ file://run-ptest \ " +#file://gzip/performance-neoncrc32-and-prfm.patch SRC_URI_append_class-target = " file://wrong-path-fix.patch" LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504 \ diff --git a/meta-openeuler/recipes-core/xz/xz_5.2.5.bb b/meta-openeuler/recipes-core/xz/xz_5.2.5.bb index 63a91fc556a..bdcc1020e1a 100644 --- a/meta-openeuler/recipes-core/xz/xz_5.2.5.bb +++ b/meta-openeuler/recipes-core/xz/xz_5.2.5.bb @@ -23,7 +23,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=97d554a32881fee0aa283d96e47cb24a \ file://lib/getopt.c;endline=23;md5=2069b0ee710572c03bb3114e4532cd84 \ " -SRC_URI = "https://tukaani.org/xz/xz-${PV}.tar.gz" +SRC_URI = "file://xz/xz-${PV}.tar.xz" SRC_URI[md5sum] = "0d270c997aff29708c74d53f599ef717" SRC_URI[sha256sum] = "f6f4910fd033078738bd82bfba4f49219d03b17eb0794eb91efbae419f4aba10" UPSTREAM_CHECK_REGEX = "xz-(?P\d+(\.\d+)+)\.tar" -- Gitee From 22d69b47b01428a65e5084cc748a231be85d741c Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Wed, 15 Dec 2021 17:01:59 +0800 Subject: [PATCH 097/304] modify less and libtirpc Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/less/less_563.bb | 15 ++++++++++++++- .../recipes-core/libtirpc/libtirpc_1.3.2.bb | 4 +++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/meta-openeuler/recipes-core/less/less_563.bb b/meta-openeuler/recipes-core/less/less_563.bb index 763176ae222..a9490e5c0d5 100644 --- a/meta-openeuler/recipes-core/less/less_563.bb +++ b/meta-openeuler/recipes-core/less/less_563.bb @@ -25,8 +25,21 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504 \ " DEPENDS = "ncurses" -SRC_URI = "http://www.greenwoodsoftware.com/${BPN}/${BPN}-${PV}.tar.gz \ +SRC_URI = "file://${BPN}/${BPN}-${PV}.tar.gz \ + file://${BPN}/backport-Create-only-one-ifile-when-a-file-is-opened-under-di.patch \ + file://${BPN}/backport-Fix-crash-when-call-set_ifilename-with-a-pointer-to-.patch \ + file://${BPN}/backport-Fix-minor-memory-leak-with-input-preprocessor.-150.patch \ + file://${BPN}/backport-Fix-Tag-not-found-error-while-looking-for-a-tag-s-lo.patch \ + file://${BPN}/backport-Ignore-SIGTSTP-in-secure-mode.patch \ + file://${BPN}/backport-Lesskey-don-t-translate-ctrl-K-in-an-EXTRA-string.patch \ + file://${BPN}/backport-Make-histpattern-return-negative-value-to-indicate-e.patch \ + file://${BPN}/backport-Protect-from-buffer-overrun.patch \ + file://${BPN}/backport-Remove-extraneous-frees-associated-with-removed-call.patch \ + file://${BPN}/backport-Remove-unnecessary-call-to-pshift-in-pappend.patch \ + file://${BPN}/backport-Reset-horizontal-shift-when-opening-a-new-file.patch \ + file://${BPN}/less-394-time.patch \ " +#file://${BPN}/less-418-fsync.patch SRC_URI[sha256sum] = "ce5b6d2b9fc4442d7a07c93ab128d2dff2ce09a1d4f2d055b95cf28dd0dc9a9a" diff --git a/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb b/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb index 6905ee305d5..c4d06b5055c 100644 --- a/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb +++ b/meta-openeuler/recipes-core/libtirpc/libtirpc_1.3.2.bb @@ -9,7 +9,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=f835cce8852481e4b2bbbdd23b5e47f3 \ PROVIDES = "virtual/librpc" -SRC_URI = "file://libtirpc/libtirpc-${PV}.tar.bz2" +SRC_URI = "file://libtirpc/libtirpc-${PV}.tar.bz2 \ + file://libtirpc/0001-update-libtirpc-to-enable-tcp-port-listening.patch \ +" UPSTREAM_CHECK_URI = "https://gitee.com/src-openeuler/libtirpc" UPSTREAM_CHECK_REGEX = "(?P\d+(\.\d+)+)/" SRC_URI[sha256sum] = "245895caf066bec5e3d4375942c8cb4366adad184c29c618d97f724ea309ee17" -- Gitee From bcb9f9a50351d368c1eca25a6409a183e203d981 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Wed, 15 Dec 2021 17:05:44 +0800 Subject: [PATCH 098/304] add recipe for readline Signed-off-by: lixiaoyong --- .../recipes-core/readline/files/inputrc | 61 +++++++++++++++++++ .../readline/readline-8.1/configure-fix.patch | 35 +++++++++++ .../readline/readline-8.1/rl-native.map | 12 ++++ .../recipes-core/readline/readline.inc | 54 ++++++++++++++++ .../recipes-core/readline/readline_8.1.bb | 10 +++ 5 files changed, 172 insertions(+) create mode 100644 meta-openeuler/recipes-core/readline/files/inputrc create mode 100644 meta-openeuler/recipes-core/readline/readline-8.1/configure-fix.patch create mode 100644 meta-openeuler/recipes-core/readline/readline-8.1/rl-native.map create mode 100644 meta-openeuler/recipes-core/readline/readline.inc create mode 100644 meta-openeuler/recipes-core/readline/readline_8.1.bb diff --git a/meta-openeuler/recipes-core/readline/files/inputrc b/meta-openeuler/recipes-core/readline/files/inputrc new file mode 100644 index 00000000000..b5c4c8af24b --- /dev/null +++ b/meta-openeuler/recipes-core/readline/files/inputrc @@ -0,0 +1,61 @@ +# /etc/inputrc - global inputrc for libreadline +# See readline(3readline) and `info rluserman' for more information. + +# Be 8 bit clean. +set input-meta on +set output-meta on + +# To allow the use of 8bit-characters like the german umlauts, comment out +# the line below. However this makes the meta key not work as a meta key, +# which is annoying to those which don't need to type in 8-bit characters. + +# set convert-meta off + +# try to enable the application keypad when it is called. Some systems +# need this to enable the arrow keys. +# set enable-keypad on + +# see /usr/share/doc/bash/inputrc.arrows for other codes of arrow keys + +# do not bell on tab-completion +# set bell-style none + +# some defaults / modifications for the emacs mode +$if mode=emacs + +# allow the use of the Home/End keys +# "\e[1~": beginning-of-line +# "\e[4~": end-of-line + +# allow the use of the Delete/Insert keys +# "\e[3~": delete-char +# "\e[2~": quoted-insert + +# mappings for "page up" and "page down" to step to the beginning/end +# of the history +# "\e[5~": beginning-of-history +# "\e[6~": end-of-history + +# alternate mappings for "page up" and "page down" to search the history +# "\e[5~": history-search-backward +# "\e[6~": history-search-forward + +# # mappings for Ctrl-left-arrow and Ctrl-right-arrow for word moving +# "\e[5C": forward-word +# "\e[5D": backward-word +# "\e\e[C": forward-word +# "\e\e[D": backward-word + +# $if term=rxvt +# "\e[8~": end-of-line +# $endif + +# for non RH/Debian xterm, can't hurt for RH/DEbian xterm +# "\eOH": beginning-of-line +# "\eOF": end-of-line + +# for freebsd console +# "\e[H": beginning-of-line +# "\e[F": end-of-line + +$endif diff --git a/meta-openeuler/recipes-core/readline/readline-8.1/configure-fix.patch b/meta-openeuler/recipes-core/readline/readline-8.1/configure-fix.patch new file mode 100644 index 00000000000..ef3104f8a6d --- /dev/null +++ b/meta-openeuler/recipes-core/readline/readline-8.1/configure-fix.patch @@ -0,0 +1,35 @@ +Upstream-Status: Pending + +Without this it fails to link against libtermcap causing various missing +symbols issues. + +RP - 8/10/08 + +Support 6.3 which uses configure.ac rather than configure.in. +Signed-off-by: Hongxu Jia +--- + configure.ac | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/configure.ac b/configure.ac +index cea8f91..9075b8f 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -218,10 +218,10 @@ if test -f ${srcdir}/support/shobj-conf; then + AC_MSG_CHECKING(configuration for building shared libraries) + eval `TERMCAP_LIB=$TERMCAP_LIB ${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}` + +-# case "$SHLIB_LIBS" in +-# *curses*|*termcap*|*termlib*) ;; +-# *) SHLIB_LIBS="$SHLIB_LIBS $TERMCAP_LIB" ;; +-# esac ++ case "$SHLIB_LIBS" in ++ *curses*|*termcap*|*termlib*) ;; ++ *) SHLIB_LIBS="$SHLIB_LIBS $TERMCAP_LIB" ;; ++ esac + + AC_SUBST(SHOBJ_CC) + AC_SUBST(SHOBJ_CFLAGS) +-- +1.8.1.2 + diff --git a/meta-openeuler/recipes-core/readline/readline-8.1/rl-native.map b/meta-openeuler/recipes-core/readline/readline-8.1/rl-native.map new file mode 100644 index 00000000000..5e7d49cdd22 --- /dev/null +++ b/meta-openeuler/recipes-core/readline/readline-8.1/rl-native.map @@ -0,0 +1,12 @@ +READLINE_6.3 { + rl_change_environment; + rl_clear_history; + rl_executing_key; + rl_executing_keyseq; + rl_filename_stat_hook; + rl_history_substr_search_backward; + rl_history_substr_search_forward; + rl_input_available_hook; + rl_print_last_kbd_macro; + rl_signal_event_hook; +}; diff --git a/meta-openeuler/recipes-core/readline/readline.inc b/meta-openeuler/recipes-core/readline/readline.inc new file mode 100644 index 00000000000..fa17afed078 --- /dev/null +++ b/meta-openeuler/recipes-core/readline/readline.inc @@ -0,0 +1,54 @@ +SUMMARY = "Library for editing typed command lines" +DESCRIPTION = "The GNU Readline library provides a set of functions for use by applications that allow users to edit \ +command lines as they are typed in. Both Emacs and vi editing modes are available. The Readline library includes \ +additional functions to maintain a list of previously-entered command lines, to recall and perhaps reedit those \ +lines, and perform csh-like history expansion on previous commands." +SECTION = "libs" +HOMEPAGE = "https://tiswww.case.edu/php/chet/readline/rltop.html" + +# GPLv2+ (< 6.0), GPLv3+ (>= 6.0) +LICENSE = "GPLv3+" +LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" + +DEPENDS += "ncurses" + +inherit autotools texinfo + +#EXTRA_AUTORECONF += "--exclude=autoheader" +EXTRA_AUTORECONF_DEFINE += " AUTOHEADER=echo " + +LEAD_SONAME = "libreadline.so" + +do_configure_prepend () { + if [ ! -e ${S}/acinclude.m4 ]; then + cat ${S}/aclocal.m4 > ${S}/acinclude.m4 + fi +} + +do_install_append () { + # Make install doesn't properly install these + oe_libinstall -so -C shlib libhistory ${D}${libdir} + oe_libinstall -so -C shlib libreadline ${D}${libdir} + + rmdir ${D}${bindir} + rm -rf ${D}${datadir}/${BPN}/*.c + rmdir ${D}${datadir}/${BPN} || true + + install -m 0755 -d ${D}${sysconfdir} + install -m 0644 ${WORKDIR}/inputrc ${D}${sysconfdir}/inputrc +} + +BBCLASSEXTEND = "native nativesdk" + +CONFFILES_${PN} += "${sysconfdir}/inputrc" + +#inherit update-alternatives + +ALTERNATIVE_PRIORITY = "100" +ALTERNATIVE_${PN}-doc = "history.3" +ALTERNATIVE_LINK_NAME[history.3] = "${mandir}/man3/history.3" + +# OpenSuse injects versions into libreadline leading to conficits between our native one and theirs +# see their spec file for where this is injected. Extra versioning is harmless so we just do the same. +SRC_URI_append_class-native = " file://rl-native.map" +LDFLAGS_append_class-native = " -Wl,--version-script=${WORKDIR}/rl-native.map" diff --git a/meta-openeuler/recipes-core/readline/readline_8.1.bb b/meta-openeuler/recipes-core/readline/readline_8.1.bb new file mode 100644 index 00000000000..b03e75ef489 --- /dev/null +++ b/meta-openeuler/recipes-core/readline/readline_8.1.bb @@ -0,0 +1,10 @@ +require readline.inc + +SRC_URI = "file://readline/${BPN}-${PV}.tar.gz \ + file://readline/readline-8.0-shlib.patch \ + file://inputrc \ + file://configure-fix.patch \ +" + +SRC_URI[archive.md5sum] = "e9557dd5b1409f5d7b37ef717c64518e" +SRC_URI[archive.sha256sum] = "f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" -- Gitee From b9c7f168c4013ef3ebf731e37db7317b8747eb3a Mon Sep 17 00:00:00 2001 From: maminjie Date: Fri, 17 Dec 2021 10:19:31 +0800 Subject: [PATCH 099/304] busybox: use SYSROOT/usr/include/tirpc first Configure CFLAGS in the bb file, using the rpc/rpc.h header file in tirpc under sysroot. Configure CONFIG_EXTRA_CFLAGS="-I/usr/include/tirpc" in .config, using the rpc/rpc.h header file under the host machine /usr/include/tirpc. If CFLAGS is not configured, when the host does not have tirpc header files, the compilation will fail. CFLAGS and CONFIG_EXTRA_CFLAGS are compatible, where CFLAGS is first, and the tirpc header file under sysroot is used first. Signed-off-by: maminjie --- meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb index c04d71af9ca..afcb1162477 100644 --- a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb +++ b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb @@ -12,6 +12,7 @@ PR = "r1" DEPENDS += "virtual/libc" DEPENDS += "libtirpc" +CFLAGS += "-I${STAGING_INCDIR}/tirpc" #get arch info inherit kernel-arch -- Gitee From c142f8d7764abcdac86301523f0e07a2f0292638 Mon Sep 17 00:00:00 2001 From: Jiangfeng Xiao Date: Thu, 23 Dec 2021 11:31:34 +0800 Subject: [PATCH 100/304] add yocto docs Signed-off-by: Jiangfeng Xiao --- docs/Makefile | 20 ++++++++++++ docs/image/.keep | 0 docs/image/yocto-poky.png | Bin 0 -> 15371 bytes docs/make.bat | 35 +++++++++++++++++++++ docs/source/_static/.keep | 0 docs/source/_templates/.keep | 0 docs/source/conf.py | 58 +++++++++++++++++++++++++++++++++++ docs/source/index.rst | 42 +++++++++++++++++++++++++ 8 files changed, 155 insertions(+) create mode 100644 docs/Makefile create mode 100644 docs/image/.keep create mode 100644 docs/image/yocto-poky.png create mode 100644 docs/make.bat create mode 100644 docs/source/_static/.keep create mode 100644 docs/source/_templates/.keep create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000000..d0c3cbf1020 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/image/.keep b/docs/image/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/docs/image/yocto-poky.png b/docs/image/yocto-poky.png new file mode 100644 index 0000000000000000000000000000000000000000..bea3b9d2eb020c08ca7f8b1a992cbadc108d7cda GIT binary patch literal 15371 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 literal 0 HcmV?d00001 diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 00000000000..6fcf05b4b76 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/_static/.keep b/docs/source/_static/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/docs/source/_templates/.keep b/docs/source/_templates/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 00000000000..9bba86ddafb --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,58 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = 'yocto-doc' +copyright = '2021, lisiming' +author = 'lisiming' + +# The full version, including alpha/beta/rc tags +release = '1.0.0' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +#html_theme = 'alabaster' +html_theme = 'default' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +master_doc= 'index' diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 00000000000..1b4432eea7d --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,42 @@ +.. yocto-doc documentation master file, created by + sphinx-quickstart on Wed Dec 1 11:43:39 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +=========================================== +openeuler embedded yocto原理介绍及使用指导 +=========================================== + +1.Openeuler yocto 基础框架 +===================================== +https://docs.yoctoproject.org/overview-manual/yp-intro.html# + +1.1 yocto是什么 +------------------ +https://docs.yoctoproject.org/overview-manual/yp-intro.html#what-is-the-yocto-project +https://docs.yoctoproject.org/overview-manual/yp-intro.html#the-yocto-project-layer-model + + +1.2 主要组件和工具 +------------------ +https://docs.yoctoproject.org/overview-manual/yp-intro.html#components-and-tools +https://docs.yoctoproject.org/overview-manual/yp-intro.html#the-openembedded-build-system-workflow +https://docs.yoctoproject.org/overview-manual/concepts.html + +1.2.1 bitbake +^^^^^^^^^^^^^^^^ + +1.2.2 oe-core +^^^^^^^^^^^^^^^^ + +1.2.3 Poky +^^^^^^^^^^^^^^^^ +https://docs.yoctoproject.org/overview-manual/yp-intro.html#reference-embedded-distribution-poky + +1.2.4 opkg +^^^^^^^^^^^^^^^^ + + + +Indices and tables +================== -- Gitee From 0f8976d21b4c85a7475b0b465c9badecc9711778 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 23 Dec 2021 15:03:36 +0800 Subject: [PATCH 101/304] Rename glibc_2.25.bb to glibc_2.34.bb Signed-off-by: lixiaoyong --- .../recipes-core/glibc/{glibc_2.25.bb => glibc_2.34.bb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename meta-openeuler/recipes-core/glibc/{glibc_2.25.bb => glibc_2.34.bb} (100%) diff --git a/meta-openeuler/recipes-core/glibc/glibc_2.25.bb b/meta-openeuler/recipes-core/glibc/glibc_2.34.bb similarity index 100% rename from meta-openeuler/recipes-core/glibc/glibc_2.25.bb rename to meta-openeuler/recipes-core/glibc/glibc_2.34.bb -- Gitee From c98aa8c37cae60d237acf3ccdc926f17afe58191 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Fri, 24 Dec 2021 11:37:54 +0800 Subject: [PATCH 102/304] modify iSulad Signed-off-by: lixiaoyong --- .../{iSulad_2.0.9.bb => iSulad_2.0.10.bb} | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) rename meta-openeuler/recipes-core/iSulad/{iSulad_2.0.9.bb => iSulad_2.0.10.bb} (50%) diff --git a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.10.bb similarity index 50% rename from meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb rename to meta-openeuler/recipes-core/iSulad/iSulad_2.0.10.bb index 22cf83388f4..d76d91b7111 100644 --- a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb +++ b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.10.bb @@ -4,13 +4,28 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" SRC_URI = "file://iSulad/v2.0.10.tar.gz \ - file://0001-fix-bug-disable-selinux-not-selinux-label-file.patch \ - file://0002-delete-call-setlocale.patch \ - file://0003-modify-printf-to-arm32.patch \ - file://0004-deamon-do-not-support-attach-and-pause.patch \ - file://0005-fix-exec-30s-exit.patch \ + file://0001-fix-bug-disable-selinux-not-selinux-label-file.patch \ + file://0002-delete-call-setlocale.patch \ + file://0003-modify-printf-to-arm32.patch \ + file://0004-deamon-do-not-support-attach-and-pause.patch \ + file://0005-fix-exec-30s-exit.patch \ + file://iSulad/0002-fix-memleak-when-use-multiple-volumes-from.patch \ + file://iSulad/0005-delete-isulad-h-flag.patch \ + file://iSulad/0006-Fix-memory-leak-in-ClearCniNetwork-when-calling-get_.patch \ + file://iSulad/0007-fix-cri-libwebsockets-sync_close_sem-memory-leak.patch \ + file://iSulad/0008-fix-cpu-variant-get-error.patch \ + file://iSulad/0009-fix-unit-test-error-of-registry-in-armv8.patch \ + file://iSulad/0010-Modified-cmakelist-of-storage_layer-and-added-a-new-.patch \ + file://iSulad/0011-add-fuzz-build-in-CI.patch \ + file://iSulad/0012-print-valgrind-log.patch \ + file://iSulad/0013-fix-cri-version-memory-leak.patch \ + file://iSulad/0014-fix-undefined-reference-in-libisulad_img.so.patch \ + file://iSulad/0015-fix-undefined-reference-to-service_arguments_free-in.patch \ + file://iSulad/0016-fix-mem-leak.patch \ + file://iSulad/0017-isula-pull-does-not-support-format-name-digest.patch \ + file://iSulad/0019-add-pull-request-gateway-checker-for-build-and-ut.patch \ + file://iSulad/0020-Optimize-websocket-streaming-service-code.patch \ " - FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}" -- Gitee From a012a9b79aa2b337fe524409b46dc8f60930f3f7 Mon Sep 17 00:00:00 2001 From: linzichang Date: Fri, 24 Dec 2021 11:41:05 +0800 Subject: [PATCH 103/304] add recipe for libaio Signed-off-by: linzichang --- .../recipes-core/libaio/libaio_0.3.112.bb | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 meta-openeuler/recipes-core/libaio/libaio_0.3.112.bb diff --git a/meta-openeuler/recipes-core/libaio/libaio_0.3.112.bb b/meta-openeuler/recipes-core/libaio/libaio_0.3.112.bb new file mode 100644 index 00000000000..d0b78921f1d --- /dev/null +++ b/meta-openeuler/recipes-core/libaio/libaio_0.3.112.bb @@ -0,0 +1,20 @@ +SUMMARY = "Asynchronous I/O library" +DESCRIPTION = "Asynchronous input/output library that uses the kernels native interface" +HOMEPAGE = "http://lse.sourceforge.net/io/aio.html" + +LICENSE = "LGPLv2.1+" +LIC_FILES_CHKSUM = "file://COPYING;md5=d8045f3b8f929c1cb29a1e3fd737b499" + +SRC_URI = "file://libaio/libaio-${PV}.tar.gz \ + file://libaio/0001-libaio-arm64-ilp32.patch \ + file://libaio/0002-libaio-makefile-cflags.patch \ + file://libaio/0003-libaio-fix-for-x32.patch \ + file://00_arches.patch \ + " +EXTRA_OEMAKE =+ "prefix=${prefix} includedir=${includedir} libdir=${libdir}" + +do_install () { + oe_runmake install DESTDIR=${D} +} + +BBCLASSEXTEND = "native nativesdk" -- Gitee From b41fa6574d6c3caa02cdbe7ed5d35346542c0863 Mon Sep 17 00:00:00 2001 From: linzichang Date: Fri, 24 Dec 2021 11:45:09 +0800 Subject: [PATCH 104/304] add recipe for libffi Signed-off-by: linzichang --- .../recipes-support/libffi/libffi_3.4.2.bb | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 meta-openeuler/recipes-support/libffi/libffi_3.4.2.bb diff --git a/meta-openeuler/recipes-support/libffi/libffi_3.4.2.bb b/meta-openeuler/recipes-support/libffi/libffi_3.4.2.bb new file mode 100644 index 00000000000..b360720068d --- /dev/null +++ b/meta-openeuler/recipes-support/libffi/libffi_3.4.2.bb @@ -0,0 +1,33 @@ +SUMMARY = "A portable foreign function interface library" +HOMEPAGE = "http://sourceware.org/libffi/" +DESCRIPTION = "The `libffi' library provides a portable, high level programming interface to various calling \ +conventions. This allows a programmer to call any function specified by a call interface description at run \ +time. FFI stands for Foreign Function Interface. A foreign function interface is the popular name for the \ +interface that allows code written in one language to call code written in another language. The `libffi' \ +library really only provides the lowest, machine dependent layer of a fully featured foreign function interface. \ +A layer must exist above `libffi' that handles type conversions for values passed between the two languages." + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=679b5c9bdc79a2b93ee574e193e7a7bc" + +SRC_URI = "file://libffi/${BPN}-${PV}.tar.gz" + +SRC_URI[md5sum] = "294b921e6cf9ab0fbaea4b639f8fdbe8" +SRC_URI[sha256sum] = "540fb721619a6aba3bdeef7d940d8e9e0e6d2c193595bc243241b77ff9e93620" + +EXTRA_OECONF += "--disable-builddir" +EXTRA_OEMAKE_class-target = "LIBTOOLFLAGS='--tag=CC'" +inherit autotools texinfo multilib_header + +do_install_append() { + oe_multilib_header ffi.h ffitarget.h +} + +FILES_${PN}-dev += "${libdir}/libffi-${PV}" + +# Doesn't compile in MIPS16e mode due to use of hand-written +# assembly +MIPS_INSTRUCTION_SET = "mips" + +BBCLASSEXTEND = "native nativesdk" + -- Gitee From f3e54dfe3dd0614aba2fceab72ae90216f543646 Mon Sep 17 00:00:00 2001 From: linzichang Date: Fri, 24 Dec 2021 11:46:35 +0800 Subject: [PATCH 105/304] add recipe for popt Signed-off-by: linzichang --- .../recipes-support/popt/popt_1.18.bb | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 meta-openeuler/recipes-support/popt/popt_1.18.bb diff --git a/meta-openeuler/recipes-support/popt/popt_1.18.bb b/meta-openeuler/recipes-support/popt/popt_1.18.bb new file mode 100644 index 00000000000..f88c821e95c --- /dev/null +++ b/meta-openeuler/recipes-support/popt/popt_1.18.bb @@ -0,0 +1,21 @@ +SUMMARY = "Library for parsing command line options" +DESCRIPTION = "Popt is a C library for parsing command line parameters. Popt was heavily influenced by the getopt() and getopt_long() functions, but it improves on them by allowing more powerful argument expansion. Popt can parse arbitrary argv[] style arrays and automatically set variables based on command line arguments." +HOMEPAGE = "https://www.rpm.org/" +SECTION = "libs" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://COPYING;md5=cb0613c30af2a8249b8dcc67d3edb06d" + +DEPENDS = "virtual/libiconv" + +SRC_URI = "file://popt/${BP}.tar.gz \ + file://popt/fix-coverity-CID-1057440-Unused-pointer-value-UNUSED.patch \ + file://popt/fix-handle-newly-added-asset-.-call-like-elsewhere.patch \ + file://popt/fix-obscure-iconv-mis-call-error-path-could-lead-to-.patch \ + file://popt/fix-permit-reading-aliases-remove-left-over-goto-exi.patch \ +" +SRC_URI[sha256sum] = "5159bc03a20b28ce363aa96765f37df99ea4d8850b1ece17d1e6ad5c24fdc5d1" + +inherit autotools gettext + +BBCLASSEXTEND = "native nativesdk" -- Gitee From 481743bea0d14e6a79a2a8f38d38d09b45268e51 Mon Sep 17 00:00:00 2001 From: linzichang Date: Fri, 24 Dec 2021 11:50:42 +0800 Subject: [PATCH 106/304] add recipe for util-linux Signed-off-by: linzichang --- .../recipes-core/util-linux/util-linux.inc | 43 +++ .../util-linux/util-linux/run-ptest | 43 +++ .../util-linux/util-linux/runuser-l.pamd | 3 + .../util-linux/util-linux/runuser.pamd | 4 + .../util-linux/util-linux_2.36.1.bb | 329 ++++++++++++++++++ 5 files changed, 422 insertions(+) create mode 100644 meta-openeuler/recipes-core/util-linux/util-linux.inc create mode 100644 meta-openeuler/recipes-core/util-linux/util-linux/run-ptest create mode 100644 meta-openeuler/recipes-core/util-linux/util-linux/runuser-l.pamd create mode 100644 meta-openeuler/recipes-core/util-linux/util-linux/runuser.pamd create mode 100644 meta-openeuler/recipes-core/util-linux/util-linux_2.36.1.bb diff --git a/meta-openeuler/recipes-core/util-linux/util-linux.inc b/meta-openeuler/recipes-core/util-linux/util-linux.inc new file mode 100644 index 00000000000..fcefde67c94 --- /dev/null +++ b/meta-openeuler/recipes-core/util-linux/util-linux.inc @@ -0,0 +1,43 @@ +SUMMARY = "A suite of basic system administration utilities" +HOMEPAGE = "https://en.wikipedia.org/wiki/Util-linux" +DESCRIPTION = "Util-linux includes a suite of basic system administration utilities \ +commonly found on most Linux systems. Some of the more important utilities include \ +disk partitioning, kernel message management, filesystem creation, and system login." + +SECTION = "base" + +LICENSE = "GPLv2+ & LGPLv2.1+ & BSD-3-Clause & BSD-4-Clause" +LICENSE_${PN}-libblkid = "LGPLv2.1+" +LICENSE_${PN}-libfdisk = "LGPLv2.1+" +LICENSE_${PN}-libmount = "LGPLv2.1+" +LICENSE_${PN}-libsmartcols = "LGPLv2.1+" + +LIC_FILES_CHKSUM = "file://README.licensing;md5=0fd5c050c6187d2bf0a4492b7f4e33da \ + file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ + file://Documentation/licenses/COPYING.GPL-2.0-or-later;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ + file://Documentation/licenses/COPYING.LGPL-2.1-or-later;md5=4fbd65380cdd255951079008b364516c \ + file://Documentation/licenses/COPYING.BSD-3-Clause;md5=58dcd8452651fc8b07d1f65ce07ca8af \ + file://Documentation/licenses/COPYING.BSD-4-Clause-UC;md5=263860f8968d8bafa5392cab74285262 \ + file://libuuid/COPYING;md5=6d2cafc999feb2c2de84d4d24b23290c \ + file://libmount/COPYING;md5=7c7e39fb7d70ffe5d693a643e29987c2 \ + file://libblkid/COPYING;md5=693bcbbe16d3a4a4b37bc906bc01cc04 \ + file://libfdisk/COPYING;md5=693bcbbe16d3a4a4b37bc906bc01cc04 \ + file://libsmartcols/COPYING;md5=693bcbbe16d3a4a4b37bc906bc01cc04 \ +" + +FILESEXTRAPATHS_prepend := "${THISDIR}/util-linux:" +MAJOR_VERSION = "${@'.'.join(d.getVar('PV').split('.')[0:2])}" +SRC_URI = "file://util-linux/util-linux-${PV}.tar.xz \ + file://util-linux/2.36-login-lastlog-create.patch \ + file://util-linux/Add-check-to-resolve-uname26-version-test-failed.patch \ + file://util-linux/backport-CVE-2021-37600.patch \ + file://util-linux/backport-libblkid-improve-debug-for-proc-partitions.patch \ + file://util-linux/backport-libblkid-use-sys-to-read-all-block-devices.patch \ + file://util-linux/backport-libfdisk-make-fdisk_partname-more-robust.patch \ + file://util-linux/backport-libmount-fix-tab-parser-for-badly-terminated-lines.patch \ + file://util-linux/Do-not-excute-Utmp-testcases.patch \ + file://runuser.pamd \ + file://runuser-l.pamd \ + " + +SRC_URI[sha256sum] = "09fac242172cd8ec27f0739d8d192402c69417617091d8c6e974841568f37eed" diff --git a/meta-openeuler/recipes-core/util-linux/util-linux/run-ptest b/meta-openeuler/recipes-core/util-linux/util-linux/run-ptest new file mode 100644 index 00000000000..e135ee583bd --- /dev/null +++ b/meta-openeuler/recipes-core/util-linux/util-linux/run-ptest @@ -0,0 +1,43 @@ +#!/bin/sh + + +# When udevd (from eudev) is running most eject/mount tests will fail because +# of automount. We need to stop udevd before executing util-linux's tests. +# The systemd-udevd daemon doesn't change the outcome of util-linux's tests. +UDEV_PID="`pidof "@base_sbindir@/udevd"`" +if [ "x$UDEV_PID" != "x" ]; then + /etc/init.d/udev stop +fi + +current_path=$(readlink -f $0) +export bindir=$(dirname $current_path) +export PATH=$bindir/bin:$PATH + +cd tests || exit 1 + +comps=$(find ts/ -type f -perm -111 -regex ".*/[^\.~]*" | sort) + + +echo +echo "-------------------- util-linux regression tests --------------------" +echo +echo " For development purpose only. " +echo " Don't execute on production system! " +echo + +res=0 +count=0 +for ts in $comps; +do + $ts | sed -u '{ + s/^\(.*\):\(.*\) \.\.\. OK$/PASS: \1:\2/ + s/^\(.*\):\(.*\) \.\.\. FAILED \(.*\)$/FAIL: \1:\2 \3/ + s/^\(.*\):\(.*\) \.\.\. SKIPPED \(.*\)$/SKIP: \1:\2 \3/ + }' +done + + +if [ "x$UDEV_PID" != "x" ]; then + /etc/init.d/udev start +fi + diff --git a/meta-openeuler/recipes-core/util-linux/util-linux/runuser-l.pamd b/meta-openeuler/recipes-core/util-linux/util-linux/runuser-l.pamd new file mode 100644 index 00000000000..4b368ccf5de --- /dev/null +++ b/meta-openeuler/recipes-core/util-linux/util-linux/runuser-l.pamd @@ -0,0 +1,3 @@ +auth include runuser +session optional pam_keyinit.so force revoke +session include runuser diff --git a/meta-openeuler/recipes-core/util-linux/util-linux/runuser.pamd b/meta-openeuler/recipes-core/util-linux/util-linux/runuser.pamd new file mode 100644 index 00000000000..48d133b9e7e --- /dev/null +++ b/meta-openeuler/recipes-core/util-linux/util-linux/runuser.pamd @@ -0,0 +1,4 @@ +auth sufficient pam_rootok.so +session optional pam_keyinit.so revoke +session required pam_limits.so +session required pam_unix.so diff --git a/meta-openeuler/recipes-core/util-linux/util-linux_2.36.1.bb b/meta-openeuler/recipes-core/util-linux/util-linux_2.36.1.bb new file mode 100644 index 00000000000..b4e986138ed --- /dev/null +++ b/meta-openeuler/recipes-core/util-linux/util-linux_2.36.1.bb @@ -0,0 +1,329 @@ +require util-linux.inc + +#gtk-doc is not enabled as it requires xmlto which requires util-linux +inherit autotools gettext pkgconfig systemd +DEPENDS = "libcap-ng ncurses zlib" + +PACKAGES =+ "${PN}-swaponoff" +PACKAGES += "${@bb.utils.contains('PACKAGECONFIG', 'pylibmount', '${PN}-pylibmount', '', d)}" + +python util_linux_binpackages () { + def pkg_hook(f, pkg, file_regex, output_pattern, modulename): + pn = d.getVar('PN') + d.appendVar('RRECOMMENDS_%s' % pn, ' %s' % pkg) + + if d.getVar('ALTERNATIVE_' + pkg): + return + if d.getVarFlag('ALTERNATIVE_LINK_NAME', modulename): + d.setVar('ALTERNATIVE_' + pkg, modulename) + + bindirs = sorted(list(set(d.expand("${base_sbindir} ${base_bindir} ${sbindir} ${bindir}").split()))) + for dir in bindirs: + do_split_packages(d, root=dir, + file_regex=r'(.*)', output_pattern='${PN}-%s', + description='${PN} %s', + hook=pkg_hook, extra_depends='') + + # There are some symlinks for some binaries which we have ignored + # above. Add them to the package owning the binary they are + # pointing to + extras = {} + dvar = d.getVar('PKGD') + for root in bindirs: + for walkroot, dirs, files in os.walk(dvar + root): + for f in files: + file = os.path.join(walkroot, f) + if not os.path.islink(file): + continue + + pkg = os.path.basename(os.readlink(file)) + extras[pkg] = extras.get(pkg, '') + ' ' + file.replace(dvar, '', 1) + + pn = d.getVar('PN') + for pkg, links in extras.items(): + of = d.getVar('FILES_' + pn + '-' + pkg) + links = of + links + d.setVar('FILES_' + pn + '-' + pkg, links) +} + +# we must execute before update-alternatives PACKAGE_PREPROCESS_FUNCS +PACKAGE_PREPROCESS_FUNCS =+ "util_linux_binpackages " + +# skip libuuid as it will be packaged by the util-linux-libuuid recipe +python util_linux_libpackages() { + do_split_packages(d, root=d.getVar('UTIL_LINUX_LIBDIR'), file_regex=r'^lib(?!uuid)(.*)\.so\..*$', + output_pattern='${PN}-lib%s', + description='${PN} lib%s', + extra_depends='', prepend=True, allow_links=True) +} + +PACKAGESPLITFUNCS =+ "util_linux_libpackages" + +PACKAGES_DYNAMIC = "^${PN}-.*" + +CACHED_CONFIGUREVARS += "scanf_cv_alloc_modifier=ms" +UTIL_LINUX_LIBDIR = "${libdir}" +UTIL_LINUX_LIBDIR_class-target = "${base_libdir}" +EXTRA_OECONF = "\ + --enable-libuuid --enable-libblkid \ + \ + --enable-fsck --enable-kill --enable-last --enable-mesg \ + --enable-mount --enable-partx --enable-raw --enable-rfkill \ + --enable-unshare --enable-write \ + \ + --disable-bfs --disable-chfn-chsh --disable-login \ + --disable-makeinstall-chown --disable-minix --disable-newgrp \ + --disable-use-tty-group --disable-vipw \ + \ + --without-udev \ + \ + usrsbin_execdir='${sbindir}' \ + --libdir='${UTIL_LINUX_LIBDIR}' \ +" + +EXTRA_OECONF_append_class-target = " --enable-setpriv" +EXTRA_OECONF_append_class-native = " --without-cap-ng --disable-setpriv" +EXTRA_OECONF_append_class-nativesdk = " --without-cap-ng --disable-setpriv" +EXTRA_OECONF_append = " --disable-hwclock-gplv3" + +# enable pcre2 for native/nativesdk to match host distros +# this helps to keep same expectations when using the SDK or +# build host versions during development +# +PACKAGECONFIG ?= "pcre2" +PACKAGECONFIG_class-target ?= "${@bb.utils.filter('DISTRO_FEATURES', 'pam', d)}" +# inherit manpages requires this to be present, however util-linux does not have +# configuration options, and installs manpages always +PACKAGECONFIG[manpages] = "" +PACKAGECONFIG[pam] = "--enable-su --enable-runuser,--disable-su --disable-runuser, libpam," +# Respect the systemd feature for uuidd +PACKAGECONFIG[systemd] = "--with-systemd --with-systemdsystemunitdir=${systemd_system_unitdir}, --without-systemd --without-systemdsystemunitdir,systemd" +# Build python bindings for libmount +PACKAGECONFIG[pylibmount] = "--with-python=3 --enable-pylibmount,--without-python --disable-pylibmount,python3" +# Readline support +PACKAGECONFIG[readline] = "--with-readline,--without-readline,readline" +# PCRE support in hardlink +PACKAGECONFIG[pcre2] = ",,libpcre2" +PACKAGECONFIG[cryptsetup] = "--with-cryptsetup,--without-cryptsetup,cryptsetup" + +EXTRA_OEMAKE = "ARCH=${TARGET_ARCH} CPU= CPUOPT= 'OPT=${CFLAGS}'" + +ALLOW_EMPTY_${PN} = "1" +FILES_${PN} = "" +FILES_${PN}-doc += "${datadir}/getopt/getopt-*.*" +FILES_${PN}-dev += "${PYTHON_SITEPACKAGES_DIR}/libmount/pylibmount.la" +FILES_${PN}-mount = "${sysconfdir}/default/mountall" +FILES_${PN}-runuser = "${sysconfdir}/pam.d/runuser*" +FILES_${PN}-su = "${sysconfdir}/pam.d/su-l" +CONFFILES_${PN}-su = "${sysconfdir}/pam.d/su-l" +FILES_${PN}-pylibmount = "${PYTHON_SITEPACKAGES_DIR}/libmount/pylibmount.so \ + ${PYTHON_SITEPACKAGES_DIR}/libmount/__init__.* \ + ${PYTHON_SITEPACKAGES_DIR}/libmount/__pycache__/*" +FILES_${PN}-bash-completion += "${datadir}/bash-completion/*" +PACKAGES += "${PN}-bash-completion" +# Util-linux' blkid replaces the e2fsprogs one +RCONFLICTS_${PN}-blkid = "${MLPREFIX}e2fsprogs-blkid" +RREPLACES_${PN}-blkid = "${MLPREFIX}e2fsprogs-blkid" + +RRECOMMENDS_${PN}_class-native = "" +RRECOMMENDS_${PN}_class-nativesdk = "" +RDEPENDS_${PN}_class-native = "" +RDEPENDS_${PN}_class-nativesdk = "" + +RPROVIDES_${PN}-dev = "${PN}-libblkid-dev ${PN}-libmount-dev" + +RDEPENDS_${PN}-bash-completion += "${PN}-lsblk" +RDEPENDS_${PN}-ptest += "bash bc btrfs-tools coreutils e2fsprogs grep iproute2 kmod mdadm procps sed socat which xz" +RRECOMMENDS_${PN}-ptest += "kernel-module-scsi-debug" +RDEPENDS_${PN}-swaponoff = "${PN}-swapon ${PN}-swapoff" +ALLOW_EMPTY_${PN}-swaponoff = "1" + +SYSTEMD_SERVICE_${PN}-uuidd = "uuidd.socket uuidd.service" +SYSTEMD_AUTO_ENABLE_${PN}-uuidd = "disable" +SYSTEMD_SERVICE_${PN}-fstrim = "fstrim.timer fstrim.service" +SYSTEMD_AUTO_ENABLE_${PN}-fstrim = "disable" + +do_install () { + # with ccache the timestamps on compiled files may + # end up earlier than on their inputs, this allows + # for the resultant compilation in the install step. + oe_runmake 'CC=${CC}' 'LD=${LD}' \ + 'LDFLAGS=${LDFLAGS}' 'DESTDIR=${D}' install + + mkdir -p ${D}${base_bindir} + + sbinprogs="agetty ctrlaltdel cfdisk vipw vigr" + sbinprogs_a="pivot_root hwclock mkswap losetup swapon swapoff fdisk fsck blkid blockdev fstrim sulogin switch_root nologin" + binprogs_a="dmesg getopt kill more umount mount login su mountpoint" + + if [ "${base_sbindir}" != "${sbindir}" ]; then + mkdir -p ${D}${base_sbindir} + for p in $sbinprogs $sbinprogs_a; do + if [ -f "${D}${sbindir}/$p" ]; then + mv "${D}${sbindir}/$p" "${D}${base_sbindir}/$p" + fi + done + fi + + if [ "${base_bindir}" != "${bindir}" ]; then + mkdir -p ${D}${base_bindir} + for p in $binprogs_a; do + if [ -f "${D}${bindir}/$p" ]; then + mv "${D}${bindir}/$p" "${D}${base_bindir}/$p" + fi + done + fi + + install -d ${D}${sysconfdir}/default/ + echo 'MOUNTALL="-t nonfs,nosmbfs,noncpfs"' > ${D}${sysconfdir}/default/mountall + + rm -f ${D}${bindir}/chkdupexe +} + +do_install_append_class-target () { + if [ "${@bb.utils.filter('PACKAGECONFIG', 'pam', d)}" ]; then + install -d ${D}${sysconfdir}/pam.d + install -m 0644 ${WORKDIR}/runuser.pamd ${D}${sysconfdir}/pam.d/runuser + install -m 0644 ${WORKDIR}/runuser-l.pamd ${D}${sysconfdir}/pam.d/runuser-l + # Required for "su -" aka "su --login" because + # otherwise it uses "other", which has "auth pam_deny.so" + # and thus prevents the operation. + ln -s su ${D}${sysconfdir}/pam.d/su-l + fi +} +# nologin causes a conflict with shadow-native +# kill causes a conflict with coreutils-native (if ${bindir}==${base_bindir}) +do_install_append_class-native () { + rm -f ${D}${base_sbindir}/nologin + rm -f ${D}${base_bindir}/kill +} + +# dm-verity support introduces a circular build dependency, so util-linux-libuuid is split out for target builds +# Need to build libuuid for uuidgen, but then delete it and let the other recipe ship it +do_install_append () { + rm -rf ${D}${includedir}/uuid ${D}${libdir}/pkgconfig/uuid.pc ${D}${libdir}/libuuid* ${D}${base_libdir}/libuuid* +} + +ALTERNATIVE_PRIORITY = "80" + +ALTERNATIVE_LINK_NAME[blkid] = "${base_sbindir}/blkid" +ALTERNATIVE_LINK_NAME[blockdev] = "${base_sbindir}/blockdev" +ALTERNATIVE_LINK_NAME[cal] = "${bindir}/cal" +ALTERNATIVE_LINK_NAME[chrt] = "${bindir}/chrt" +ALTERNATIVE_LINK_NAME[dmesg] = "${base_bindir}/dmesg" +ALTERNATIVE_LINK_NAME[eject] = "${bindir}/eject" +ALTERNATIVE_LINK_NAME[fallocate] = "${bindir}/fallocate" +ALTERNATIVE_LINK_NAME[fdisk] = "${base_sbindir}/fdisk" +ALTERNATIVE_LINK_NAME[flock] = "${bindir}/flock" +ALTERNATIVE_LINK_NAME[fsck] = "${base_sbindir}/fsck" +ALTERNATIVE_LINK_NAME[fsfreeze] = "${sbindir}/fsfreeze" +ALTERNATIVE_LINK_NAME[fstrim] = "${base_sbindir}/fstrim" +ALTERNATIVE_LINK_NAME[getopt] = "${base_bindir}/getopt" +ALTERNATIVE_${PN}-agetty = "getty" +ALTERNATIVE_LINK_NAME[getty] = "${base_sbindir}/getty" +ALTERNATIVE_TARGET[getty] = "${base_sbindir}/agetty" +ALTERNATIVE_LINK_NAME[hexdump] = "${bindir}/hexdump" +ALTERNATIVE_LINK_NAME[hwclock] = "${base_sbindir}/hwclock" +ALTERNATIVE_LINK_NAME[ionice] = "${bindir}/ionice" +ALTERNATIVE_LINK_NAME[kill] = "${base_bindir}/kill" +ALTERNATIVE_${PN}-last = "last lastb" +ALTERNATIVE_LINK_NAME[last] = "${bindir}/last" +ALTERNATIVE_LINK_NAME[lastb] = "${bindir}/lastb" +ALTERNATIVE_LINK_NAME[logger] = "${bindir}/logger" +ALTERNATIVE_LINK_NAME[losetup] = "${base_sbindir}/losetup" +ALTERNATIVE_LINK_NAME[mesg] = "${bindir}/mesg" +ALTERNATIVE_LINK_NAME[mkswap] = "${base_sbindir}/mkswap" +ALTERNATIVE_LINK_NAME[mcookie] = "${bindir}/mcookie" +ALTERNATIVE_LINK_NAME[more] = "${base_bindir}/more" +ALTERNATIVE_LINK_NAME[mount] = "${base_bindir}/mount" +ALTERNATIVE_LINK_NAME[mountpoint] = "${base_bindir}/mountpoint" +ALTERNATIVE_LINK_NAME[nologin] = "${base_sbindir}/nologin" +ALTERNATIVE_LINK_NAME[nsenter] = "${bindir}/nsenter" +ALTERNATIVE_LINK_NAME[pivot_root] = "${base_sbindir}/pivot_root" +ALTERNATIVE_LINK_NAME[prlimit] = "${bindir}/prlimit" +ALTERNATIVE_LINK_NAME[readprofile] = "${sbindir}/readprofile" +ALTERNATIVE_LINK_NAME[renice] = "${bindir}/renice" +ALTERNATIVE_LINK_NAME[rev] = "${bindir}/rev" +ALTERNATIVE_LINK_NAME[rfkill] = "${sbindir}/rfkill" +ALTERNATIVE_LINK_NAME[rtcwake] = "${sbindir}/rtcwake" +ALTERNATIVE_LINK_NAME[setpriv] = "${bindir}/setpriv" +ALTERNATIVE_LINK_NAME[setsid] = "${bindir}/setsid" +ALTERNATIVE_LINK_NAME[su] = "${base_bindir}/su" +ALTERNATIVE_LINK_NAME[sulogin] = "${base_sbindir}/sulogin" +ALTERNATIVE_LINK_NAME[swapoff] = "${base_sbindir}/swapoff" +ALTERNATIVE_LINK_NAME[swapon] = "${base_sbindir}/swapon" +ALTERNATIVE_LINK_NAME[switch_root] = "${base_sbindir}/switch_root" +ALTERNATIVE_LINK_NAME[taskset] = "${bindir}/taskset" +ALTERNATIVE_LINK_NAME[umount] = "${base_bindir}/umount" +ALTERNATIVE_LINK_NAME[unshare] = "${bindir}/unshare" +ALTERNATIVE_LINK_NAME[utmpdump] = "${bindir}/utmpdump" +ALTERNATIVE_LINK_NAME[uuidgen] = "${bindir}/uuidgen" +ALTERNATIVE_LINK_NAME[wall] = "${bindir}/wall" + +ALTERNATIVE_${PN}-doc = "\ +blkid.8 eject.1 findfs.8 fsck.8 kill.1 last.1 lastb.1 libblkid.3 logger.1 mesg.1 \ +mountpoint.1 nologin.8 rfkill.8 sulogin.8 utmpdump.1 uuid.3 wall.1\ +" +ALTERNATIVE_${PN}-doc += "${@bb.utils.contains('PACKAGECONFIG', 'pam', 'su.1', '', d)}" + +ALTERNATIVE_LINK_NAME[blkid.8] = "${mandir}/man8/blkid.8" +ALTERNATIVE_LINK_NAME[eject.1] = "${mandir}/man1/eject.1" +ALTERNATIVE_LINK_NAME[findfs.8] = "${mandir}/man8/findfs.8" +ALTERNATIVE_LINK_NAME[fsck.8] = "${mandir}/man8/fsck.8" +ALTERNATIVE_LINK_NAME[kill.1] = "${mandir}/man1/kill.1" +ALTERNATIVE_LINK_NAME[last.1] = "${mandir}/man1/last.1" +ALTERNATIVE_LINK_NAME[lastb.1] = "${mandir}/man1/lastb.1" +ALTERNATIVE_LINK_NAME[libblkid.3] = "${mandir}/man3/libblkid.3" +ALTERNATIVE_LINK_NAME[logger.1] = "${mandir}/man1/logger.1" +ALTERNATIVE_LINK_NAME[mesg.1] = "${mandir}/man1/mesg.1" +ALTERNATIVE_LINK_NAME[mountpoint.1] = "${mandir}/man1/mountpoint.1" +ALTERNATIVE_LINK_NAME[nologin.8] = "${mandir}/man8/nologin.8" +ALTERNATIVE_LINK_NAME[rfkill.8] = "${mandir}/man8/rfkill.8" +ALTERNATIVE_LINK_NAME[setpriv.1] = "${mandir}/man1/setpriv.1" +ALTERNATIVE_LINK_NAME[su.1] = "${mandir}/man1/su.1" +ALTERNATIVE_LINK_NAME[sulogin.8] = "${mandir}/man8/sulogin.8" +ALTERNATIVE_LINK_NAME[utmpdump.1] = "${mandir}/man1/utmpdump.1" +ALTERNATIVE_LINK_NAME[uuid.3] = "${mandir}/man3/uuid.3" +ALTERNATIVE_LINK_NAME[wall.1] = "${mandir}/man1/wall.1" + + +BBCLASSEXTEND = "native nativesdk" + +PTEST_BINDIR = "1" +do_compile_ptest() { + oe_runmake buildtest-TESTS +} + +do_install_ptest() { + mkdir -p ${D}${PTEST_PATH}/tests/ts + find . -name 'test*' -maxdepth 1 -type f -perm -111 -exec cp {} ${D}${PTEST_PATH} \; + find ./.libs -name 'sample*' -maxdepth 1 -type f -perm -111 -exec cp {} ${D}${PTEST_PATH} \; + find ./.libs -name 'test*' -maxdepth 1 -type f -perm -111 -exec cp {} ${D}${PTEST_PATH} \; + + cp ${S}/tests/*.sh ${D}${PTEST_PATH}/tests/ + cp -pR ${S}/tests/expected ${D}${PTEST_PATH}/tests/expected + cp -pR ${S}/tests/ts ${D}${PTEST_PATH}/tests/ + cp ${WORKDIR}/build/config.h ${D}${PTEST_PATH} + + # The original paths of executables to be tested point to a local folder containing + # the executables. We want to test the installed executables, not the local copies. + # So strip the paths, the executables will be located via "which" + sed -i \ + -e '/^TS_CMD/ s|$top_builddir/||g' \ + -e '/^TS_HELPER/ s|$top_builddir|${PTEST_PATH}|g' \ + ${D}${PTEST_PATH}/tests/commands.sh + + # Change 'if [ ! -x "$1" ]' to 'if [ ! -x "`which $1 2>/dev/null`"]' + sed -i -e \ + '/^\tif[[:space:]]\[[[:space:]]![[:space:]]-x[[:space:]]"$1"/s|$1|`which $1 2>/dev/null`|g' \ + ${D}${PTEST_PATH}/tests/functions.sh + + # Running "kill" without the the complete path would use the shell's built-in kill + sed -i -e \ + '/^TS_CMD_KILL/ s|kill|${PTEST_PATH}/bin/kill|g' \ + ${D}${PTEST_PATH}/tests/commands.sh + + + sed -i 's|@base_sbindir@|${base_sbindir}|g' ${D}${PTEST_PATH}/run-ptest + +} -- Gitee From 8faf449fb8c913ec585e6ea34359594896256fa9 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 30 Dec 2021 10:54:16 +0800 Subject: [PATCH 107/304] add recipe for binutils Signed-off-by: lixiaoyong --- .../binutils/binutils-2.37.inc | 33 ++++ .../recipes-devtools/binutils/binutils.inc | 186 ++++++++++++++++++ ...005-Point-scripts-location-to-libdir.patch | 39 ++++ .../binutils/binutils_2.37.bb | 65 ++++++ 4 files changed, 323 insertions(+) create mode 100644 meta-openeuler/recipes-devtools/binutils/binutils-2.37.inc create mode 100644 meta-openeuler/recipes-devtools/binutils/binutils.inc create mode 100644 meta-openeuler/recipes-devtools/binutils/binutils/0005-Point-scripts-location-to-libdir.patch create mode 100644 meta-openeuler/recipes-devtools/binutils/binutils_2.37.bb diff --git a/meta-openeuler/recipes-devtools/binutils/binutils-2.37.inc b/meta-openeuler/recipes-devtools/binutils/binutils-2.37.inc new file mode 100644 index 00000000000..85b7ef21575 --- /dev/null +++ b/meta-openeuler/recipes-devtools/binutils/binutils-2.37.inc @@ -0,0 +1,33 @@ +LIC_FILES_CHKSUM="\ + file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552\ + file://COPYING.LIB;md5=9f604d8a4f8e74f4f5140845a21b6674\ + file://COPYING3;md5=d32239bcb673463ab874e80d47fae504\ + file://COPYING3.LIB;md5=6a6a8e020838b23406c81b19c1d46df6\ + file://gas/COPYING;md5=d32239bcb673463ab874e80d47fae504\ + file://include/COPYING;md5=59530bdf33659b29e73d4adb9f9f6552\ + file://include/COPYING3;md5=d32239bcb673463ab874e80d47fae504\ + file://libiberty/COPYING.LIB;md5=a916467b91076e631dd8edb7424769c7\ + file://bfd/COPYING;md5=d32239bcb673463ab874e80d47fae504\ + " + +def binutils_branch_version(d): + pvsplit = d.getVar('PV').split('.') + return pvsplit[0] + "_" + pvsplit[1] + +# When upgrading to 2.37, please make sure there is no trailing .0, so +# that upstream version check can work correctly. +PV = "2.37" +CVE_VERSION = "2.37" + +SRC_URI = "file://binutils/${BP}.tar.xz \ + file://binutils/backport-CVE-2021-45078.patch \ + file://binutils/binutils-2.20.51.0.2-libtool-lib64.patch \ + file://binutils/binutils-2.22.52.0.4-no-config-h-check.patch \ + file://binutils/CVE-2019-1010204.patch \ + file://binutils/binutils-2.27-aarch64-ifunc.patch \ + file://binutils/export-demangle.h-in-devel-package.patch \ + file://binutils/Fix-a-potential-use-of-an-uninitialised-value-in-the.patch \ + file://0005-Point-scripts-location-to-libdir.patch \ +" + +S = "${WORKDIR}/${BP}" diff --git a/meta-openeuler/recipes-devtools/binutils/binutils.inc b/meta-openeuler/recipes-devtools/binutils/binutils.inc new file mode 100644 index 00000000000..5bd1650c5b2 --- /dev/null +++ b/meta-openeuler/recipes-devtools/binutils/binutils.inc @@ -0,0 +1,186 @@ +SUMMARY = "GNU binary utilities" +DESCRIPTION = "The GNU Binutils are a collection of binary tools. \ +The main ones are ld (GNU Linker), and as (GNU Assembler). This \ +package also includes addition tools such as addr2line (Converts \ +addresses into filenames and line numbers), ar (utility for creating, \ +modifying and extracting archives), nm (list symbols in object \ +files), objcopy (copy and translate object files), objdump (Display \ +object information), and other tools and related libraries." +HOMEPAGE = "http://www.gnu.org/software/binutils/" +BUGTRACKER = "http://sourceware.org/bugzilla/" +SECTION = "devel" +LICENSE = "GPLv3" + +DEPENDS = "gnu-config-native autoconf-native" + +inherit autotools gettext multilib_header texinfo + +FILES_${PN} = " \ + ${bindir}/${TARGET_PREFIX}* \ + ${libdir}/lib*.so.* \ + ${libdir}/bfd-plugins/lib*.so \ + ${libdir}/lib*-${PV}*.so \ + ${prefix}/${TARGET_SYS}/bin/* \ + ${bindir}/embedspu" + +RPROVIDES_${PN} += "${PN}-symlinks" + +FILES_${PN}-dev = " \ + ${includedir} \ + ${libdir}/*.la \ + ${libdir}/libbfd.so \ + ${libdir}/libctf.so \ + ${libdir}/libctf-nobfd.so \ + ${libdir}/libopcodes.so" + +# Rather than duplicating multiple entries for these, make one +# list and reuse it. + +LDGOLD_ALTS ?= "ld.gold dwp" +LDGOLD_ALTS_riscv64 = "" +LDGOLD_ALTS_riscv32 = "" +LDGOLD_ALTS_libc-glibc_mipsarch = "" + +USE_ALTERNATIVES_FOR = " \ + addr2line \ + ar \ + as \ + c++filt \ + elfedit \ + gprof \ + ld \ + ld.bfd \ + ${LDGOLD_ALTS} \ + nm \ + objcopy \ + objdump \ + ranlib \ + readelf \ + size \ + strings \ + strip \ +" + +python do_package_prepend() { + make_alts = d.getVar("USE_ALTERNATIVES_FOR") or "" + prefix = d.getVar("TARGET_PREFIX") + bindir = d.getVar("bindir") + for alt in make_alts.split(): + d.setVarFlag('ALTERNATIVE_TARGET', alt, bindir + "/" + prefix + alt) + d.setVarFlag('ALTERNATIVE_LINK_NAME', alt, bindir + "/" + alt) +} + +B = "${S}/build.${HOST_SYS}.${TARGET_SYS}" + +EXTRA_OECONF = "--program-prefix=${TARGET_PREFIX} \ + --disable-werror \ + --enable-deterministic-archives \ + --enable-plugins \ + --disable-gdb \ + --disable-gdbserver \ + --disable-libdecnumber \ + --disable-readline \ + --disable-sim \ + ${LDGOLD} \ + ${EXTRA_TARGETS} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'multiarch', '--enable-64-bit-bfd', '', d)}" + +EXTRA_TARGETS = "" +EXTRA_TARGETS_x86-64 = " --enable-targets=x86_64-pe,x86_64-pep " +EXTRA_TARGETS_class-native = "" + +LDGOLD_class-native = "" +LDGOLD_class-crosssdk = "" +LDGOLD_libc-glibc_mipsarch = "" +LDGOLD ?= "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-gold', '--enable-gold=default --enable-threads', '--enable-gold --enable-ld=default --enable-threads', d)}" + + +# This is necessary due to a bug in the binutils Makefiles +# EXTRA_OEMAKE = "configure-build-libiberty all" + +export AR = "${HOST_PREFIX}ar" +export AS = "${HOST_PREFIX}as" +export LD = "${HOST_PREFIX}ld" +export NM = "${HOST_PREFIX}nm" +export RANLIB = "${HOST_PREFIX}ranlib" +export OBJCOPY = "${HOST_PREFIX}objcopy" +export OBJDUMP = "${HOST_PREFIX}objdump" + +export AR_FOR_TARGET = "${TARGET_PREFIX}ar" +export AS_FOR_TARGET = "${TARGET_PREFIX}as" +export LD_FOR_TARGET = "${TARGET_PREFIX}ld" +export NM_FOR_TARGET = "${TARGET_PREFIX}nm" +export RANLIB_FOR_TARGET = "${TARGET_PREFIX}ranlib" + +export CC_FOR_HOST = "${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}" +export CXX_FOR_HOST = "${CCACHE}${HOST_PREFIX}gcc ${HOST_CC_ARCH}" + +# autotools.bbclass sets the _FOR_BUILD variables, but for some reason we need +# to unset LD_LIBRARY_PATH. +export CC_FOR_BUILD = "LD_LIBRARY_PATH= ${BUILD_CC}" + +MULTIARCH := "${@bb.utils.contains("DISTRO_FEATURES", "multiarch", "yes", "no", d)}" +do_configure[vardeps] += "MULTIARCH" +do_configure () { + (cd ${S} && gnu-configize) + + oe_runconf +# +# must prime config.cache to ensure the build of libiberty +# + mkdir -p ${B}/build-${BUILD_SYS} + for i in ${CONFIG_SITE}; do + cat $i >> ${B}/build-${BUILD_SYS}/config.cache || true + done +} + +do_install () { + autotools_do_install + + # We don't really need these, so we'll remove them... + rm -rf ${D}${libdir}/ldscripts + + bindir_rel=${@os.path.relpath('${bindir}', '${prefix}/${TARGET_SYS}/bin')} + + # Fix the /usr/${TARGET_SYS}/bin/* links + for l in ${D}${prefix}/${TARGET_SYS}/bin/*; do + rm -f $l + ln -sf $bindir_rel/${TARGET_PREFIX}`basename $l` $l + done + + # Install the libiberty header + install -d ${D}${includedir} + install -m 644 ${S}/include/ansidecl.h ${D}${includedir} + install -m 644 ${S}/include/libiberty.h ${D}${includedir} + + # insall pic version of libiberty if available + if [ -e ${B}/libiberty/pic/libiberty.a ]; then + install -Dm 0644 ${B}/libiberty/pic/libiberty.a ${D}${libdir}/libiberty.a + fi + + cd ${D}${bindir} + + # Symlinks for ease of running these on the native target + for p in ${TARGET_PREFIX}* ; do + ln -sf $p `echo $p | sed -e s,${TARGET_PREFIX},,` + done + + for alt in ${USE_ALTERNATIVES_FOR}; do + rm -f ${D}${bindir}/$alt + done + + oe_multilib_header bfd.h + # bfd_stdint.h encodes the compiler name in the header + # sed -i ${D}${includedir}/bfd_stdint.h -e "s,${TARGET_PREFIX},," +} + +#inherit update-alternatives + +ALTERNATIVE_PRIORITY = "100" + +ALTERNATIVE_${PN}_class-target = "${USE_ALTERNATIVES_FOR}" + +python () { + if bb.utils.contains('DISTRO_FEATURES', 'ld-is-gold', True, False, d) and bb.utils.contains_any('TARGET_ARCH', 'riscv32 riscv64', True, False, d): + bb.fatal("Gold linker does not _yet_ support RISC-V architecture please remove ld-is-gold from DISTRO_FEATURES") +} diff --git a/meta-openeuler/recipes-devtools/binutils/binutils/0005-Point-scripts-location-to-libdir.patch b/meta-openeuler/recipes-devtools/binutils/binutils/0005-Point-scripts-location-to-libdir.patch new file mode 100644 index 00000000000..dde0cb5d6d0 --- /dev/null +++ b/meta-openeuler/recipes-devtools/binutils/binutils/0005-Point-scripts-location-to-libdir.patch @@ -0,0 +1,39 @@ +From 6a67d277941228d997b527990960413f8444fb81 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Mon, 2 Mar 2015 01:09:58 +0000 +Subject: [PATCH] Point scripts location to libdir + +Upstream-Status: Inappropriate [debian patch] + +Signed-off-by: Khem Raj +--- + ld/Makefile.am | 2 +- + ld/Makefile.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/ld/Makefile.am b/ld/Makefile.am +index 3b01357b651..b7a1f7491b0 100644 +--- a/ld/Makefile.am ++++ b/ld/Makefile.am +@@ -51,7 +51,7 @@ AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CLFAGS) + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff --git a/ld/Makefile.in b/ld/Makefile.in +index a6382bf2a45..5ee3a4971be 100644 +--- a/ld/Makefile.in ++++ b/ld/Makefile.in +@@ -562,7 +562,7 @@ AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CLFAGS) + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + BASEDIR = $(srcdir)/.. + BFDDIR = $(BASEDIR)/bfd + INCDIR = $(BASEDIR)/include diff --git a/meta-openeuler/recipes-devtools/binutils/binutils_2.37.bb b/meta-openeuler/recipes-devtools/binutils/binutils_2.37.bb new file mode 100644 index 00000000000..e01dd425441 --- /dev/null +++ b/meta-openeuler/recipes-devtools/binutils/binutils_2.37.bb @@ -0,0 +1,65 @@ +require binutils.inc +require binutils-${PV}.inc + +DEPENDS += "zlib" +EXTRA_OECONF += "--with-sysroot=/ \ + --enable-install-libbfd \ + --enable-install-libiberty \ + --enable-shared \ + --with-system-zlib \ + " + +EXTRA_OEMAKE_append_libc-musl = "\ + gt_cv_func_gnugettext1_libc=yes \ + gt_cv_func_gnugettext2_libc=yes \ + " +EXTRA_OECONF_class-native = "--enable-targets=all \ + --enable-64-bit-bfd \ + --enable-install-libiberty \ + --enable-install-libbfd \ + --disable-gdb \ + --disable-gdbserver \ + --disable-libdecnumber \ + --disable-readline \ + --disable-sim \ + --disable-werror" + +PACKAGECONFIG ??= "" +PACKAGECONFIG[debuginfod] = "--with-debuginfod, --without-debuginfod, elfutils" +# gcc9.0 end up mis-compiling libbfd.so with O2 which then crashes on target +# So remove -O2 and use -Os as workaround +SELECTED_OPTIMIZATION_remove_mipsarch = "-O2" +SELECTED_OPTIMIZATION_append_mipsarch = " -Os" + +do_install_class-native () { + autotools_do_install + + # Install the libiberty header + install -d ${D}${includedir} + install -m 644 ${S}/include/ansidecl.h ${D}${includedir} + install -m 644 ${S}/include/libiberty.h ${D}${includedir} + + # We only want libiberty, libbfd and libopcodes + rm -rf ${D}${bindir} + rm -rf ${D}${prefix}/${TARGET_SYS} + rm -rf ${D}${prefix}/lib/ldscripts + rm -rf ${D}${prefix}/share/info + rm -rf ${D}${prefix}/share/locale + rm -rf ${D}${prefix}/share/man + rmdir ${D}${prefix}/share || : + rmdir ${D}/${libdir}/gcc-lib || : + rmdir ${D}/${libdir}64/gcc-lib || : + rmdir ${D}/${libdir} || : + rmdir ${D}/${libdir}64 || : +} + +# libctf races with libbfd +PARALLEL_MAKEINST_class-target = "" + +# Split out libbfd-*.so and libopcodes-*.so so including perf doesn't include +# extra stuff +PACKAGE_BEFORE_PN += "libbfd libopcodes" +FILES_libbfd = "${libdir}/libbfd-*.so.* ${libdir}/libbfd-*.so" +FILES_libopcodes = "${libdir}/libopcodes-*.so.* ${libdir}/libopcodes-*.so" + +BBCLASSEXTEND = "native nativesdk" -- Gitee From 57f601c6907dfb1f24f2aa8d5142e3a44b333444 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 30 Dec 2021 11:02:58 +0800 Subject: [PATCH 108/304] add recipe for elfutils Signed-off-by: lixiaoyong --- .../elfutils/elfutils_0.185.bb | 147 ++++++++++++++++++ .../recipes-devtools/elfutils/files/run-ptest | 6 + 2 files changed, 153 insertions(+) create mode 100644 meta-openeuler/recipes-devtools/elfutils/elfutils_0.185.bb create mode 100644 meta-openeuler/recipes-devtools/elfutils/files/run-ptest diff --git a/meta-openeuler/recipes-devtools/elfutils/elfutils_0.185.bb b/meta-openeuler/recipes-devtools/elfutils/elfutils_0.185.bb new file mode 100644 index 00000000000..d320650a2ab --- /dev/null +++ b/meta-openeuler/recipes-devtools/elfutils/elfutils_0.185.bb @@ -0,0 +1,147 @@ +SUMMARY = "Utilities and libraries for handling compiled object files" +HOMEPAGE = "https://sourceware.org/elfutils" +DESCRIPTION = "elfutils is a collection of utilities and libraries to read, create and modify ELF binary files, find and handle DWARF debug data, symbols, thread state and stacktraces for processes and core files on GNU/Linux." +SECTION = "base" +LICENSE = "GPLv2 & GPLv2+ & LGPLv3+ & GPLv3+" +LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504 \ + file://debuginfod/debuginfod-client.c;endline=27;md5=f8e9d171c401c493ec45a0b2992ea2ed \ + " +DEPENDS = "zlib virtual/libintl" +DEPENDS_append_libc-musl = " argp-standalone fts musl-obstack " +# The Debian patches below are from: +# http://ftp.de.debian.org/debian/pool/main/e/elfutils/elfutils_0.176-1.debian.tar.xz +SRC_URI = "file://elfutils/${BP}.tar.bz2 \ + file://run-ptest \ +" + +SRC_URI[sha256sum] = "dc8d3e74ab209465e7f568e1b3bb9a5a142f8656e2b57d10049a73da2ae6b5a6" + +inherit autotools gettext ptest pkgconfig + +EXTRA_OECONF = "--program-prefix=eu-" + +DEPENDS_BZIP2 = "bzip2-replacement-native" +DEPENDS_BZIP2_class-target = "bzip2" + +PACKAGECONFIG ??= "" +PACKAGECONFIG[bzip2] = "--with-bzlib,--without-bzlib,${DEPENDS_BZIP2}" +PACKAGECONFIG[xz] = "--with-lzma,--without-lzma,xz" +PACKAGECONFIG[libdebuginfod] = "--enable-libdebuginfod,--disable-libdebuginfod,curl" +PACKAGECONFIG[debuginfod] = "--enable-debuginfod,--disable-debuginfod,libarchive sqlite3 libmicrohttpd" + +RDEPENDS_${PN}-ptest += "libasm libelf bash make coreutils ${PN}-binutils" + +EXTRA_OECONF_append_class-target = " --disable-tests-rpath" + +RDEPENDS_${PN}-ptest_append_libc-glibc = " glibc-utils" + +do_compile_ptest() { + cd ${B}/tests + oe_runmake buildtest-TESTS oecheck +} + +do_install_ptest() { + if [ ${PTEST_ENABLED} = "1" ]; then + # copy the files which needed by the cases + TEST_FILES="strip strip.o addr2line elfcmp objdump readelf size.o nm.o nm elflint elfcompress elfclassify stack unstrip" + install -d -m 755 ${D}${PTEST_PATH}/src + install -d -m 755 ${D}${PTEST_PATH}/libelf + install -d -m 755 ${D}${PTEST_PATH}/libdw + install -d -m 755 ${D}${PTEST_PATH}/libdwfl + install -d -m 755 ${D}${PTEST_PATH}/libdwelf + install -d -m 755 ${D}${PTEST_PATH}/libasm + install -d -m 755 ${D}${PTEST_PATH}/libcpu + install -d -m 755 ${D}${PTEST_PATH}/libebl + for test_file in ${TEST_FILES}; do + if [ -f ${B}/src/${test_file} ]; then + cp -r ${B}/src/${test_file} ${D}${PTEST_PATH}/src + fi + done + cp ${D}${libdir}/libelf-${PV}.so ${D}${PTEST_PATH}/libelf/libelf.so + cp ${D}${libdir}/libdw-${PV}.so ${D}${PTEST_PATH}/libdw/libdw.so + cp ${D}${libdir}/libasm-${PV}.so ${D}${PTEST_PATH}/libasm/libasm.so + cp ${B}/libcpu/libcpu.a ${D}${PTEST_PATH}/libcpu/ + cp ${B}/libebl/libebl.a ${D}${PTEST_PATH}/libebl/ + cp ${S}/libelf/*.h ${D}${PTEST_PATH}/libelf/ + cp ${S}/libdw/*.h ${D}${PTEST_PATH}/libdw/ + cp ${S}/libdwfl/*.h ${D}${PTEST_PATH}/libdwfl/ + cp ${S}/libdwelf/*.h ${D}${PTEST_PATH}/libdwelf/ + cp ${S}/libasm/*.h ${D}${PTEST_PATH}/libasm/ + cp -r ${S}/tests/ ${D}${PTEST_PATH} + cp -r ${B}/tests/* ${D}${PTEST_PATH}/tests + cp -r ${B}/config.h ${D}${PTEST_PATH} + cp -r ${B}/backends ${D}${PTEST_PATH} + sed -i '/^Makefile:/c Makefile:' ${D}${PTEST_PATH}/tests/Makefile + find ${D}${PTEST_PATH} -type f -name *.[hoc] | xargs -i rm {} + fi +} + +EXTRA_OEMAKE_class-native = "" +EXTRA_OEMAKE_class-nativesdk = "" + +BBCLASSEXTEND = "native nativesdk" + +# Package utilities separately +PACKAGES =+ "${PN}-binutils libelf libasm libdw libdebuginfod" + +# shared libraries are licensed GPLv2 or GPLv3+, binaries GPLv3+ +# according to NEWS file: +# "The license is now GPLv2/LGPLv3+ for the libraries and GPLv3+ for stand-alone +# programs. There is now also a formal CONTRIBUTING document describing how to +# submit patches." +LICENSE_${PN}-binutils = "GPLv3+" +LICENSE_${PN} = "GPLv3+" +LICENSE_libelf = "GPLv2 | LGPLv3+" +LICENSE_libasm = "GPLv2 | LGPLv3+" +LICENSE_libdw = "GPLv2 | LGPLv3+" +LICENSE_libdebuginfod = "GPLv2+ | LGPLv3+" + +FILES_${PN}-binutils = "\ + ${bindir}/eu-addr2line \ + ${bindir}/eu-ld \ + ${bindir}/eu-nm \ + ${bindir}/eu-readelf \ + ${bindir}/eu-size \ + ${bindir}/eu-strip" + +FILES_libelf = "${libdir}/libelf-${PV}.so ${libdir}/libelf.so.*" +FILES_libasm = "${libdir}/libasm-${PV}.so ${libdir}/libasm.so.*" +FILES_libdw = "${libdir}/libdw-${PV}.so ${libdir}/libdw.so.* ${libdir}/elfutils/lib*" +FILES_libdebuginfod = "${libdir}/libdebuginfod-${PV}.so ${libdir}/libdebuginfod.so.*" +# Some packages have the version preceeding the .so instead properly +# versioned .so., so we need to reorder and repackage. +#FILES_${PN} += "${libdir}/*-${PV}.so ${base_libdir}/*-${PV}.so" +#FILES_SOLIBSDEV = "${libdir}/libasm.so ${libdir}/libdw.so ${libdir}/libelf.so" + +# The package contains symlinks that trip up insane +INSANE_SKIP_${MLPREFIX}libdw = "dev-so" +# The nlist binary in the tests uses explicitly minimal compiler flags +INSANE_SKIP_${PN}-ptest += "ldflags" + +# avoid stripping some generated binaries otherwise some of the tests such as test-nlist, +# run-strip-reloc.sh, run-strip-strmerge.sh and so on will fail +INHIBIT_PACKAGE_STRIP_FILES = "\ + ${PKGD}${PTEST_PATH}/tests/test-nlist \ + ${PKGD}${PTEST_PATH}/tests/elfstrmerge \ + ${PKGD}${PTEST_PATH}/tests/backtrace-child \ + ${PKGD}${PTEST_PATH}/tests/backtrace-data \ + ${PKGD}${PTEST_PATH}/tests/backtrace-dwarf \ + ${PKGD}${PTEST_PATH}/tests/deleted \ + ${PKGD}${PTEST_PATH}/src/strip \ + ${PKGD}${PTEST_PATH}/src/addr2line \ + ${PKGD}${PTEST_PATH}/src/elfcmp \ + ${PKGD}${PTEST_PATH}/src/objdump \ + ${PKGD}${PTEST_PATH}/src/readelf \ + ${PKGD}${PTEST_PATH}/src/nm \ + ${PKGD}${PTEST_PATH}/src/elflint \ + ${PKGD}${PTEST_PATH}/src/elfclassify \ + ${PKGD}${PTEST_PATH}/src/stack \ + ${PKGD}${PTEST_PATH}/src/unstrip \ + ${PKGD}${PTEST_PATH}/libelf/libelf.so \ + ${PKGD}${PTEST_PATH}/libdw/libdw.so \ + ${PKGD}${PTEST_PATH}/libasm/libasm.so \ + ${PKGD}${PTEST_PATH}/backends/libebl_i386.so \ + ${PKGD}${PTEST_PATH}/backends/libebl_x86_64.so \ +" + +PRIVATE_LIBS_${PN}-ptest = "libdw.so.1 libelf.so.1 libasm.so.1" diff --git a/meta-openeuler/recipes-devtools/elfutils/files/run-ptest b/meta-openeuler/recipes-devtools/elfutils/files/run-ptest new file mode 100644 index 00000000000..d5776fdb538 --- /dev/null +++ b/meta-openeuler/recipes-devtools/elfutils/files/run-ptest @@ -0,0 +1,6 @@ +#!/bin/sh +# +#This script is used to run elfutils test suites +cd tests + +make -k installcheck-local CC=gcc abs_srcdir=$PWD abs_builddir=$PWD srcdir=$PWD top_srcdir=$PWD/../ abs_top_builddir=$PWD/../ elfutils_testrun=installed elfutils_tests_rpath=no program_transform_name=s,^,eu-, -- Gitee From 650f477b39d27b2a13e063d1c954d941cc8d96f9 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 30 Dec 2021 11:03:58 +0800 Subject: [PATCH 109/304] add recipe for kexec-tools Signed-off-by: lixiaoyong --- .../recipes-kernel/kexec/kexec-tools/kdump | 145 ++++++++++++++++++ .../kexec/kexec-tools/kdump.conf | 14 ++ .../kexec/kexec-tools/kdump.service | 14 ++ .../kexec/kexec-tools_2.0.20.bb | 106 +++++++++++++ 4 files changed, 279 insertions(+) create mode 100755 meta-openeuler/recipes-kernel/kexec/kexec-tools/kdump create mode 100644 meta-openeuler/recipes-kernel/kexec/kexec-tools/kdump.conf create mode 100644 meta-openeuler/recipes-kernel/kexec/kexec-tools/kdump.service create mode 100644 meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.20.bb diff --git a/meta-openeuler/recipes-kernel/kexec/kexec-tools/kdump b/meta-openeuler/recipes-kernel/kexec/kexec-tools/kdump new file mode 100755 index 00000000000..69e3cafe5cf --- /dev/null +++ b/meta-openeuler/recipes-kernel/kexec/kexec-tools/kdump @@ -0,0 +1,145 @@ +#! /bin/sh +# +# kdump +# +# Description: The kdump script provides the support: +# 1. Load a kdump kernel image into memory; +# 2. Copy away vmcore when system panic. +# + +#default +KEXEC=/usr/sbin/kexec +KEXEC_ARGS="-p" + +MAKEDUMPFILE=/usr/bin/makedumpfile +MAKEDUMPFILE_ARGS="-E -d 1" + +LOGGER="logger -p info -t kdump" + +if [ -f /etc/sysconfig/kdump.conf ]; then + . /etc/sysconfig/kdump.conf +else + echo "no /etc/sysconfig/kdump.conf" + exit 1; +fi + +do_check() +{ + #check makedumpfile + if [ ! -e ${MAKEDUMPFILE} -o ! -x ${MAKEDUMPFILE} ] ;then + echo "No makedumpfile found." + exit 0 + fi + + #check kexec + if [ ! -e ${KEXEC} -o ! -x ${KEXEC} ] ;then + echo "No kexec found." + exit 0 + fi + + #check whether kdump kernel image exists on the system + if [ -z "${KDUMP_KIMAGE}" -o ! -f "${KDUMP_KIMAGE}" ]; then + echo "No kdump kernel image found." + exit 0 + fi + + if [ "${KDUMP_CMDLINE}"x = "x" ] ; then + echo "KDUMP_CMDLINE is not configured" + exit 0 + fi +} + +do_save_vmcore() +{ + if [ ${KDUMP_VMCORE_PATH}x = x ]; then + KDUMP_VMCORE_PATH="/var/crash/`date +"%Y-%m-%d"`" + fi + + mkdir -p ${KDUMP_VMCORE_PATH} + echo "Saving a vmcore to ${KDUMP_VMCORE_PATH}." + + ${MAKEDUMPFILE} ${MAKEDUMPFILE_ARGS} /proc/vmcore ${KDUMP_VMCORE_PATH}/vmcore-"`date +"%H:%M:%S"`" +# cp --sparse=always /proc/vmcore ${KDUMP_VMCORE_PATH}/vmcore-"`date +"%H:%M:%S"`" + rc=$? + if [ ${rc} == 0 ]; then + ${LOGGER} "Saved a vmcore to ${KDUMP_VMCORE_PATH}." + else + ${LOGGER} "Failed to save vmcore!" + fi + return ${rc} +} + +do_start() +{ + #check file + do_check + + #check whether the running kernel supports kdump. + if [ ! -e /sys/kernel/kexec_crash_loaded ]; then + echo "Kdump isn't supported on the running kernel!!!" + ${LOGGER} "Kdump isn't supported on the running kernel!!!" + return 1 + fi + + #check whether kdump kernel image has been loaded + rc=`cat /sys/kernel/kexec_crash_loaded` + if [ ${rc} != 0 ]; then + echo "Kdump is already running."; + ${LOGGER} "Kdump is already running." + return 0 + fi + + #check the running kernel cmdline option,insure "crashkernel=" always set. + grep -q crashkernel= /proc/cmdline + if [ $? != 0 ]; then + echo "Kdump isn't supported on the running kernel,please check boot option!!!" + ${LOGGER} "Kdump isn't supported on the running kernel,please check boot option!!!" + return 1 + fi + + #Load the kdump kernel image + ${KEXEC} ${KEXEC_ARGS} "${KDUMP_KIMAGE}" --append="${KDUMP_CMDLINE}" + if [ $? != 0 ]; then + echo "Failed to load kdump kernel!" + ${LOGGER} "Failed to load kdump kernel!" + return 1 + fi + + echo "Kdump started up." + ${LOGGER} "Kdump started up." +} + +do_stop() +{ + ${KEXEC} -p -u 2>/dev/null + if [ $? == 0 ]; then + echo "Kdump has been stopped." + ${LOGGER} "Kdump has been stopped." + else + echo "Failed to stop kdump!" + ${LOGGER} "Failed to stop kdump!" + fi +} + +case "$1" in + start) + if [ -s /proc/vmcore ]; then + do_save_vmcore + reboot + else + do_start + fi + ;; + restart) + do_stop + do_start + ;; + stop) + do_stop + ;; + *) + echo $"Usage: $0 {start|stop|restart}" + exit 1 +esac + +exit $? diff --git a/meta-openeuler/recipes-kernel/kexec/kexec-tools/kdump.conf b/meta-openeuler/recipes-kernel/kexec/kexec-tools/kdump.conf new file mode 100644 index 00000000000..38190d207a1 --- /dev/null +++ b/meta-openeuler/recipes-kernel/kexec/kexec-tools/kdump.conf @@ -0,0 +1,14 @@ +#the kdump kernel version string. +#KDUMP_KVER="`uname -r`" + +#this will be passed to the kdump kernel as kdump kernel command line +#KDUMP_CMDLINE="`cat /proc/cmdline`" + +#the kernel image for kdump +#KDUMP_KIMAGE="/boot/bzImage-${KDUMP_KVER}" + +#Where to save the vmcore +#KDUMP_VMCORE_PATH="/var/crash/`date +"%Y-%m-%d"`" + +#the arguments to makedumpfile +MAKEDUMPFILE_ARGS="--dump-dmesg -x /boot/vmlinux-`uname -r`" diff --git a/meta-openeuler/recipes-kernel/kexec/kexec-tools/kdump.service b/meta-openeuler/recipes-kernel/kexec/kexec-tools/kdump.service new file mode 100644 index 00000000000..b4a2c0611d3 --- /dev/null +++ b/meta-openeuler/recipes-kernel/kexec/kexec-tools/kdump.service @@ -0,0 +1,14 @@ +[Unit] +Description=Reboot and dump vmcore via kexec +DefaultDependencies=no +Requires=sysinit.target +After=sysinit.target + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=@LIBEXECDIR@/kdump-helper start +ExecStop=@LIBEXECDIR@/kdump-helper stop + +[Install] +WantedBy=multi-user.target diff --git a/meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.20.bb b/meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.20.bb new file mode 100644 index 00000000000..367822529bd --- /dev/null +++ b/meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.20.bb @@ -0,0 +1,106 @@ +SUMMARY = "Kexec fast reboot tools" +DESCRIPTION = "Kexec is a fast reboot feature that lets you reboot to a new Linux kernel" +AUTHOR = "Eric Biederman" +HOMEPAGE = "http://kernel.org/pub/linux/utils/kernel/kexec/" +SECTION = "kernel/userland" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=ea5bed2f60d357618ca161ad539f7c0a \ + file://kexec/kexec.c;beginline=1;endline=20;md5=af10f6ae4a8715965e648aa687ad3e09" +DEPENDS = "zlib" + +SRC_URI = "file://kexec-tools/kexec-tools-${PV}.tar.xz \ + file://kexec-tools/kexec-tools-2.0.20-fix-broken-multiboot2-buliding-for-i386.patch \ + file://kexec-tools/kexec-tools-2.0.20-Remove-duplicated-variable-declarations.patch \ + file://kexec-tools/kexec-add-variant-helper-functions-for-handling-memory-regions.patch \ + file://kexec-tools/arm64-kexec-allocate-memory-space-avoiding-reserved-regions.patch \ + file://kexec-tools/x86-Fix-PAGE_OFFSET-for-kernels-since-4.20.patch \ + file://kexec-tools/Cleanup-remove-the-read_elf_kcore.patch \ + file://kexec-tools/Fix-an-error-definition-about-the-variable-fname.patch \ + file://kexec-tools/Cleanup-move-it-back-from-util_lib-elf_info.c.patch \ + file://kexec-tools/Limit-the-size-of-vmcore-dmesg.txt-to-2G.patch \ + file://kexec-tools/vmcore-dmesg-vmcore-dmesg.c-Fix-shifting-error-reported-by-cppcheck.patch \ + file://kexec-tools/kexec-tools-Fix-possible-out-of-bounds-access-in-ifdown.patch \ + file://kexec-tools/kexec-tools-Fix-kexec_file_load-2-error-handling.patch \ + file://kexec-tools/kexec-tools-Reset-getopt-before-falling-back-to-legacy.patch \ + file://kexec-tools/kexec-support-parsing-the-string-Reserved-to-get-the-correct-e820-reserved-region.patch \ + file://kexec-tools/arm64-kdump-deal-with-a-lot-of-resource-entries-in-proc-iomem.patch \ +" +SRC_URI_append_aarch64 += " \ + file://kexec-tools/arm64-support-more-than-one-crash-kernel-regions.patch \ +" +SRC_URI_append = " \ + file://kexec-tools/kexec-Add-quick-kexec-support.patch \ +" +SRC_URI_append_aarch64 += " \ + file://kexec-tools/kexec-Quick-kexec-implementation-for-arm64.patch \ +" +SRC_URI_append = " \ + file://kexec-tools/backport-print-add-support-for-lockless-ringbuffer.patch \ + file://kdump \ + file://kdump.conf \ + file://kdump.service \ +" +SRC_URI[sha256sum] = "dad8077f0315445d1f6335579fc4ade222facf82a67124974c7be5303ba4f8c8" + +inherit autotools + +export LDFLAGS = "-L${STAGING_LIBDIR}" +EXTRA_OECONF = " --with-zlib=yes" + +do_compile_prepend() { + # Remove the prepackaged config.h from the source tree as it overrides + # the same file generated by configure and placed in the build tree + rm -f ${S}/include/config.h + + # Remove the '*.d' file to make sure the recompile is OK + for dep in `find ${B} -type f -name '*.d'`; do + dep_no_d="`echo $dep | sed 's#.d$##'`" + # Remove file.d when there is a file.o + if [ -f "$dep_no_d.o" ]; then + rm -f $dep + fi + done +} + +do_install_append () { + install -d ${D}${sysconfdir}/sysconfig + install -m 0644 ${WORKDIR}/kdump.conf ${D}${sysconfdir}/sysconfig + + if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'true', 'false', d)}; then + install -D -m 0755 ${WORKDIR}/kdump ${D}${sysconfdir}/init.d/kdump + fi + + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + install -D -m 0755 ${WORKDIR}/kdump ${D}${libexecdir}/kdump-helper + install -D -m 0644 ${WORKDIR}/kdump.service ${D}${systemd_unitdir}/system/kdump.service + sed -i -e 's,@LIBEXECDIR@,${libexecdir},g' ${D}${systemd_unitdir}/system/kdump.service + fi +} + +PACKAGES =+ "kexec kdump vmcore-dmesg" + +ALLOW_EMPTY_${PN} = "1" +RRECOMMENDS_${PN} = "kexec kdump vmcore-dmesg" + +FILES_kexec = "${sbindir}/kexec" +FILES_kdump = "${sbindir}/kdump \ + ${sysconfdir}/sysconfig/kdump.conf \ + ${sysconfdir}/init.d/kdump \ + ${libexecdir}/kdump-helper \ + ${systemd_unitdir}/system/kdump.service \ +" + +FILES_vmcore-dmesg = "${sbindir}/vmcore-dmesg" + +INITSCRIPT_PACKAGES = "kdump" +INITSCRIPT_NAME_kdump = "kdump" +INITSCRIPT_PARAMS_kdump = "start 56 2 3 4 5 . stop 56 0 1 6 ." + +SYSTEMD_PACKAGES = "kdump" +SYSTEMD_SERVICE_kdump = "kdump.service" + +SECURITY_PIE_CFLAGS_remove = "-fPIE -pie" + +COMPATIBLE_HOST = '(x86_64.*|i.86.*|arm.*|aarch64.*|powerpc.*|mips.*)-(linux|freebsd.*)' + +INSANE_SKIP_${PN} = "arch" -- Gitee From 2afbf98bed4d949581e7c1ec736ef82de8f50739 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 30 Dec 2021 11:04:53 +0800 Subject: [PATCH 110/304] add recipe for psmisc Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/psmisc/psmisc.inc | 36 +++++++++++++++++++ .../recipes-core/psmisc/psmisc_23.4.bb | 6 ++++ 2 files changed, 42 insertions(+) create mode 100644 meta-openeuler/recipes-core/psmisc/psmisc.inc create mode 100644 meta-openeuler/recipes-core/psmisc/psmisc_23.4.bb diff --git a/meta-openeuler/recipes-core/psmisc/psmisc.inc b/meta-openeuler/recipes-core/psmisc/psmisc.inc new file mode 100644 index 00000000000..3b167d56158 --- /dev/null +++ b/meta-openeuler/recipes-core/psmisc/psmisc.inc @@ -0,0 +1,36 @@ +SUMMARY = "Utilities for managing processes on your system" +HOMEPAGE = "http://psmisc.sf.net/" +DESCRIPTION = "The psmisc package contains utilities for managing processes on your \ +system: pstree, killall and fuser. The pstree command displays a tree \ +structure of all of the running processes on your system. The killall \ +command sends a specified signal (SIGTERM if nothing is specified) to \ +processes identified by name. The fuser command identifies the PIDs \ +of processes that are using specified files or filesystems." +SECTION = "base" +DEPENDS = "ncurses virtual/libintl" +LICENSE = "GPLv2" + +inherit autotools gettext + +PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'ipv6', d)}" +PACKAGECONFIG[ipv6] = "--enable-ipv6,--disable-ipv6," + +ALLOW_EMPTY_${PN} = "1" + +PACKAGES =+ "fuser fuser-doc killall killall-doc pstree pstree-doc" +PACKAGES += "psmisc-extras" + +FILES_${PN} = "" +RDEPENDS_${PN} = "fuser killall pstree" + +FILES_fuser = "${bindir}/fuser.${BPN}" +FILES_fuser-doc = "${mandir}/man1/fuser*" + +FILES_killall = "${bindir}/killall.${BPN}" +FILES_killall-doc = "${mandir}/man1/killall*" + +FILES_pstree = "${bindir}/pstree" +FILES_pstree-doc = "${mandir}/man1/pstree*" + +FILES_psmisc-extras = "${bindir}" +FILES_psmisc-extras-doc = "${mandir}" diff --git a/meta-openeuler/recipes-core/psmisc/psmisc_23.4.bb b/meta-openeuler/recipes-core/psmisc/psmisc_23.4.bb new file mode 100644 index 00000000000..77389ea510b --- /dev/null +++ b/meta-openeuler/recipes-core/psmisc/psmisc_23.4.bb @@ -0,0 +1,6 @@ +require psmisc.inc +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=0636e73ff0215e8d672dc4c32c317bb3" + +SRC_URI = "file://psmisc/${BP}.tar.xz" +S = "${WORKDIR}/${BP}" -- Gitee From 4ea0b94f683b49bbe15844e45491535fdbe71266 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 30 Dec 2021 11:06:03 +0800 Subject: [PATCH 111/304] add recipe for squashfs-tools Signed-off-by: lixiaoyong --- .../squashfs-tools/squashfs-tools_4.5.bb | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 meta-openeuler/recipes-devtools/squashfs-tools/squashfs-tools_4.5.bb diff --git a/meta-openeuler/recipes-devtools/squashfs-tools/squashfs-tools_4.5.bb b/meta-openeuler/recipes-devtools/squashfs-tools/squashfs-tools_4.5.bb new file mode 100644 index 00000000000..53a1060e17b --- /dev/null +++ b/meta-openeuler/recipes-devtools/squashfs-tools/squashfs-tools_4.5.bb @@ -0,0 +1,42 @@ +# Note, we can probably remove the lzma option as it has be replaced with xz, +# and I don't think the kernel supports it any more. +SUMMARY = "Tools for manipulating SquashFS filesystems" +HOMEPAGE = "https://github.com/plougher/squashfs-tools" +DESCRIPTION = "Tools to create and extract Squashfs filesystems." +SECTION = "base" +LICENSE = "GPL-2" +LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263" + +SRC_URI = "file://squashfs-tools/squashfs4.5.tar.gz \ + file://squashfs-tools/0001-CVE-2021-41072.patch \ + file://squashfs-tools/0002-CVE-2021-41072.patch \ + file://squashfs-tools/0003-CVE-2021-41072.patch \ + file://squashfs-tools/0004-CVE-2021-41072.patch \ + file://squashfs-tools/0005-CVE-2021-41072.patch \ +" + +S = "${WORKDIR}/${BP}" +B = "${S}/${PN}" + +EXTRA_OEMAKE = "${PACKAGECONFIG_CONFARGS}" + +PACKAGECONFIG ??= "gzip xz xattr" +PACKAGECONFIG[gzip] = "GZIP_SUPPORT=1,GZIP_SUPPORT=0,zlib" +PACKAGECONFIG[xz] = "XZ_SUPPORT=1,XZ_SUPPORT=0,xz" +PACKAGECONFIG[xattr] = "XATTR_SUPPORT=1,XATTR_SUPPORT=0,attr" + +do_compile() { + oe_runmake all +} + +do_install() { + oe_runmake install INSTALL_DIR=${D}${sbindir} +} + +ARM_INSTRUCTION_SET_armv4 = "arm" +ARM_INSTRUCTION_SET_armv5 = "arm" +ARM_INSTRUCTION_SET_armv6 = "arm" + +BBCLASSEXTEND = "native nativesdk" + +CVE_PRODUCT = "squashfs" -- Gitee From ff6f8c99d1159c7d7cd6eb060ddaa653f77ebfd9 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 30 Dec 2021 11:07:14 +0800 Subject: [PATCH 112/304] add recipe for strace Signed-off-by: lixiaoyong --- .../recipes-devtools/strace/strace/run-ptest | 6 +++ .../recipes-devtools/strace/strace_5.14.bb | 49 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100755 meta-openeuler/recipes-devtools/strace/strace/run-ptest create mode 100644 meta-openeuler/recipes-devtools/strace/strace_5.14.bb diff --git a/meta-openeuler/recipes-devtools/strace/strace/run-ptest b/meta-openeuler/recipes-devtools/strace/strace/run-ptest new file mode 100755 index 00000000000..3a51fb0be9d --- /dev/null +++ b/meta-openeuler/recipes-devtools/strace/strace/run-ptest @@ -0,0 +1,6 @@ +#!/bin/sh +export TIMEOUT_DURATION=240 +chown nobody tests +chown nobody tests/* +chown nobody ../ptest +su nobody -c "make -B -C tests -k test-suite.log" diff --git a/meta-openeuler/recipes-devtools/strace/strace_5.14.bb b/meta-openeuler/recipes-devtools/strace/strace_5.14.bb new file mode 100644 index 00000000000..7125c0ef9e1 --- /dev/null +++ b/meta-openeuler/recipes-devtools/strace/strace_5.14.bb @@ -0,0 +1,49 @@ +SUMMARY = "System call tracing tool" +HOMEPAGE = "http://strace.io" +DESCRIPTION = "strace is a diagnostic, debugging and instructional userspace utility for Linux. It is used to monitor and tamper with interactions between processes and the Linux kernel, which include system calls, signal deliveries, and changes of process state." +SECTION = "console/utils" +LICENSE = "LGPL-2.1+ & GPL-2+" +LIC_FILES_CHKSUM = "file://COPYING;md5=318cfc887fc8723f4e9d4709b55e065b" + +SRC_URI = "file://strace/strace-${PV}.tar.xz \ + file://run-ptest \ + " +SRC_URI[sha256sum] = "901bee6db5e17debad4530dd9ffb4dc9a96c4a656edbe1c3141b7cb307b11e73" + +inherit autotools ptest + +#PACKAGECONFIG_class-target ??= "\ +# ${@bb.utils.contains('DISTRO_FEATURES', 'bluetooth', 'bluez', '', d)} \ +#" + +#PACKAGECONFIG[bluez] = "ac_cv_header_bluetooth_bluetooth_h=yes,ac_cv_header_bluetooth_bluetooth_h=no,bluez5" +PACKAGECONFIG[libunwind] = "--with-libunwind,--without-libunwind,libunwind" + +EXTRA_OECONF += "--enable-mpers=no --disable-gcc-Werror" + +CFLAGS_append_libc-musl = " -Dsigcontext_struct=sigcontext" + +TESTDIR = "tests" +PTEST_BUILD_HOST_PATTERN = "^(DEB_CHANGELOGTIME|RPM_CHANGELOGTIME|WARN_CFLAGS_FOR_BUILD|LDFLAGS_FOR_BUILD)" + +do_compile_ptest() { + oe_runmake ${PARALLEL_MAKE} -C ${TESTDIR} buildtest-TESTS +} + +do_install_ptest() { + oe_runmake -C ${TESTDIR} install-ptest BUILDDIR=${B} DESTDIR=${D}${PTEST_PATH} TESTDIR=${TESTDIR} + mkdir -p ${D}${PTEST_PATH}/build-aux + mkdir -p ${D}${PTEST_PATH}/src + install -m 755 ${S}/build-aux/test-driver ${D}${PTEST_PATH}/build-aux/ + install -m 644 ${B}/src/config.h ${D}${PTEST_PATH}/src/ + sed -i -e '/^src/s/strace.*[0-9]/ptest/' ${D}/${PTEST_PATH}/${TESTDIR}/Makefile +} + +RDEPENDS_${PN}-ptest += "make coreutils grep gawk sed" + +RDEPENDS_${PN}-ptest_append_libc-glibc = "\ + locale-base-en-us.iso-8859-1 \ +" + +BBCLASSEXTEND = "native" +TOOLCHAIN = "gcc" -- Gitee From 579b63f0f6b38cfa1ff3ac2f293eb8b5114429a1 Mon Sep 17 00:00:00 2001 From: lisimin Date: Thu, 30 Dec 2021 19:21:46 +0800 Subject: [PATCH 113/304] package lcr and iSulad and move .so to ${PN}, add it to rootfs Signed-off-by: lisimin --- .../recipes-core/iSulad/iSulad_2.0.9.bb | 21 +++++++------------ meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb | 10 ++------- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb index 22cf83388f4..925051030e6 100644 --- a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb +++ b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.9.bb @@ -29,6 +29,8 @@ EXTRA_OECMAKE = "-DENABLE_GRPC=OFF -DENABLE_SYSTEMD_NOTIFY=OFF -DENABLE_SELINUX= INHIBIT_PACKAGE_DEBUG_SPLIT = "1" FILES_${PN} += "${libdir}/* " +#remove so from ${PN}-dev +FILES_SOLIBSDEV = "" do_configure_prepend() { grep -q CMAKE_SYSROOT ${WORKDIR}/toolchain.cmake || cat >> ${WORKDIR}/toolchain.cmake < Date: Thu, 30 Dec 2021 19:33:30 +0800 Subject: [PATCH 114/304] move .so to ${PN}, add it to rootfs for libarchive libwebsockets yajl Signed-off-by: lisimin --- meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb | 3 ++- .../recipes-core/libwebsockets/libwebsockets_4.0.20.bb | 1 + meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb b/meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb index 5e8db50c195..68609a9c84e 100644 --- a/meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb +++ b/meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb @@ -16,7 +16,8 @@ inherit cmake INHIBIT_PACKAGE_DEBUG_SPLIT = "1" FILES_${PN} += "${libdir}/libarchive.so* " -INSANE_SKIP_${PN} += "already-stripped" +INSANE_SKIP_${PN} += "already-stripped dev-so" +FILES_SOLIBSDEV = "" do_install_append() { [[ "${libdir}" != "/usr/lib" ]] || return 0 diff --git a/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb b/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb index 4ca34d33c9f..db07b86cff4 100644 --- a/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb +++ b/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb @@ -31,6 +31,7 @@ INHIBIT_PACKAGE_DEBUG_SPLIT = "1" FILES_${PN} += "${libdir}/*" INSANE_SKIP_${PN} += "already-stripped" +FILES_SOLIBSDEV = "" do_install_append() { rm -rf ${D}/usr/share diff --git a/meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb b/meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb index b620bd1e8d3..f12fa0d475e 100644 --- a/meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb +++ b/meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb @@ -21,6 +21,7 @@ INHIBIT_PACKAGE_DEBUG_SPLIT = "1" INSANE_SKIP_${PN} += "already-stripped" FILES_${PN} += "${libdir}/libyajl.so* " +FILES_SOLIBSDEV = "" do_install_append() { ${STRIP} ${D}/${libdir}/*.so* -- Gitee From 78849003169860e651bc1bfed153b73cdddc237d Mon Sep 17 00:00:00 2001 From: lisimin Date: Thu, 30 Dec 2021 19:35:30 +0800 Subject: [PATCH 115/304] add init for qemu start add ${PN}-bash to fix file conflict for busybox and bash add ${PN}-login ${PN}-groups to fix file conflict for busybox and shadow Signed-off-by: lisimin --- meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb index afcb1162477..0c58fe71cb8 100644 --- a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb +++ b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb @@ -44,7 +44,11 @@ FILES_${PN}-mdev = "${sysconfdir}/init.d/mdev ${sysconfdir}/mdev.conf ${sysconfd FILES_${PN}-udhcpd = "${sysconfdir}/init.d/busybox-udhcpd" FILES_${PN}-udhcpc = "${sysconfdir}/udhcpc.d ${datadir}/udhcpc" FILES_${PN}-hwclock = "${sysconfdir}/init.d/hwclock.sh" -FILES_${PN}-linuxrc = "/linuxrc" +FILES_${PN}-linuxrc = "/linuxrc /init" +PACKAGES =+ "${PN}-bash ${PN}-login ${PN}-groups" +FILES_${PN}-bash = "${base_bindir}/bash" +FILES_${PN}-login = "${base_bindir}/login" +FILES_${PN}-groups = "${bindir}/groups" INITSCRIPT_PACKAGES = "${PN}-httpd ${PN}-syslog ${PN}-udhcpd ${PN}-mdev ${PN}-hwclock" @@ -106,5 +110,8 @@ do_compile () { do_install () { oe_runmake CONFIG_PREFIX="${D}" install + pushd "${D}" + ln -s bin/busybox init + popd } INSANE_SKIP += "already-stripped" -- Gitee From 477a9bf8abbeb07a83374ea1e61195c1e64c37bb Mon Sep 17 00:00:00 2001 From: lisimin Date: Thu, 30 Dec 2021 19:37:07 +0800 Subject: [PATCH 116/304] package files in openeuler gcc toolchain, used in qemu Signed-off-by: lisimin --- .../recipes-core/glibc/glibc_2.25.bb | 48 ++++++++++++------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/meta-openeuler/recipes-core/glibc/glibc_2.25.bb b/meta-openeuler/recipes-core/glibc/glibc_2.25.bb index d5167a4a458..b4a42602b28 100644 --- a/meta-openeuler/recipes-core/glibc/glibc_2.25.bb +++ b/meta-openeuler/recipes-core/glibc/glibc_2.25.bb @@ -27,10 +27,11 @@ SRC_URI_aarch64 = "file://openeuler_gcc_arm64le" SRC_URI_arm = "file://openeuler_gcc_arm32le" #Not strip toolchain INHIBIT_SYSROOT_STRIP = "1" +INSANE_SKIP_${PN} += "already-stripped" #FILESPATH_prepend += "${LOCAL_FILES}:" DL_DIR = "${LOCAL_SYSROOT_DL_DIR}" -S_aarch64 = "${WORKDIR}/openeuler_gcc_arm64le/sysroot" -S_arm = "${WORKDIR}/openeuler_gcc_arm32le/sysroot" +S_aarch64 = "${WORKDIR}/openeuler_gcc_arm64le" +S_arm = "${WORKDIR}/openeuler_gcc_arm32le" PSEUDO_DISABLED = "1" PRIVATE_LIBS_${PN}-dev_append = "libdl.so.2 libresolv.so.2 libm.so.6 librt.so.1 libnsl.so.1 libnss_files.so.2 " @@ -44,30 +45,41 @@ do_compile () { do_install() { install -m 0755 -d ${D}/ - cp -pPR ${S}/* ${D}/ - #for f in ${D}${bindir}/${EULER_TOOLCHAIN_SYSNAME}-*; do - echo "EULER_TOOLCHAIN_SYSNAME:$EULER_TOOLCHAIN_SYSNAME" - echo "TARGET_PREFIX:$TARGET_PREFIX" - EULER_TOOLCHAIN_SYSNAME="aarch64-openeuler-linux-gnu" - EULER_TOOLCHAIN_TARGET_PREFIX="aarch64-openeuler-linux-" - echo "D:${D}" + install -m 0755 -d ${D}/${base_libdir} + install -m 0755 -d ${D}/${libdir} + cp -pPR ${S}/sysroot/* ${D}/ rm -rf ${D}/etc/rpc rm -rf ${D}/${base_libdir}/debug - echo ${libdir} - echo ${base_libdir} + chown root:root ${D}/ -R } +FILES_${PN} = " \ +${base_libdir}/ld-linux*.so.* \ +${libdir}/libc.so \ +${base_libdir}/libm.so \ +${base_libdir}/libc.so.6 \ +${base_libdir}/libm.so.6 \ +${libdir}/libcrypt.so \ +${libdir}/libnss_compat.so \ +${libdir}/libresolv.so \ +${base_libdir}/libcrypt.so.1 \ +${base_libdir}/libnss_compat.so.2 \ +${base_libdir}/libnsl.so.1 \ +{base_libdir}/libnss_files.so.2 \ +${base_libdir}/libresolv.so.2 \ +${base_libdir}/librt* \ +${base_libdir}/libpthread* \ +${base_libdir}/libutil* \ +${base_libdir}/libgcc_s.so.1 \ +${base_libdir}/libtirpc.so* \ +" +INSANE_SKIP_${PN} += "installed-vs-shipped" +INSANE_SKIP += "dev-elf dev-so" + SYSROOT_DIRS += "/*" #depends by glibc-locale do_stash_locale() { : } addtask do_stash_locale -deltask do_package -deltask do_package_write_rpm -#depends by libgcc -do_packagedata () { - : -} - BBCLASSEXTEND = "native nativesdk" -- Gitee From 5e080ad25ebc74b94e35971355ae88ba0a639b0c Mon Sep 17 00:00:00 2001 From: lisimin Date: Thu, 30 Dec 2021 19:40:00 +0800 Subject: [PATCH 117/304] add openssh-scp needed by openssh Signed-off-by: lisimin --- meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb b/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb index 164b8f9657a..35d44c2565e 100644 --- a/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb +++ b/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb @@ -146,7 +146,7 @@ do_install_append () { ALLOW_EMPTY_${PN} = "0" PACKAGES =+ "${PN}-keygen ${PN}-scp ${PN}-ssh ${PN}-sshd ${PN}-sftp ${PN}-misc ${PN}-sftp-server" -FILES_${PN}-scp = "${bindir}/scp.${BPN}" +FILES_${PN}-scp = "${bindir}/scp.${BPN} ${bindir}/scp" FILES_${PN}-ssh = "${bindir}/ssh.${BPN} ${sysconfdir}/ssh/ssh_config" FILES_${PN}-sshd = "${sbindir}/sshd ${sysconfdir}/init.d/sshd ${systemd_unitdir}/system" FILES_${PN}-sshd += "${sysconfdir}/ssh/moduli ${sysconfdir}/ssh/sshd_config ${sysconfdir}/ssh/sshd_config_readonly ${sysconfdir}/default/volatiles/99_sshd ${sysconfdir}/pam.d/sshd" -- Gitee From 5f6a0d0f38603c6ee93701f36f468811a6763148 Mon Sep 17 00:00:00 2001 From: lisimin Date: Thu, 30 Dec 2021 19:42:05 +0800 Subject: [PATCH 118/304] add rcS for mount delete securetty,use securetty from shadow-securetty change permission to 0600 for /etc/fstab /etc/sysctl.conf /etc/shadow Signed-off-by: lisimin --- meta-openeuler/recipes-core/os-base/os-base/rcS | 2 ++ meta-openeuler/recipes-core/os-base/os-base_1.0.bb | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 meta-openeuler/recipes-core/os-base/os-base/rcS diff --git a/meta-openeuler/recipes-core/os-base/os-base/rcS b/meta-openeuler/recipes-core/os-base/os-base/rcS new file mode 100644 index 00000000000..fc699e4723c --- /dev/null +++ b/meta-openeuler/recipes-core/os-base/os-base/rcS @@ -0,0 +1,2 @@ +#!/bin/sh +/bin/mount -a diff --git a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb index e32abb8290b..f181ba1522e 100644 --- a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb +++ b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb @@ -10,6 +10,7 @@ LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE;md5=1acb172ffd3d252285dd1b8b845994 SRC_URI = "file://bashrc \ file://fstab \ + file://rcS \ file://group \ file://inittab \ file://issue \ @@ -18,7 +19,6 @@ SRC_URI = "file://bashrc \ file://motd \ file://passwd \ file://profile \ - file://securetty \ file://shadow \ file://sysctl.conf \ file://rc.functions \ @@ -28,7 +28,7 @@ SRC_URI = "file://bashrc \ do_install() { install -d ${D}/etc cp ${WORKDIR}/bashrc ${D}/etc/ - cp ${WORKDIR}/fstab ${D}/etc/ + install -m 0600 ${WORKDIR}/fstab ${D}/etc/ cp ${WORKDIR}/group ${D}/etc/ cp ${WORKDIR}/inittab ${D}/etc/ cp ${WORKDIR}/issue ${D}/etc/ @@ -36,15 +36,15 @@ do_install() { cp ${WORKDIR}/motd ${D}/etc/ cp ${WORKDIR}/passwd ${D}/etc/ cp ${WORKDIR}/profile ${D}/etc/ - cp ${WORKDIR}/securetty ${D}/etc/ - cp ${WORKDIR}/shadow ${D}/etc/ - cp ${WORKDIR}/sysctl.conf ${D}/etc/ + install -m 0600 ${WORKDIR}/shadow ${D}/etc/ + install -m 0600 ${WORKDIR}/sysctl.conf ${D}/etc/ install -d ${D}/etc/rc.d cp ${WORKDIR}/rc.functions ${D}/etc/rc.d cp ${WORKDIR}/rc.sysinit ${D}/etc/rc.d cp ${WORKDIR}/rc.local ${D}/etc/rc.d + install -m 0755 -d ${D}/etc/init.d/ + install -m 0750 ${WORKDIR}/rcS ${D}/etc/init.d/ } - FILES_${PN} = "/" INHIBIT_DEFAULT_DEPS = "1" -- Gitee From 72a091c39b7a619bbcef303b821445f9a21a35e8 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Fri, 31 Dec 2021 04:47:17 +0000 Subject: [PATCH 119/304] update meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.20.bb. --- meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.20.bb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.20.bb b/meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.20.bb index 367822529bd..e8cc09d3cc7 100644 --- a/meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.20.bb +++ b/meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.20.bb @@ -28,13 +28,13 @@ SRC_URI = "file://kexec-tools/kexec-tools-${PV}.tar.xz \ SRC_URI_append_aarch64 += " \ file://kexec-tools/arm64-support-more-than-one-crash-kernel-regions.patch \ " -SRC_URI_append = " \ +SRC_URI_append += " \ file://kexec-tools/kexec-Add-quick-kexec-support.patch \ " SRC_URI_append_aarch64 += " \ file://kexec-tools/kexec-Quick-kexec-implementation-for-arm64.patch \ " -SRC_URI_append = " \ +SRC_URI_append += " \ file://kexec-tools/backport-print-add-support-for-lockless-ringbuffer.patch \ file://kdump \ file://kdump.conf \ -- Gitee From 7808f7e1f0bc4f015a59e64ce6e0c721f36f5fc8 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Fri, 31 Dec 2021 15:50:37 +0800 Subject: [PATCH 120/304] docs: add initial structure and configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加初始文档配置和内容 Signed-off-by: Wayne Ren --- docs/make.bat | 35 --- docs/source/conf.py | 4 +- docs/source/features/distributed_soft_bus.rst | 4 + docs/source/features/index.rst | 12 + docs/source/features/mcs.rst | 4 + docs/source/getting_started/index.rst | 225 ++++++++++++++++++ docs/source/index.rst | 42 +--- docs/source/introduction/index.rst | 10 + docs/source/releases/index.rst | 12 + .../releases/release-notes-21.09.30.rst | 9 + .../releases/release-notes-22.03.30.rst | 9 + docs/source/yocto/index.rst | 30 +++ 12 files changed, 330 insertions(+), 66 deletions(-) delete mode 100644 docs/make.bat create mode 100644 docs/source/features/distributed_soft_bus.rst create mode 100644 docs/source/features/index.rst create mode 100644 docs/source/features/mcs.rst create mode 100644 docs/source/getting_started/index.rst create mode 100644 docs/source/introduction/index.rst create mode 100644 docs/source/releases/index.rst create mode 100644 docs/source/releases/release-notes-21.09.30.rst create mode 100644 docs/source/releases/release-notes-22.03.30.rst create mode 100644 docs/source/yocto/index.rst diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 6fcf05b4b76..00000000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=source -set BUILDDIR=build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/source/conf.py b/docs/source/conf.py index 9bba86ddafb..f3d4bfc4980 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -18,8 +18,8 @@ # -- Project information ----------------------------------------------------- project = 'yocto-doc' -copyright = '2021, lisiming' -author = 'lisiming' +copyright = '2021, openEuler Embedded' +author = 'openEuler Embedded' # The full version, including alpha/beta/rc tags release = '1.0.0' diff --git a/docs/source/features/distributed_soft_bus.rst b/docs/source/features/distributed_soft_bus.rst new file mode 100644 index 00000000000..2cd6e685c69 --- /dev/null +++ b/docs/source/features/distributed_soft_bus.rst @@ -0,0 +1,4 @@ +.. _distributed_soft_bus: + +分布式软总线 +############# \ No newline at end of file diff --git a/docs/source/features/index.rst b/docs/source/features/index.rst new file mode 100644 index 00000000000..7468b986291 --- /dev/null +++ b/docs/source/features/index.rst @@ -0,0 +1,12 @@ +.. _openeuler_embedded_features: + + +openEuler embedded关键特性 +################################ + +.. toctree:: + :maxdepth: 1 + :caption: 内容 + + mcs.rst + distributed_soft_bus.rst \ No newline at end of file diff --git a/docs/source/features/mcs.rst b/docs/source/features/mcs.rst new file mode 100644 index 00000000000..a700adf6819 --- /dev/null +++ b/docs/source/features/mcs.rst @@ -0,0 +1,4 @@ +.. _mixed_critical_system: + +混合关键性系统 +################### diff --git a/docs/source/getting_started/index.rst b/docs/source/getting_started/index.rst new file mode 100644 index 00000000000..00b2470d534 --- /dev/null +++ b/docs/source/getting_started/index.rst @@ -0,0 +1,225 @@ +.. _getting_started: + +快速上手 +########## + +openEuler Embedded是基于openEuler社区面向嵌入式场景的Linux版本。由于嵌入式系统应用受到多个因素的约束,如资源、功耗、多样性等, +使得面向服务器领域的Linux及相应的构建系统很难满足嵌入式场景的要求,因此业界广泛采用 `Yocto `_ +来定制化构建嵌入式Linux。openEuler Embedded当前也采用的Yocto构建,但实现了与openEuler其他版本代码同源,具体的构建方法请参考 +`SIG-Yocto `_ +下相关代码仓中的内容。 + +本文档主要用于介绍如何获取预先构建好的镜像,如何运行镜像,以及如何基于镜像完成基本的嵌入式Linux应用开发。 + +获取镜像 +*********** + +当前发布的已构建好的镜像,只支持arm和aarch64两种架构,且只支持qemu中ARM virt-4.0平台,您可以通过如下链接获得相应的镜像: + +- `qemu_arm `_: 32位arm架构, ARM Cortex A15处理器 +- `qemu_aarch64 `_: 64位aarch64架构 ARM Cortex A57处理器 + +只要相应环境支持qemu仿真器(版本5.0以上),您可以将提供的openEuler Embedded镜像部署在物理裸机、云环境、容器或虚拟机上。 + +镜像内容 +*********** + +所下载的镜像,由以下几部分组成: + +- 内核镜像 **zImage**: 基于openEuler社区Linux 5.10代码构建得到。相应的内核配置可通过如下链接获取: + + - `arm(cortex a15) `_ + - `arm(cortex a57) `_, + 针对aarch64架构,额外增加了镜像自解压功能,可以参见相应的 `patch `_ + +- 根文件系统镜像(依据具体需求,以下二选一) + + - **initrd_tiny**:极简根文件系统镜像,只包含基本功能。包含 busybox 和基本的 glibc 库。该镜像功能简单,但内存消耗很小,适合探索 Linux内核相关功能。 + - **initrd**:标准根文件系统镜像,在极简根文件系统镜像的基础上,进行了必要安全加固,增加了audit、cracklib、OpenSSH、Linux PAM、shadow、iSula容器等软件包。该镜像适合进行更加丰富的功能探索。 + +运行镜像 +*********** + +通过运行镜像,一方面您可以体验openEuler Embedded的功能,一方面也可以完成基本的嵌入式Linux开发。 + +.. note:: + + - 建议使用QEMU5.0以上版本运行镜像,由于一些额外功能(网络、共享文件系统)需要依赖QEMU的virtio-net, virtio-fs等特性,如未在QEMU中使能,则运行时可能会产生错误,此时可能需要从源码重新编译QEMU。 + + - 运行镜像时,建议把内核镜像和根文件系统镜像放在同一目录下,后续说明以标准根文件系统为例(initrd)。 + + +极简运行场景 +============== + +该场景下,qemu未使能网络和共享文件系统,适合快速的功能体验。 + +针对arm(ARM Cortex A15),运行如下命令: + +.. code-block:: console + + qemu-system-arm -M virt-4.0 -cpu cortex-a15 -nographic -kernel zImage -initrd initrd + +针对aarch64(ARM Cortex A57),运行如下命令: + +.. code-block:: console + + qemu-system-aarch64 -M virt-4.0 -cpu cortex-a57 -nographic -kernel zImage -initrd initrd + + +由于标准根文件系统镜像进行了安全加固,因此第一次启动时,需要为登录用户名root设置密码,且密码强度有相应要求, 需要数字、字母、特殊字符组合最少8位,例如openEuler@2021。当使用极简根文件系统镜像时,系统会自动登录, 无需输入用户名和密码。 + +qemu运行成功并登录后,将会呈现openEuler Embedded的Shell。 + +使能共享文件系统场景 +========================== + +通过共享文件系统,可以使得运行qemu仿真器的宿主机和openEuler Embedded共享文件,这样在宿主机上交叉编译的程序,拷贝到共享目录中,即可在openEuler Embedded上运行。 + +假设将宿主机的/tmp目录作为共享目录,并事先在其中创建了名为hello_openeuler.txt的文件,使能共享文件系统功能的操作指导如下: + +1. **启动qemu** + +针对arm(ARM Cortex A15),运行如下命令: + +.. code-block:: console + + qemu-system-arm -M virt-4.0 -cpu cortex-a15 -nographic -kernel zImage -initrd initrd -device virtio-9p-device,fsdev=fs1,mount_tag=host -fsdev local,security_model=passthrough,id=fs1,path=/tmp + +针对aarch64(ARM Cortex A57),运行如下命令: + +.. code-block:: console + + qemu-system-aarch64 -M virt-4.0 -cpu cortex-a57 -nographic -kernel zImage -initrd initrd -device virtio-9p-device,fsdev=fs1,mount_tag=host -fsdev local,security_model=passthrough,id=fs1,path=/tmp + + +2. **映射文件系统** + +在openEuler Embedded启动并登录之后,需要运行如下命令,映射(mount)共享文件系统 + +.. code-block:: console + + cd /tmp + mkdir host + mount -t 9p -o trans=virtio,version=9p2000.L host /tmp/host + +即把共享文件系统映射到openEuler Embedded的/tmp/host目录下。 + +3. **检查共享是否成功** + +在openEuler Embedded中,运行如下命令: + +.. code-block:: console + + cd /tmp/host + ls + +如能发现hello_openeuler.txt,则共享成功。 + +使能网络场景 +=============== + +通过qemu的virtio-net和宿主机上的虚拟网卡,可以实现宿主机和openEuler embedded之间的网络通信。 + +1. **启动qemu** + +针对arm(ARM Cortex A15),运行如下命令: + +.. code-block:: console + + qemu-system-arm -M virt-4.0 -cpu cortex-a15 -nographic -kernel zImage -initrd initrd -device virtio-net-device,netdev=tap0 -netdev tap,id=tap0,script=/etc/qemu-ifup + +针对aarch64(ARM Cortex A57),运行如下命令: + +.. code-block:: console + + qemu-system-aarch64 -M virt-4.0 -cpu cortex-a57 -nographic -kernel zImage -initrd initrd -device virtio-net-device,netdev=tap0 -netdev tap,id=tap0,script=/etc/qemu-ifup + +2. **宿主上建立虚拟网卡** + +在宿主机上需要建立名为tap0的虚拟网卡,可以借助/etc/qemu-ifup脚本实现,其执行需要root权限,具体内容如下: + +.. code-block:: console + + #!/bin/bash + ifconfig $1 192.168.10.1 up + +通过qemu-ifup脚本,宿主机上将创建名为tap0的虚拟网卡,地址为192.168.10.1。 + +3. **配置openEuler embedded网卡** + +openEuler Embedded登陆后,执行如下命令: + +.. code-block:: console + + ifconfig eth0 192.168.10.2 + + +4. **确认网络连通** + +在openEuler Embedded中,执行如下命令: + +.. code-block:: console + + ping 192.168.10.1 + +如能ping通,则宿主机和openEuler Embedded之间的网络是连通的。 + +.. note:: + + 如需openEuler embedded借助宿主机访问互联网,则需要在宿主机上建立网桥,此处不详述,如有需要,请自行查阅相关资料。 + + + +基于openEuler embedded的用户态应用开发 +******************************************** + +当前发布的镜像除了体验openEuler Embedded的基本功能外,还可以进行基本的用户态应用开发,也即在openEuler embedded上运行用户自己的程序。 + + +1. **环境准备** + +由于当前镜像采用了linaro arm/aarch64 gcc 7.3.1工具链构建,因此建议应用开发也使用相同的工具链接进行,可以从如下链接中获取相应工具链: + +- `linaro arm `_ +- `linrao arm sysroot `_ +- `linaro aarch64 `_ +- `linrao aarch64 sysroot `_ + +下载并解压到指定的目录中,例如/opt/openEuler_toolchain。 + +2. **创建并编译用户态程序** + +以构建一个hello openEuler程序为例,运行在aarch64的标准根文件系统镜像中。 + +在宿主机中,创建一个hello.c文件,源码如下: + +.. code-block:: c + + #include + + int main(void) + { + printf("hello openEuler\r\n"); + } + +然后在宿主机上使用对应的工具链编译, 相应命令如下: + +.. code-block:: console + + export PATH=$PATH:/opt/openEuler_toolchain/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin + aarch64-linux-gnu-gcc --sysroot= hello.c -o hello + mv hello /temp + +把交叉编译好的hello程序拷贝到/tmp目录下,然后参照使能共享文件系统中的描述,使得openEuler embedded可以访问宿主机的目录。 + +3. **运行用户态程序** + +在openEuler embedded中运行hello程序。 + +.. code-block:: console + + cd /tmp/host + ./hello + +如运行成功,openEuler Embedded的shell中就会输出hello openEuler。 diff --git a/docs/source/index.rst b/docs/source/index.rst index 1b4432eea7d..e95546675f7 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,40 +3,24 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -=========================================== + openeuler embedded yocto原理介绍及使用指导 =========================================== -1.Openeuler yocto 基础框架 -===================================== -https://docs.yoctoproject.org/overview-manual/yp-intro.html# - -1.1 yocto是什么 ------------------- -https://docs.yoctoproject.org/overview-manual/yp-intro.html#what-is-the-yocto-project -https://docs.yoctoproject.org/overview-manual/yp-intro.html#the-yocto-project-layer-model - - -1.2 主要组件和工具 ------------------- -https://docs.yoctoproject.org/overview-manual/yp-intro.html#components-and-tools -https://docs.yoctoproject.org/overview-manual/yp-intro.html#the-openembedded-build-system-workflow -https://docs.yoctoproject.org/overview-manual/concepts.html - -1.2.1 bitbake -^^^^^^^^^^^^^^^^ - -1.2.2 oe-core -^^^^^^^^^^^^^^^^ -1.2.3 Poky -^^^^^^^^^^^^^^^^ -https://docs.yoctoproject.org/overview-manual/yp-intro.html#reference-embedded-distribution-poky -1.2.4 opkg -^^^^^^^^^^^^^^^^ +章节 +***** +.. toctree:: + :maxdepth: 1 + :caption: 内容 + introduction/index.rst + getting_started/index.rst + features/index.rst + yocto/index.rst + releases/index.rst -Indices and tables -================== +索引与表格 +*********** diff --git a/docs/source/introduction/index.rst b/docs/source/introduction/index.rst new file mode 100644 index 00000000000..b49a79b7861 --- /dev/null +++ b/docs/source/introduction/index.rst @@ -0,0 +1,10 @@ +.. _introducing_openeuler_embedded: + + +介绍 +##### + + + +主要特点 +********** \ No newline at end of file diff --git a/docs/source/releases/index.rst b/docs/source/releases/index.rst new file mode 100644 index 00000000000..0b6da249778 --- /dev/null +++ b/docs/source/releases/index.rst @@ -0,0 +1,12 @@ +.. _release_notes: + +版本说明 +######### + + +.. toctree:: + :maxdepth: 1 + :glob: + :reversed: + + release-notes-* diff --git a/docs/source/releases/release-notes-21.09.30.rst b/docs/source/releases/release-notes-21.09.30.rst new file mode 100644 index 00000000000..b0aa9826cbb --- /dev/null +++ b/docs/source/releases/release-notes-21.09.30.rst @@ -0,0 +1,9 @@ +:orphan: + +.. _openeuler_embedded_21_09_30: + +openEuler embedded 21.09.30 +########################### + +openEuler embedded 21.09.30的主要特性包括: + diff --git a/docs/source/releases/release-notes-22.03.30.rst b/docs/source/releases/release-notes-22.03.30.rst new file mode 100644 index 00000000000..4387d4e67e9 --- /dev/null +++ b/docs/source/releases/release-notes-22.03.30.rst @@ -0,0 +1,9 @@ +:orphan: + +.. _openeuler_embedded_22_03_30: + +openEuler embedded 22.03.30 +########################### + +openEuler embedded 22.03.30的主要特性包括: + diff --git a/docs/source/yocto/index.rst b/docs/source/yocto/index.rst new file mode 100644 index 00000000000..3153929042b --- /dev/null +++ b/docs/source/yocto/index.rst @@ -0,0 +1,30 @@ +.. _yocto: + +Openeuler yocto 基础框架 +################################ +https://docs.yoctoproject.org/overview-manual/yp-intro.html# + +1.1 yocto是什么 +******************* + +https://docs.yoctoproject.org/overview-manual/yp-intro.html#what-is-the-yocto-project +https://docs.yoctoproject.org/overview-manual/yp-intro.html#the-yocto-project-layer-model + + +1.2 主要组件和工具 +******************** + + +https://docs.yoctoproject.org/overview-manual/yp-intro.html#components-and-tools +https://docs.yoctoproject.org/overview-manual/yp-intro.html#the-openembedded-build-system-workflow +https://docs.yoctoproject.org/overview-manual/concepts.html + +1.2.1 bitbake +^^^^^^^^^^^^^^^^ + +1.2.2 oe-core +^^^^^^^^^^^^^^^^ + +1.2.3 Poky +^^^^^^^^^^^^^^^^ +https://docs.yoctoproject.org/overview-manual/yp-intro.html#reference-embedded-distribution-poky \ No newline at end of file -- Gitee From e819f76abe8175baabededa4ab041346a0ebaadf Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 4 Jan 2022 15:26:25 +0800 Subject: [PATCH 121/304] set rpm package arch to fix dnf package check problem in do_rootfs Signed-off-by: lisimin --- meta-openeuler/conf/machine/qemu-aarch64.conf | 2 ++ meta-openeuler/conf/machine/qemu-arm.conf | 1 + 2 files changed, 3 insertions(+) diff --git a/meta-openeuler/conf/machine/qemu-aarch64.conf b/meta-openeuler/conf/machine/qemu-aarch64.conf index 521706cb1d8..742c3d700af 100644 --- a/meta-openeuler/conf/machine/qemu-aarch64.conf +++ b/meta-openeuler/conf/machine/qemu-aarch64.conf @@ -16,3 +16,5 @@ require conf/multilib.conf MULTILIB += "multilib:lib32" MULTILIB += "multilib:ilp32" DEFAULTTUNE_virtclass-multilib-ilp32 =. "aarch64_ilp32:" +export ROOTFS_PACKAGE_ARCH = "aarch64" +export ROOTFS_PACKAGE_ARCH_virtclass-multilib-lib32 = "armv7l" diff --git a/meta-openeuler/conf/machine/qemu-arm.conf b/meta-openeuler/conf/machine/qemu-arm.conf index 01c0924d880..0b66963006d 100644 --- a/meta-openeuler/conf/machine/qemu-arm.conf +++ b/meta-openeuler/conf/machine/qemu-arm.conf @@ -5,3 +5,4 @@ DEFAULTTUNE = "armv7a" require conf/machine/qemu-arm-common.inc TUNE_CCARGS .= " -mlittle-endian" +export ROOTFS_PACKAGE_ARCH = "armv7l" -- Gitee From 314c6a75e7190a03f00b459579229a35c2671a52 Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 4 Jan 2022 15:27:41 +0800 Subject: [PATCH 122/304] add createrepo_c dnf ldconfig to HOSTTOOS for do_rootfs Signed-off-by: lisimin --- meta-openeuler/conf/local.conf.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index 087491cd0e6..d045f334141 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -271,7 +271,7 @@ BB_DISKMON_DIRS ??= "\ # track the version of this file when it was generated. This can safely be ignored if # this doesn't mean anything to you. CONF_VERSION = "2" -HOSTTOOLS += "python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader autoupdate libtool libtoolize pkg-config cmake fmt gperf m4" +HOSTTOOLS += "python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader autoupdate libtool libtoolize pkg-config cmake fmt gperf m4 createrepo_c dnf ldconfig" HOSTTOOLS_remove += "diffstat lz4c pzstd rpcgen" SANITY_REQUIRED_UTILITIES_remove += "diffstat chrpath" CONNECTIVITY_CHECK_URIS = "" -- Gitee From 4722ae74abed56b0f1491199f61165630c7b9d6b Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 4 Jan 2022 16:00:52 +0800 Subject: [PATCH 123/304] create directory before touch file under it to fix touch error Signed-off-by: lisimin --- meta-openeuler/recipes-labtools/bash/bash.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-openeuler/recipes-labtools/bash/bash.inc b/meta-openeuler/recipes-labtools/bash/bash.inc index 64f82c4a897..c3f31483501 100644 --- a/meta-openeuler/recipes-labtools/bash/bash.inc +++ b/meta-openeuler/recipes-labtools/bash/bash.inc @@ -50,6 +50,7 @@ do_install_ptest () { } pkg_postinst_${PN} () { + mkdir -p $D${sysconfdir}/ || echo "" touch $D${sysconfdir}/shells grep -q "bin/bash" $D${sysconfdir}/shells || echo /bin/bash >> $D${sysconfdir}/shells grep -q "bin/sh" $D${sysconfdir}/shells || echo /bin/sh >> $D${sysconfdir}/shells -- Gitee From 0b5c3e014bf522e87aefa5fd6a76e45a450afd2d Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 4 Jan 2022 16:02:05 +0800 Subject: [PATCH 124/304] start sshd at startup, add it to rc.local Signed-off-by: lisimin --- meta-openeuler/recipes-core/os-base/os-base/rc.local | 2 ++ 1 file changed, 2 insertions(+) diff --git a/meta-openeuler/recipes-core/os-base/os-base/rc.local b/meta-openeuler/recipes-core/os-base/os-base/rc.local index 6bea6a95f54..b014990f5eb 100644 --- a/meta-openeuler/recipes-core/os-base/os-base/rc.local +++ b/meta-openeuler/recipes-core/os-base/os-base/rc.local @@ -6,3 +6,5 @@ chmod 640 /var/log/* chmod 640 /dev/mem chmod 600 /var/log/audit/audit.log + +. /etc/init.d/sshd start 1>/dev/null 2>&1 & -- Gitee From 05551b7e2c4e0f209e000638f13a6a8bbe3438e9 Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 4 Jan 2022 16:06:21 +0800 Subject: [PATCH 125/304] delete useless pkg_postinst_${PN} for shadow Signed-off-by: lisimin --- meta-openeuler/recipes-core/shadow/shadow.inc | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/meta-openeuler/recipes-core/shadow/shadow.inc b/meta-openeuler/recipes-core/shadow/shadow.inc index 86bb18f4c19..a003cde1fe3 100644 --- a/meta-openeuler/recipes-core/shadow/shadow.inc +++ b/meta-openeuler/recipes-core/shadow/shadow.inc @@ -186,13 +186,3 @@ FILES_${PN}-base = "\ RDEPENDS_${PN} += "${PN}-base" PACKAGE_WRITE_DEPS += "shadow-native" -pkg_postinst_${PN}_class-target () { - if [ "x$D" != "x" ]; then - rootarg="--root $D" - else - rootarg="" - fi - - pwconv $rootarg || exit 1 - grpconv $rootarg || exit 1 -} -- Gitee From 97c0517993f2855c0e1ef9b6c51d8fbadb6411be Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Tue, 4 Jan 2022 17:02:21 +0800 Subject: [PATCH 126/304] doc: update contents in index.rst update the contents in index.rst Signed-off-by: Wayne Ren --- docs/source/index.rst | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index e95546675f7..6b8d2d3a935 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -4,9 +4,14 @@ contain the root `toctree` directive. -openeuler embedded yocto原理介绍及使用指导 +openEuler Embedded 使用手册 =========================================== +openEuler Embedded是基于openEuler社区面向嵌入式场景的Linux版本,旨在成为一个高质量的嵌入式Linux。 +openEUler Embedded在内核版本、软件包版本等代码层面会与openEuler其他场景的Linux保持一致,共同演进,不同之处 +在于针对嵌入场景的内核配置、软件包的组合与配置、代码特性补丁的不同。 + +本手册包含了openEuler Embedded如何使用、如何构建,如何开发相关内容。 章节 -- Gitee From a28ab3471c73caf9279f165b460a2e06f9f5ce84 Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 4 Jan 2022 17:20:35 +0800 Subject: [PATCH 127/304] add needed directory and files for startup to os-base Signed-off-by: lisimin --- meta-openeuler/recipes-core/os-base/os-base_1.0.bb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb index f181ba1522e..bfd77f44809 100644 --- a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb +++ b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb @@ -44,6 +44,11 @@ do_install() { cp ${WORKDIR}/rc.local ${D}/etc/rc.d install -m 0755 -d ${D}/etc/init.d/ install -m 0750 ${WORKDIR}/rcS ${D}/etc/init.d/ + mkdir -p ${D}/var/log/ + touch ${D}/var/log/messages ${D}/var/log/lastlog + mkdir -p ${D}/var/run/faillock ${D}/tmp + mkdir -p ${D}/proc ${D}/sys ${D}/root ${D}/dev ${D}/sys/fs/cgroup + mkdir -p ${D}/var/log/audit ${D}/var/run/sshd } FILES_${PN} = "/" -- Gitee From 5bc28c0538057d060647374a6fb5dab9b653ed4b Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 4 Jan 2022 17:29:57 +0800 Subject: [PATCH 128/304] run do_rootfs from yocto Signed-off-by: lisimin --- .../recipes-core/images/openeuler-image.bb | 123 ++++++++++++++---- 1 file changed, 101 insertions(+), 22 deletions(-) diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 64869fec59a..1e5c1edff8c 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -10,6 +10,8 @@ LICENSE = "MIT" inherit core-image IMAGE_TYPES = "cpio" IMAGE_FSTYPES_DEBUGFS = "cpio" +#not add run-postinsts to PACKAGE_INSTALL, so that not fail when do_rootfs?? +ROOTFS_BOOTSTRAP_INSTALL = "" #tar:lower version has no --sort=name IMAGE_CMD_tar = "${IMAGE_CMD_TAR} --format=posix --numeric-owner -cf ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.tar -C ${IMAGE_ROOTFS} . || [ $? -eq 1 ]" #not depends to update-alternatives @@ -24,35 +26,112 @@ TOOLCHAIN_TARGET_TASK_remove += "${@multilib_pkg_extend(d, 'packagegroup-core-st #IMAGE_ROOTFS_SIZE ?= "8192" #IMAGE_ROOTFS_EXTRA_SPACE_append = "${@bb.utils.contains("DISTRO_FEATURES", "systemd", " + 4096", "", d)}" -#do_package depends to command zstd -python do_package() { - bb.note("do nothing"); -} TOOLCHAIN_HOST_TASK_task-populate-sdk-ext = "" TOOLCHAIN_HOST_TASK = "" -#do_rootfs depends to command createrepo_c, so create an empty rootfs for do_image_tar -python do_rootfs() { - bb.note("do nothing"); -} -python do_image() { - bb.note("depends to do_rootfs"); - workdir = d.getVar("WORKDIR") - rootfs = os.path.join(workdir, "rootfs") - if not os.path.exists(rootfs): - os.makedirs(rootfs) +OUTPUT_DIR = "${TOPDIR}/output" +HOSTNAME = "openeuler" + +fakeroot do_openeuler_initrd() { + test -d "${OUTPUT_DIR}" || mkdir -p "${OUTPUT_DIR}" + local rootfs_dir="${WORKDIR}/rootfs_tmp" + test -d "${rootfs_dir}" && rm -r "${rootfs_dir}" + cp -a "${WORKDIR}/rootfs" "${rootfs_dir}" + pushd "${rootfs_dir}" + local imagename=$(ls boot/*Image-* | xargs basename) + rm -f "${OUTPUT_DIR}"/*Image "${OUTPUT_DIR}"/initrd + mv boot/${imagename} "${OUTPUT_DIR}"/$(echo ${imagename} | cut -d "-" -f 1) + echo "${HOSTNAME}" > etc/hostname + chmod +x etc/rc.d/* + touch etc/security/opasswd + chmod 600 etc/security/opasswd + rm -r ./boot + chown -R root:root ./* + find . | cpio -H newc -o | gzip -c > "${OUTPUT_DIR}"/initrd + popd } +addtask do_openeuler_initrd after do_image_complete before do_build -IMAGE_INSTALL += " \ -bash \ +#No kernel-abiversion file found, cannot run depmod, aborting +USE_DEPMOD = "0" + +ROOTFS_BOOTSTRAP_INSTALL = " \ +busybox-linuxrc \ +kernel \ busybox \ -linux-openeuler \ os-base \ -zlib \ -libcap-ng \ -cracklib \ -libpam \ +glibc \ +" + +IMAGE_INSTALL_normal = " \ audit \ +auditd \ +audispd-plugins \ +cracklib \ libpwquality \ +libpam \ +openssh-ssh \ +openssh-sshd \ +openssh-scp \ shadow \ -openssh \ +shadow-securetty \ +bash \ +pam-plugin-access \ +pam-plugin-debug \ +pam-plugin-deny \ +pam-plugin-echo \ +pam-plugin-env \ +pam-plugin-exec \ +pam-plugin-faildelay \ +pam-plugin-faillock \ +pam-plugin-filter \ +pam-plugin-ftp \ +pam-plugin-group \ +pam-plugin-issue \ +pam-plugin-keyinit \ +pam-plugin-lastlog \ +pam-plugin-limits \ +pam-plugin-listfile \ +pam-plugin-localuser \ +pam-plugin-loginuid \ +pam-plugin-mail \ +pam-plugin-mkhomedir \ +pam-plugin-motd \ +pam-plugin-namespace \ +pam-plugin-nologin \ +pam-plugin-permit \ +pam-plugin-pwhistory \ +pam-plugin-rhosts \ +pam-plugin-rootok \ +pam-plugin-securetty \ +pam-plugin-setquota \ +pam-plugin-shells \ +pam-plugin-stress \ +pam-plugin-succeed-if \ +pam-plugin-time \ +pam-plugin-timestamp \ +pam-plugin-umask \ +pam-plugin-unix \ +pam-plugin-usertype \ +pam-plugin-warn \ +pam-plugin-wheel \ +pam-plugin-xauth \ " +IMAGE_INSTALL_normal_append_arm += "kernel-module-unix" + +IMAGE_INSTALL_pro = " \ +${IMAGE_INSTALL_normal} \ +libseccomp \ +libwebsockets \ +yajl \ +lcr \ +lxc \ +libevhtp \ +libarchive \ +libevent \ +iSulad \ +kernel-module-overlay-5.10.0 \ +" + +IMAGE_INSTALL += "${ROOTFS_BOOTSTRAP_INSTALL} ${IMAGE_INSTALL_normal} ${IMAGE_INSTALL_pro}" + +DISTRO_FEATURES += "glibc" -- Gitee From 36422518d65d4c8598ca98c07d713ec7e5ba0c7c Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 4 Jan 2022 17:30:39 +0800 Subject: [PATCH 129/304] delete "/arch=b64/" in /etc/audit/audit.rules for arm Signed-off-by: lisimin --- meta-openeuler/recipes-core/audit/audit_3.0.bb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/meta-openeuler/recipes-core/audit/audit_3.0.bb b/meta-openeuler/recipes-core/audit/audit_3.0.bb index 01235508283..29b26c5e9de 100644 --- a/meta-openeuler/recipes-core/audit/audit_3.0.bb +++ b/meta-openeuler/recipes-core/audit/audit_3.0.bb @@ -101,3 +101,7 @@ do_install_append() { cp ${D}/etc/audit/rules.d/audit.rules ${D}/etc/audit/audit.rules rm -rf ${D}/lib/pkgconfig } + +do_install_append_arm() { + sed -i "/arch=b64/d" ${D}/etc/audit/audit.rules +} -- Gitee From 0bb9a90c7f12f42985a428255abcbd77eb4cb6d2 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Thu, 6 Jan 2022 14:50:04 +0800 Subject: [PATCH 130/304] libwebsockets: fix compile errors caused by wrong cmake options empty space is not allowed after cmake's -D option,i.e., "-D xxx" should be "-Dxxx" Signed-off-by: Wayne Ren --- .../libwebsockets/libwebsockets_4.0.20.bb | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb b/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb index db07b86cff4..6528b0dc351 100644 --- a/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb +++ b/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb @@ -13,18 +13,18 @@ inherit cmake DEPENDS = "zlib openssl" -EXTRA_OECMAKE = "-D LWS_WITH_HTTP2=ON -D LWS_IPV6=ON -D LWS_WITH_ZIP_FOPS=ON -D LWS_WITH_SOCKS5=ON -D LWS_WITH_RANGES=ON -D LWS_WITH_ACME=ON \ - -D LWS_WITH_LIBUV=OFF -D LWS_WITH_LIBEV=OFF -D LWS_WITH_LIBEVENT=OFF -D LWS_WITH_FTS=ON -D LWS_WITH_THREADPOOL=ON -D LWS_UNIX_SOCK=ON \ - -D LWS_WITH_HTTP_PROXY=ON -D LWS_WITH_DISKCACHE=ON -D LWS_WITH_LWSAC=ON -D LWS_LINK_TESTAPPS_DYNAMIC=ON -D LWS_WITHOUT_BUILTIN_GETIFADDRS=ON -D LWS_USE_BUNDLED_ZLIB=OFF \ - -D LWS_WITHOUT_BUILTIN_SHA1=ON \ - -D LWS_WITH_STATIC=OFF \ - -D LWS_WITHOUT_CLIENT=OFF \ - -D LWS_WITHOUT_SERVER=OFF \ - -D LWS_WITHOUT_TESTAPPS=OFF \ - -D LWS_WITHOUT_TEST_SERVER=ON \ - -D LWS_WITHOUT_TEST_SERVER_EXTPOLL=ON \ - -D LWS_WITHOUT_TEST_PING=ON \ - -D LWS_WITHOUT_TEST_CLIENT=ON \ +EXTRA_OECMAKE = "-DLWS_WITH_HTTP2=ON -DLWS_IPV6=ON -DLWS_WITH_ZIP_FOPS=ON -DLWS_WITH_SOCKS5=ON -DLWS_WITH_RANGES=ON -DLWS_WITH_ACME=ON \ + -DLWS_WITH_LIBUV=OFF -DLWS_WITH_LIBEV=OFF -DLWS_WITH_LIBEVENT=OFF -DLWS_WITH_FTS=ON -DLWS_WITH_THREADPOOL=ON -DLWS_UNIX_SOCK=ON \ + -DLWS_WITH_HTTP_PROXY=ON -DLWS_WITH_DISKCACHE=ON -DLWS_WITH_LWSAC=ON -DLWS_LINK_TESTAPPS_DYNAMIC=ON -DLWS_WITHOUT_BUILTIN_GETIFADDRS=ON -DLWS_USE_BUNDLED_ZLIB=OFF \ + -DLWS_WITHOUT_BUILTIN_SHA1=ON \ + -DLWS_WITH_STATIC=OFF \ + -DLWS_WITHOUT_CLIENT=OFF \ + -DLWS_WITHOUT_SERVER=OFF \ + -DLWS_WITHOUT_TESTAPPS=OFF \ + -DLWS_WITHOUT_TEST_SERVER=ON \ + -DLWS_WITHOUT_TEST_SERVER_EXTPOLL=ON \ + -DLWS_WITHOUT_TEST_PING=ON \ + -DLWS_WITHOUT_TEST_CLIENT=ON \ " INHIBIT_PACKAGE_DEBUG_SPLIT = "1" -- Gitee From 40bf248f8be3af8f0611c32cbc4c36688fb79953 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Thu, 6 Jan 2022 21:18:53 +0800 Subject: [PATCH 131/304] openeuler-image: add missed busybox-login package add missed busybox-login package without it, /bin/login is missed Signed-off-by: Wayne Ren --- meta-openeuler/recipes-core/images/openeuler-image.bb | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 1e5c1edff8c..408fa7790c7 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -66,6 +66,7 @@ IMAGE_INSTALL_normal = " \ audit \ auditd \ audispd-plugins \ +busybox-login \ cracklib \ libpwquality \ libpam \ -- Gitee From 5cb2fcb31ed8150c00965ecac9e57d69bf209810 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Mon, 10 Jan 2022 16:55:53 +0800 Subject: [PATCH 132/304] linux-openeuler: add version and correct description * current linux openeuler version: 5.10 * correct the kernel description Signed-off-by: Wayne Ren --- meta-openeuler/recipes-kernel/linux/linux-openeuler.bb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb index 3db25d12379..9d01d839f24 100644 --- a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb +++ b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb @@ -1,7 +1,6 @@ -SUMMARY = "Dummy Linux kernel" -DESCRIPTION = "Dummy Linux kernel, to be selected as the preferred \ -provider for virtual/kernel to satisfy dependencies for situations \ -where you wish to build the kernel externally from the build system." +SUMMARY = "openEuler Linux kernel" +DESCRIPTION = "openEuler Embedded shares the same linux kernel with other \ + openEuler linux distribution" SECTION = "kernel" LICENSE = "GPLv2" @@ -59,6 +58,7 @@ inherit kernel-devicetree COMPATIBLE_HOST = ".*-linux" +PV = "5.10" PR = "r1" SRC_URI = "file://kernel-5.10 \ -- Gitee From c3af99216dc247f1425e3bf08ad6a9e7f4a51b80 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Mon, 10 Jan 2022 17:00:20 +0800 Subject: [PATCH 133/304] openeuler distro: clean up openeuler distro conf * clean up the openeuler distro configuration Signed-off-by: Wayne Ren --- meta-openeuler/conf/distro/openeuler.conf | 33 ++++++++++------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/meta-openeuler/conf/distro/openeuler.conf b/meta-openeuler/conf/distro/openeuler.conf index 51820d338e0..93b84711aee 100644 --- a/meta-openeuler/conf/distro/openeuler.conf +++ b/meta-openeuler/conf/distro/openeuler.conf @@ -1,37 +1,38 @@ DISTRO = "openeuler" -DISTRO_NAME = "Openeuler (Openeuler Project Reference Distro)" -DISTRO_VERSION = "1.0+snapshot-${METADATA_REVISION}" -DISTRO_CODENAME = "master" +DISTRO_NAME = "openEuler embedded(openEuler Embedded Reference Distro)" +DISTRO_VERSION = "21.09.30" +DISTRO_CODENAME = "openEuler21_09_30" SDK_VENDOR = "-openeulersdk" SDK_VERSION = "${@d.getVar('DISTRO_VERSION').replace('snapshot-${METADATA_REVISION}', 'snapshot')}" SDK_VERSION[vardepvalue] = "${SDK_VERSION}" -MAINTAINER = "lisimin " +MAINTAINER = "openEuler " TARGET_VENDOR = "-openeuler" LOCALCONF_VERSION = "2" -# Override these in poky based distros -#OPENEULER_DEFAULT_DISTRO_FEATURES = "largefile opengl ptest multiarch wayland vulkan" +# Override these in openeuler embedded based distros +#OPENEULER_DEFAULT_DISTRO_FEATURES = "" OPENEULER_DEFAULT_DISTRO_FEATURES = "pam" #OPENEULER_DEFAULT_EXTRA_RDEPENDS = "packagegroup-core-boot" #OPENEULER_DEFAULT_EXTRA_RRECOMMENDS = "kernel-module-af-packet" DISTRO_FEATURES ?= "${DISTRO_FEATURES_DEFAULT} ${OPENEULER_DEFAULT_DISTRO_FEATURES}" -PREFERRED_VERSION_linux-yocto ?= "5.13%" -PREFERRED_VERSION_linux-yocto-rt ?= "5.13%" +PREFERRED_VERSION_linux-openeuler ?= "5.10%" SDK_NAME = "${DISTRO}-${TCLIBC}-${SDKMACHINE}-${IMAGE_BASENAME}-${TUNE_PKGARCH}-${MACHINE}" SDKPATHINSTALL = "/opt/${DISTRO}/${SDK_VERSION}" -DISTRO_EXTRA_RDEPENDS += "${POKY_DEFAULT_EXTRA_RDEPENDS}" -DISTRO_EXTRA_RRECOMMENDS += "${POKY_DEFAULT_EXTRA_RRECOMMENDS}" +DISTRO_EXTRA_RDEPENDS += "${OPENEULER_DEFAULT_EXTRA_RDEPENDS}" +DISTRO_EXTRA_RRECOMMENDS += "${OPENEULER_DEFAULT_EXTRA_RRECOMMENDS}" TCLIBCAPPEND = "" TCLIBC = "glibc" +# currently, we have no sources mirror for openEuler, so use +# yocto mirror instead PREMIRRORS ??= "\ bzr://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ cvs://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ @@ -42,20 +43,12 @@ osc://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ p4://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ svn://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n" -#SANITY_TESTED_DISTROS = "" -# add poky sanity bbclass -#INHERIT += "poky-sanity" - # QA check settings - a little stricter than the OE-Core defaults # (none currently necessary as we now match OE-Core) #WARN_TO_ERROR_QA = "X" #WARN_QA_remove = "${WARN_TO_ERROR_QA}" #ERROR_QA_append = " ${WARN_TO_ERROR_QA}" -#require conf/distro/include/poky-world-exclude.inc -#require conf/distro/include/no-static-libs.inc -#require conf/distro/include/yocto-uninative.inc -#require conf/distro/include/security_flags.inc INHERIT += "uninative" INHERIT += "reproducible_build" @@ -72,10 +65,12 @@ PREFERRED_PROVIDER_virtual/kernel = "linux-openeuler" LOCAL_SRC_DIR = "${BPN}" INHIBIT_PACKAGE_DEBUG_SPLIT = "1" -DEPENDS_remove += "cmake-native ninja-native" #DL_DIR = "${LOCAL_FILES}" DL_DIR = "downloads" + export RPMDEPS = "default" INHERIT += "get_dl_dir get_rpmdeps" + +#disable the file checksum of fetch do_fetch[file-checksums] = "" SDK_INCLUDE_BUILDTOOLS = "0" -- Gitee From df521be908856be26b2a84263e86a2bd53cd10d6 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Mon, 10 Jan 2022 17:18:28 +0800 Subject: [PATCH 134/304] conf: clean up local sample * clean up HOSTOOLS and ASSUME_PROVIDED for better readability * use LOCAL_FILES as PREFERRED_MIRROS Signed-off-by: Wayne Ren --- meta-openeuler/conf/local.conf.sample | 34 +++++++++++++++++---------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index d045f334141..0f80e1ff0c2 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -271,27 +271,35 @@ BB_DISKMON_DIRS ??= "\ # track the version of this file when it was generated. This can safely be ignored if # this doesn't mean anything to you. CONF_VERSION = "2" -HOSTTOOLS += "python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader autoupdate libtool libtoolize pkg-config cmake fmt gperf m4 createrepo_c dnf ldconfig" +HOSTTOOLS += "python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool \ + ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader \ + autoupdate libtool libtoolize pkg-config cmake fmt gperf m4 createrepo_c dnf ldconfig" HOSTTOOLS_remove += "diffstat lz4c pzstd rpcgen" SANITY_REQUIRED_UTILITIES_remove += "diffstat chrpath" CONNECTIVITY_CHECK_URIS = "" -#PREFERRED_VERSION_linux-yocto = "5.10%" -ASSUME_PROVIDED += "rpm-native dwarfsrcfiles-native depmodwrapper-cross kmod-native bc-native bison-native make-native gperf-native pigz-native pbzip2-native ldconfig-native xz-native makedevs-native alsa-lib-native perl-native qemu-native chrpath-native kern-tools-native gmp-native libsdl2-native mesa-native virglrenderer-native pixman-native texinfo-dummy-native python3-native python3-setuptools-native gettext-native m4-native flex-native unifdef-native rsync-native init-system-helpers automake-native autoconf-native libtool-native opkg-utils-native patch-native pkgconfig-native init-system-helpers update-rc.d-native initscripts run-postinsts" +ASSUME_PROVIDED += "rpm-native dwarfsrcfiles-native depmodwrapper-cross kmod-native bc-native \ + bison-native make-native gperf-native pigz-native pbzip2-native ldconfig-native \ + xz-native makedevs-native alsa-lib-native perl-native qemu-native chrpath-native \ + kern-tools-native gmp-native libsdl2-native mesa-native virglrenderer-native \ + pixman-native texinfo-dummy-native python3-native python3-setuptools-native gettext-native \ + m4-native flex-native unifdef-native rsync-native init-system-helpers automake-native \ + autoconf-native libtool-native opkg-utils-native patch-native pkgconfig-native \ + init-system-helpers update-rc.d-native initscripts run-postinsts cmake-native ninja-native" PATCHTOOL = "patch" TCMODE = "gcc-bin" INHERIT_remove += "uninative" PATCHDEPENDENCY_remove += "patch-replacement-native:do_populate_sysroot" PREMIRRORS = "\ -bzr://.*/.* file:////usr1/openeuler/src \n \ -cvs://.*/.* file:////usr1/openeuler/src \n \ -git://.*/.* file:////usr1/openeuler/src \n \ -hg://.*/.* file:////usr1/openeuler/src \n \ -osc://.*/.* file:////usr1/openeuler/src \n \ -p4://.*/.* file:////usr1/openeuler/src \n \ -svn://.*/.* file:////usr1/openeuler/src \n \ -ftp://.*/.* file:////usr1/openeuler/src \n \ -http://.*/.* file:////usr1/openeuler/src \n \ -https://.*/.* file:////usr1/openeuler/src \n" +bzr://.*/.* file:///${LOCAL_FILES} \n \ +cvs://.*/.* file:///${LOCAL_FILES} \n \ +git://.*/.* file:///${LOCAL_FILES} \n \ +hg://.*/.* file:///${LOCAL_FILES} \n \ +osc://.*/.* file:///${LOCAL_FILES} \n \ +p4://.*/.* file:///${LOCAL_FILES} \n \ +svn://.*/.* file:///${LOCAL_FILES} \n \ +ftp://.*/.* file:///${LOCAL_FILES} \n \ +http://.*/.* file:///${LOCAL_FILES} \n \ +https://.*/.* file:///${LOCAL_FILES} \n" #not add PR in workpath #PF = "${PN}-${EXTENDPE}${PV}" -- Gitee From ad814a0b97ffa3eaaac9621648de0c6d0f5a5908 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Tue, 4 Jan 2022 09:44:24 +0800 Subject: [PATCH 135/304] add recipe for libsepol Signed-off-by: lixiaoyong --- .../recipes-core/selinux/libsepol.inc | 16 ++++++++++ .../recipes-core/selinux/libsepol_3.3.bb | 6 ++++ .../recipes-core/selinux/selinux_common.inc | 30 +++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 meta-openeuler/recipes-core/selinux/libsepol.inc create mode 100644 meta-openeuler/recipes-core/selinux/libsepol_3.3.bb create mode 100644 meta-openeuler/recipes-core/selinux/selinux_common.inc diff --git a/meta-openeuler/recipes-core/selinux/libsepol.inc b/meta-openeuler/recipes-core/selinux/libsepol.inc new file mode 100644 index 00000000000..9601fae15b4 --- /dev/null +++ b/meta-openeuler/recipes-core/selinux/libsepol.inc @@ -0,0 +1,16 @@ +SUMMARY = "SELinux binary policy manipulation library" +DESCRIPTION = "libsepol provides an API for the manipulation of SELinux binary policies. \ +It is used by checkpolicy (the policy compiler) and similar tools, as well \ +as by programs like load_policy that need to perform specific transformations \ +on binary policies such as customizing policy boolean settings." +SECTION = "base" +LICENSE = "LGPLv2+" + +inherit lib_package + +# Change RANLIB for cross compiling, use host-tools $(AR) rather than +# local ranlib. +EXTRA_OEMAKE += "RANLIB='$(AR) s'" + +BBCLASSEXTEND = "native" +DEPENDS += "" diff --git a/meta-openeuler/recipes-core/selinux/libsepol_3.3.bb b/meta-openeuler/recipes-core/selinux/libsepol_3.3.bb new file mode 100644 index 00000000000..21c06a53148 --- /dev/null +++ b/meta-openeuler/recipes-core/selinux/libsepol_3.3.bb @@ -0,0 +1,6 @@ +require selinux_common.inc +require ${BPN}.inc +LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343" + +SRC_URI += "file://libsepol/${BP}.tar.gz" +CFLAGS += "${@bb.utils.contains('RTOS_KASAN', 'kasan', '-fcommon', '', d)}" diff --git a/meta-openeuler/recipes-core/selinux/selinux_common.inc b/meta-openeuler/recipes-core/selinux/selinux_common.inc new file mode 100644 index 00000000000..a94b9ab6b92 --- /dev/null +++ b/meta-openeuler/recipes-core/selinux/selinux_common.inc @@ -0,0 +1,30 @@ +HOMEPAGE = "https://github.com/SELinuxProject" + +# EXTRA_OEMAKE is typically: -e MAKEFLAGS= +# "MAKEFLAGS= " causes problems as ENV variables will not pass to subdirs, so +# we redefine EXTRA_OEMAKE here +EXTRA_OEMAKE = "-e" + +# Releases are now from the base of the full tree, necessitating our skipping +# through an extra level of directories. +S = "${WORKDIR}/${BPN}-${PV}" + +SELINUX_NAME = "selinux" + +COMPONENT = "selinux" + +do_compile() { + oe_runmake all \ + LIBDIR="${libdir}" +} + +do_install() { + oe_runmake install \ + DESTDIR="${D}" \ + PREFIX="${prefix}" \ + INCLUDEDIR="${includedir}" \ + LIBDIR="${libdir}" \ + SHLIBDIR="${base_libdir}" \ + INITDIR="/etc/init.d" + rm -rf ${D}${libdir}/golang +} -- Gitee From 6d66eabe8566b53d3320f75f4954ee82e9ccff42 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Wed, 5 Jan 2022 14:37:19 +0800 Subject: [PATCH 136/304] add recipe for libselinux Signed-off-by: lixiaoyong --- .../recipes-core/selinux/libselinux.inc | 22 +++++++++++++++++++ .../recipes-core/selinux/libselinux_3.3.bb | 8 +++++++ 2 files changed, 30 insertions(+) create mode 100644 meta-openeuler/recipes-core/selinux/libselinux.inc create mode 100644 meta-openeuler/recipes-core/selinux/libselinux_3.3.bb diff --git a/meta-openeuler/recipes-core/selinux/libselinux.inc b/meta-openeuler/recipes-core/selinux/libselinux.inc new file mode 100644 index 00000000000..189bd7e8d3e --- /dev/null +++ b/meta-openeuler/recipes-core/selinux/libselinux.inc @@ -0,0 +1,22 @@ +SUMMARY = "SELinux library and simple utilities" +DESCRIPTION = "libselinux provides an API for SELinux applications to get and set \ +process and file security contexts and to obtain security policy \ +decisions. Required for any applications that use the SELinux API." +SECTION = "base" +LICENSE = "PD" + +inherit lib_package + +DEPENDS += "libsepol libpcre" + +def get_policyconfigarch(d): + import re + target = d.getVar('TARGET_ARCH', True) + p = re.compile('i.86') + target = p.sub('i386',target) + return "ARCH=%s" % (target) +EXTRA_OEMAKE += "${@get_policyconfigarch(d)}" + +EXTRA_OEMAKE += "LDFLAGS='${LDFLAGS} -lpcre ' CFLAGS=' ${CFLAGS} -DNO_ANDROID_BACKEND'" + +BBCLASSEXTEND = "native" diff --git a/meta-openeuler/recipes-core/selinux/libselinux_3.3.bb b/meta-openeuler/recipes-core/selinux/libselinux_3.3.bb new file mode 100644 index 00000000000..49fd3cd2da8 --- /dev/null +++ b/meta-openeuler/recipes-core/selinux/libselinux_3.3.bb @@ -0,0 +1,8 @@ +require selinux_common.inc +require ${BPN}.inc + +LIC_FILES_CHKSUM = "file://LICENSE;md5=84b4d2c6ef954a2d4081e775a270d0d0" + +SRC_URI = "file://libselinux/libselinux-${PV}.tar.gz \ + file://libselinux/do-malloc-trim-after-load-policy.patch \ +" -- Gitee From 1ba95c0f00b93990e8bae8cee64178f9ecdc4625 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Wed, 5 Jan 2022 14:50:23 +0800 Subject: [PATCH 137/304] add recipe for libsemanage Signed-off-by: lixiaoyong --- .../recipes-core/selinux/libsemanage.inc | 25 +++++++++++++++++++ .../recipes-core/selinux/libsemanage_3.3.bb | 8 ++++++ 2 files changed, 33 insertions(+) create mode 100644 meta-openeuler/recipes-core/selinux/libsemanage.inc create mode 100644 meta-openeuler/recipes-core/selinux/libsemanage_3.3.bb diff --git a/meta-openeuler/recipes-core/selinux/libsemanage.inc b/meta-openeuler/recipes-core/selinux/libsemanage.inc new file mode 100644 index 00000000000..76ea9986596 --- /dev/null +++ b/meta-openeuler/recipes-core/selinux/libsemanage.inc @@ -0,0 +1,25 @@ +SUMMARY = "SELinux binary policy manipulation library" +DESCRIPTION = "libsemanage provides an API for the manipulation of SELinux binary policies. \ +It is used by checkpolicy (the policy compiler) and similar tools, as well \ +as by programs like load_policy that need to perform specific transformations \ +on binary policies such as customizing policy boolean settings." +SECTION = "base" +LICENSE = "LGPLv2.1+" + +inherit lib_package + +DEPENDS += "libsepol libselinux bzip2 bison-native" +DEPENDS_append_class-target += "audit" + +EXTRA_OEMAKE_class-native += "DISABLE_AUDIT=y" + +do_install() { + oe_runmake install \ + DESTDIR="${D}" \ + PREFIX="${prefix}" \ + INCLUDEDIR="${includedir}" \ + LIBDIR="${libdir}" \ + SHLIBDIR="${libdir}" +} + +BBCLASSEXTEND = "native" diff --git a/meta-openeuler/recipes-core/selinux/libsemanage_3.3.bb b/meta-openeuler/recipes-core/selinux/libsemanage_3.3.bb new file mode 100644 index 00000000000..6d3fd53b5e3 --- /dev/null +++ b/meta-openeuler/recipes-core/selinux/libsemanage_3.3.bb @@ -0,0 +1,8 @@ +require selinux_common.inc +require ${BPN}.inc + +LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343" + +SRC_URI = "file://libsemanage/libsemanage-${PV}.tar.gz \ + file://libsemanage/fix-test-failure-with-secilc.patch \ +" -- Gitee From 18342a91d771bb54327c2706157c52131ea735da Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 10 Jan 2022 19:50:58 +0800 Subject: [PATCH 138/304] modify local sample Signed-off-by: lixiaoyong --- meta-openeuler/conf/local.conf.sample | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index 0f80e1ff0c2..0c3f35558ad 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -273,7 +273,7 @@ BB_DISKMON_DIRS ??= "\ CONF_VERSION = "2" HOSTTOOLS += "python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool \ ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader \ - autoupdate libtool libtoolize pkg-config cmake fmt gperf m4 createrepo_c dnf ldconfig" + autoupdate libtool libtoolize pkg-config cmake fmt gperf m4 createrepo_c dnf ldconfig msgfmt" HOSTTOOLS_remove += "diffstat lz4c pzstd rpcgen" SANITY_REQUIRED_UTILITIES_remove += "diffstat chrpath" CONNECTIVITY_CHECK_URIS = "" @@ -284,7 +284,7 @@ ASSUME_PROVIDED += "rpm-native dwarfsrcfiles-native depmodwrapper-cross kmod-nat pixman-native texinfo-dummy-native python3-native python3-setuptools-native gettext-native \ m4-native flex-native unifdef-native rsync-native init-system-helpers automake-native \ autoconf-native libtool-native opkg-utils-native patch-native pkgconfig-native \ - init-system-helpers update-rc.d-native initscripts run-postinsts cmake-native ninja-native" + init-system-helpers update-rc.d-native run-postinsts cmake-native ninja-native" PATCHTOOL = "patch" TCMODE = "gcc-bin" INHERIT_remove += "uninative" -- Gitee From cd9d56b599496044664ba349cb5ffaa400f15e23 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 10 Jan 2022 19:53:24 +0800 Subject: [PATCH 139/304] add recipe for policycoreutils Signed-off-by: lixiaoyong --- meta-openeuler/classes/selinux.bbclass | 12 ++ .../recipes-core/selinux/policycoreutils.inc | 168 ++++++++++++++++++ .../selinux/policycoreutils_3.3.bb | 9 + 3 files changed, 189 insertions(+) create mode 100644 meta-openeuler/classes/selinux.bbclass create mode 100644 meta-openeuler/recipes-core/selinux/policycoreutils.inc create mode 100644 meta-openeuler/recipes-core/selinux/policycoreutils_3.3.bb diff --git a/meta-openeuler/classes/selinux.bbclass b/meta-openeuler/classes/selinux.bbclass new file mode 100644 index 00000000000..25009c891d1 --- /dev/null +++ b/meta-openeuler/classes/selinux.bbclass @@ -0,0 +1,12 @@ +def target_selinux(d, truevar = 'selinux', falsevar = ''): + if not bb.utils.contains("DISTRO_FEATURES", "selinux", True, False, d): + return falsevar + + pn = d.getVar("PN", True) + type = pn.replace(d.getVar("BPN", True), "") + if type in ("-native", "nativesdk-", "-cross", "-crosssdk"): + return falsevar + + return truevar + +LIBSELINUX = "${@target_selinux(d, 'libselinux')}" diff --git a/meta-openeuler/recipes-core/selinux/policycoreutils.inc b/meta-openeuler/recipes-core/selinux/policycoreutils.inc new file mode 100644 index 00000000000..29e91b5ea78 --- /dev/null +++ b/meta-openeuler/recipes-core/selinux/policycoreutils.inc @@ -0,0 +1,168 @@ +SUMMARY = "SELinux policy core utilities" +DESCRIPTION = "policycoreutils contains the policy core utilities that are required \ +for basic operation of a SELinux system. These utilities include \ +load_policy to load policies, setfiles to label filesystems, newrole \ +to switch roles, and run_init to run /etc/init.d scripts in the proper \ +context." +SECTION = "base" +LICENSE = "GPLv2+" + +DEPENDS += "libsepol libselinux libsemanage libcap gettext-native" +EXTRA_DEPENDS = "libcap-ng" +DEPENDS += "${@['', '${EXTRA_DEPENDS}']['${PN}' != '${BPN}-native']}" + +inherit selinux +DEPENDS += "${@target_selinux(d, 'audit')}" + +RDEPENDS_${BPN}-fixfiles += "\ + ${BPN}-setfiles \ +" +RDEPENDS_${BPN}-genhomedircon += "\ + ${BPN}-semodule \ +" +RDEPENDS_${BPN}-loadpolicy += "\ + libselinux \ + libsepol \ +" +RDEPENDS_${BPN}-newrole += "\ + libcap-ng \ + libselinux \ +" +RDEPENDS_${BPN}-runinit += "libselinux" +RDEPENDS_${BPN}-secon += "libselinux" +RDEPENDS_${BPN}-semodule += "\ + libsepol \ + libselinux \ + libsemanage \ +" +RDEPENDS_${BPN}-sestatus += "libselinux" +RDEPENDS_${BPN}-setfiles += "\ + libselinux \ + libsepol \ +" +RDEPENDS_${BPN}-setsebool += "\ + libsepol \ + libselinux \ + libsemanage \ +" + +PACKAGES =+ "\ + ${PN}-fixfiles \ + ${PN}-genhomedircon \ + ${PN}-hll \ + ${PN}-loadpolicy \ + ${PN}-newrole \ + ${PN}-runinit \ + ${PN}-secon \ + ${PN}-semodule \ + ${PN}-sestatus \ + ${PN}-setfiles \ +" +FILES_${PN}-fixfiles += "${base_sbindir}/fixfiles" +FILES_${PN}-genhomedircon += "${base_sbindir}/genhomedircon" +FILES_${PN}-loadpolicy += "\ + ${base_sbindir}/load_policy \ +" +FILES_${PN}-newrole += "\ + ${bindir}/newrole \ + ${@bb.utils.contains('DISTRO_FEATURES', 'pam', '${sysconfdir}/pam.d/newrole', '', d)} \ +" +FILES_${PN}-runinit += "\ + ${base_sbindir}/run_init \ + ${base_sbindir}/open_init_pty \ + ${@bb.utils.contains('DISTRO_FEATURES', 'pam', '${sysconfdir}/pam.d/run_init', '', d)} \ +" +FILES_${PN}-dbg += "${prefix}/libexec/selinux/hll/.debug" +FILES_${PN}-secon += "${bindir}/secon" +FILES_${PN}-semodule += "${base_sbindir}/semodule" +FILES_${PN}-hll += "${prefix}/libexec/selinux/hll/*" +FILES_${PN}-sestatus += "\ + ${base_sbindir}/sestatus \ + ${sysconfdir}/sestatus.conf \ +" +FILES_${PN}-setfiles += "\ + ${base_sbindir}/restorecon \ + ${base_sbindir}/restorecon_xattr \ + ${base_sbindir}/setfiles \ +" +FILES_${PN}-setsebool += "\ + ${base_sbindir}/setsebool \ + ${datadir}/bash-completion/completions/setsebool \ +" + +export STAGING_INCDIR +export STAGING_LIBDIR + +AUDITH="`ls ${STAGING_INCDIR}/libaudit.h >/dev/null 2>&1 && echo /usr/include/libaudit.h `" +EXTRA_OEMAKE += "${@target_selinux(d, 'AUDITH=${AUDITH}', 'AUDITH= ')} INOTIFYH=n" +EXTRA_OEMAKE += "PREFIX=${D}" +EXTRA_OEMAKE += "INITDIR=${D}/etc/init.d" + +BBCLASSEXTEND = "native" + +PCU_NATIVE_CMDS = "setfiles semodule hll" + +do_compile_virtclass-native() { + for PCU_CMD in ${PCU_NATIVE_CMDS} ; do + oe_runmake -C $PCU_CMD \ + INCLUDEDIR='${STAGING_INCDIR}' \ + LIBDIR='${STAGING_LIBDIR}' + done +} + +do_compile_class-native() { + for PCU_CMD in ${PCU_NATIVE_CMDS} ; do + oe_runmake -C $PCU_CMD \ + INCLUDEDIR='${STAGING_INCDIR}' \ + LIBDIR='${STAGING_LIBDIR}' + done +} + +do_compile_prepend() { + export PYTHON=${PYTHON} + export PYLIBVER='python${PYTHON_BASEVERSION}' + export PYTHON_CPPFLAGS="-I${STAGING_INCDIR_NATIVE}/${PYLIBVER}" + export PYTHON_LDFLAGS="${STAGING_INCDIR_NATIVE}/lib${PYLIBVER}.so" + export PYTHON_SITE_PKG="${libdir}/${PYLIBVER}/site-packages" +} + +do_install_prepend() { + export PYTHON=${PYTHON} + export SBINDIR="${base_sbindir}" + export SEMODULE_PATH="${base_sbindir}" SYSTEMDDIR=${systemd_unitdir} +} + +do_install_virtclass-native() { + for PCU_CMD in ${PCU_NATIVE_CMDS} ; do + oe_runmake -C $PCU_CMD install \ + DESTDIR="${D}" \ + PREFIX="${prefix}" \ + SBINDIR="${base_sbindir}" + done +} + +do_install_class-native() { + for PCU_CMD in ${PCU_NATIVE_CMDS} ; do + oe_runmake -C $PCU_CMD install \ + DESTDIR="${D}" \ + PREFIX="${prefix}" \ + SBINDIR="${base_sbindir}" + done +} + +do_install_append_class-target() { + if [ -e ${WORKDIR}/pam.d ]; then + install -d ${D}${sysconfdir}/pam.d/ + install -m 0644 ${WORKDIR}/pam.d/* ${D}${sysconfdir}/pam.d/ + fi + + # /var/lib/selinux is involved by seobject.py: + # + dirname = "/var/lib/selinux" + # and it's required for running command: + # $ semanage permissive [OPTS] + install -d ${D}${localstatedir}/lib/selinux + rm -rf ${D}/lib/ + rm -r ${D}/usr/share/bash-completion + rm -rf ${D}/usr/lib64/ + rm -rf ${D}/usr/lib/ +} diff --git a/meta-openeuler/recipes-core/selinux/policycoreutils_3.3.bb b/meta-openeuler/recipes-core/selinux/policycoreutils_3.3.bb new file mode 100644 index 00000000000..d29390c52e2 --- /dev/null +++ b/meta-openeuler/recipes-core/selinux/policycoreutils_3.3.bb @@ -0,0 +1,9 @@ +require selinux_common.inc +require ${BPN}.inc + +LIC_FILES_CHKSUM = "file://COPYING;md5=393a5ca445f6965873eca0259a17f833" + +SRC_URI = "file://policycoreutils/${BP}.tar.gz \ + file://policycoreutils/fix-fixfiles-N-date-function.patch;patchdir=.. \ + file://policycoreutils/fix-fixfiles-N-date-function-two.patch;patchdir=.. \ +" -- Gitee From 07f5f8b8509b9e6c212b78a185184cec37f05bb3 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 10 Jan 2022 19:55:32 +0800 Subject: [PATCH 140/304] add recipe for initscripts Signed-off-by: lixiaoyong --- .../initscripts/initscripts_10.12.bb | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 meta-openeuler/recipes-core/initscripts/initscripts_10.12.bb diff --git a/meta-openeuler/recipes-core/initscripts/initscripts_10.12.bb b/meta-openeuler/recipes-core/initscripts/initscripts_10.12.bb new file mode 100644 index 00000000000..2429c2cb688 --- /dev/null +++ b/meta-openeuler/recipes-core/initscripts/initscripts_10.12.bb @@ -0,0 +1,73 @@ +SUMMARY = "SysV init scripts" +HOMEPAGE = "https://github.com/fedora-sysv/initscripts" +DESCRIPTION = "Initscripts provide the basic system startup initialization scripts for the system. These scripts include actions such as filesystem mounting, fsck, RTC manipulation and other actions routinely performed at system startup. In addition, the scripts are also used during system shutdown to reverse the actions performed at startup." +SECTION = "base" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263" +PR = "1" + +SRC_URI = "file://initscripts/initscripts-10.12.tar.gz \ + file://initscripts/backport-run-ifdown-on-all-interfaces.patch \ + file://initscripts/bugfix-initscripts-add-udev-wait-dependency-for-network.patch \ + file://initscripts/bugfix-mod-network-function-when-NM-unmanage-devices.patch \ + file://initscripts/bugfix-initscripts-set-PERSISTENT_DHCLIENT-default-to-yes.patch \ + file://initscripts/bugfix-network-need-chkconfig-on.patch \ + file://initscripts/bugfix-restart-network-warning.patch \ + file://initscripts/new-network-fork-to-start-dhcp.patch \ + file://initscripts/exec-udevadm-settle-when-network-start.patch \ + file://initscripts/remove-rename_device_lock-when-process-does-not-exis.patch \ +" +INHIBIT_DEFAULT_DEPS = "1" + +KERNEL_VERSION = "" + +DEPENDS_append = " update-rc.d-native" +PACKAGE_WRITE_DEPS_append = " ${@bb.utils.contains('DISTRO_FEATURES','systemd','systemd-systemctl-native','',d)}" + +PACKAGES =+ "${PN}-functions ${PN}-sushell" +RDEPENDS_${PN} = "initd-functions \ + ${@bb.utils.contains('DISTRO_FEATURES','selinux','${PN}-sushell','',d)} \ + " +#Recommend pn-functions so that it will be a preferred default provider for initd-functions +RRECOMMENDS_${PN} = "${PN}-functions" +RPROVIDES_${PN}-functions = "initd-functions" +RCONFLICTS_${PN}-functions = "lsbinitscripts" + +HALTARGS ?= "-d -f" + +do_configure() { +} + +do_install () { +# +# Create directories and install device independent scripts +# + mkdir -p ${D}/etc/sysconfig/network-scripts + install ${S}/network-scripts/* ${D}/etc/sysconfig/network-scripts/ + + mkdir -p ${D}/etc/init.d + install ${S}/etc/rc.d/init.d/* ${D}/etc/init.d/ +} + +MASKED_SCRIPTS = "" + +pkg_postinst_${PN} () { + if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then + if [ -n "$D" ]; then + OPTS="--root=$D" + fi + for SERVICE in ${MASKED_SCRIPTS}; do + systemctl $OPTS mask $SERVICE.service + done + fi + + # Delete any old volatile cache script, as directories may have moved + if [ -z "$D" ]; then + rm -f "/etc/volatile.cache" + fi +} + +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +CONFFILES_${PN} += "${sysconfdir}/init.d/checkroot.sh" -- Gitee From f19876699821ec8485a9b6ecad7755da663b4e1f Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 6 Jan 2022 14:15:59 +0800 Subject: [PATCH 141/304] add recipe for libestr Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/libestr/libestr_0.1.11.bb | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 meta-openeuler/recipes-core/libestr/libestr_0.1.11.bb diff --git a/meta-openeuler/recipes-core/libestr/libestr_0.1.11.bb b/meta-openeuler/recipes-core/libestr/libestr_0.1.11.bb new file mode 100644 index 00000000000..d8c7d363c43 --- /dev/null +++ b/meta-openeuler/recipes-core/libestr/libestr_0.1.11.bb @@ -0,0 +1,8 @@ +SUMMARY = "some essentials for string handling (and a bit more)" +HOMEPAGE = "http://libestr.adiscon.com/" +LICENSE = "LGPLv2.1" +LIC_FILES_CHKSUM = "file://COPYING;md5=9d6c993486c18262afba4ca5bcb894d0" + +UPSTREAM_CHECK_URI = "http://libestr.adiscon.com/download/" +SRC_URI = "file://${BPN}/${BP}.tar.gz" +inherit autotools -- Gitee From e6c732cf3cabe8afa2b56d3b6ee5ad8ed13b9852 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 6 Jan 2022 14:17:38 +0800 Subject: [PATCH 142/304] add recipe for libfastjson Signed-off-by: lixiaoyong --- .../recipes-core/libfastjson/libfastjson_0.99.9.bb | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 meta-openeuler/recipes-core/libfastjson/libfastjson_0.99.9.bb diff --git a/meta-openeuler/recipes-core/libfastjson/libfastjson_0.99.9.bb b/meta-openeuler/recipes-core/libfastjson/libfastjson_0.99.9.bb new file mode 100644 index 00000000000..849eaf5107d --- /dev/null +++ b/meta-openeuler/recipes-core/libfastjson/libfastjson_0.99.9.bb @@ -0,0 +1,9 @@ +SUMMARY = "A fork of json-c library" +HOMEPAGE = "https://github.com/rsyslog/libfastjson" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://COPYING;md5=a958bb07122368f3e1d9b2efe07d231f" + +SRC_URI = "file://${BPN}/${BP}.tar.gz" +CFLAGS="-lm" + +inherit autotools -- Gitee From 96961ca30e3adab4789615923a099995ddf07629 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 6 Jan 2022 14:28:18 +0800 Subject: [PATCH 143/304] add recipe for logrotate Signed-off-by: lixiaoyong --- .../logrotate/logrotate_3.18.1.bb | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 meta-openeuler/recipes-core/logrotate/logrotate_3.18.1.bb diff --git a/meta-openeuler/recipes-core/logrotate/logrotate_3.18.1.bb b/meta-openeuler/recipes-core/logrotate/logrotate_3.18.1.bb new file mode 100644 index 00000000000..8258b144b66 --- /dev/null +++ b/meta-openeuler/recipes-core/logrotate/logrotate_3.18.1.bb @@ -0,0 +1,85 @@ +SUMMARY = "Rotates, compresses, removes and mails system log files" +SECTION = "console/utils" +HOMEPAGE = "https://github.com/logrotate/logrotate/" +DESCRIPTION = "The logrotate utility is designed to simplify the administration of log files on a system which generates a lot of log files." +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263" + +DEPENDS = "popt" + +SRC_URI = "file://${BPN}/${BP}.tar.xz" +UPSTREAM_CHECK_URI = "https://github.com/${BPN}/${BPN}/releases" +UPSTREAM_CHECK_REGEX = "logrotate-(?P\d+(\.\d+)+).tar" + +# These CVEs are debian, gentoo or SUSE specific on the way logrotate was installed/used +CVE_CHECK_WHITELIST += "CVE-2011-1548 CVE-2011-1549 CVE-2011-1550" + +PACKAGECONFIG ?= "${@bb.utils.filter('DISTRO_FEATURES', 'acl selinux', d)}" + +PACKAGECONFIG[acl] = ",,acl" +PACKAGECONFIG[selinux] = ",,libselinux" + +CONFFILES_${PN} += "${localstatedir}/lib/logrotate.status \ + ${sysconfdir}/logrotate.conf \ + ${sysconfdir}/logrotate.d/btmp \ + ${sysconfdir}/logrotate.d/wtmp" + +# If RPM_OPT_FLAGS is unset, it adds -g itself rather than obeying our +# optimization variables, so use it rather than EXTRA_CFLAGS. +EXTRA_OEMAKE = "\ + LFS= \ + OS_NAME='${OS_NAME}' \ + 'CC=${CC}' \ + 'RPM_OPT_FLAGS=${CFLAGS}' \ + 'EXTRA_LDFLAGS=${LDFLAGS}' \ + ${@bb.utils.contains('PACKAGECONFIG', 'acl', 'WITH_ACL=yes', '', d)} \ + ${@bb.utils.contains('PACKAGECONFIG', 'selinux', 'WITH_SELINUX=yes', '', d)} \ +" + +# OS_NAME in the makefile defaults to `uname -s`. The behavior for +# freebsd/netbsd is questionable, so leave it as Linux, which only sets +# INSTALL=install and BASEDIR=/usr. +OS_NAME = "Linux" + +inherit autotools systemd + +SYSTEMD_SERVICE_${PN} = "\ + ${BPN}.service \ + ${BPN}.timer \ +" + +LOGROTATE_OPTIONS ?= "" + +LOGROTATE_SYSTEMD_TIMER_BASIS ?= "daily" +LOGROTATE_SYSTEMD_TIMER_ACCURACY ?= "12h" +LOGROTATE_SYSTEMD_TIMER_PERSISTENT ?= "true" + +do_install(){ + oe_runmake install DESTDIR=${D} PREFIX=${D} MANDIR=${mandir} + mkdir -p ${D}${sysconfdir}/logrotate.d + mkdir -p ${D}${localstatedir}/lib + install -p -m 644 ${S}/examples/logrotate.conf ${D}${sysconfdir}/logrotate.conf + install -p -m 644 ${S}/examples/btmp ${D}${sysconfdir}/logrotate.d/btmp + install -p -m 644 ${S}/examples/wtmp ${D}${sysconfdir}/logrotate.d/wtmp + touch ${D}${localstatedir}/lib/logrotate.status + + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + install -d ${D}${systemd_system_unitdir} + install -m 0644 ${S}/examples/logrotate.service ${D}${systemd_system_unitdir}/logrotate.service + install -m 0644 ${S}/examples/logrotate.timer ${D}${systemd_system_unitdir}/logrotate.timer + [ -z "${LOGROTATE_OPTIONS}" ] || + sed -ri \ + -e 's|(ExecStart=.*/logrotate.*)$|\1 ${LOGROTATE_OPTIONS}|g' \ + ${D}${systemd_system_unitdir}/logrotate.service + sed -ri \ + -e 's|(OnCalendar=).*$|\1${LOGROTATE_SYSTEMD_TIMER_BASIS}|g' \ + -e 's|(AccuracySec=).*$|\1${LOGROTATE_SYSTEMD_TIMER_ACCURACY}|g' \ + -e 's|(Persistent=).*$|\1${LOGROTATE_SYSTEMD_TIMER_PERSISTENT}|g' \ + ${D}${systemd_system_unitdir}/logrotate.timer + fi + + if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'true', 'false', d)}; then + mkdir -p ${D}${sysconfdir}/cron.daily + install -p -m 0755 ${S}/examples/logrotate.cron ${D}${sysconfdir}/cron.daily/logrotate + fi +} -- Gitee From 4da7f712ea1d392fab8c69769fbaaa845a9f1375 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 10 Jan 2022 20:01:32 +0800 Subject: [PATCH 144/304] util-linux upgrade to 2.37.2 Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/util-linux/util-linux.inc | 10 +--------- .../{util-linux_2.36.1.bb => util-linux_2.37.2.bb} | 9 +-------- 2 files changed, 2 insertions(+), 17 deletions(-) rename meta-openeuler/recipes-core/util-linux/{util-linux_2.36.1.bb => util-linux_2.37.2.bb} (96%) diff --git a/meta-openeuler/recipes-core/util-linux/util-linux.inc b/meta-openeuler/recipes-core/util-linux/util-linux.inc index fcefde67c94..13ea7e18b7d 100644 --- a/meta-openeuler/recipes-core/util-linux/util-linux.inc +++ b/meta-openeuler/recipes-core/util-linux/util-linux.inc @@ -28,16 +28,8 @@ LIC_FILES_CHKSUM = "file://README.licensing;md5=0fd5c050c6187d2bf0a4492b7f4e33da FILESEXTRAPATHS_prepend := "${THISDIR}/util-linux:" MAJOR_VERSION = "${@'.'.join(d.getVar('PV').split('.')[0:2])}" SRC_URI = "file://util-linux/util-linux-${PV}.tar.xz \ - file://util-linux/2.36-login-lastlog-create.patch \ - file://util-linux/Add-check-to-resolve-uname26-version-test-failed.patch \ - file://util-linux/backport-CVE-2021-37600.patch \ - file://util-linux/backport-libblkid-improve-debug-for-proc-partitions.patch \ - file://util-linux/backport-libblkid-use-sys-to-read-all-block-devices.patch \ - file://util-linux/backport-libfdisk-make-fdisk_partname-more-robust.patch \ - file://util-linux/backport-libmount-fix-tab-parser-for-badly-terminated-lines.patch \ - file://util-linux/Do-not-excute-Utmp-testcases.patch \ file://runuser.pamd \ file://runuser-l.pamd \ " -SRC_URI[sha256sum] = "09fac242172cd8ec27f0739d8d192402c69417617091d8c6e974841568f37eed" +SRC_URI[sha256sum] = "6a0764c1aae7fb607ef8a6dd2c0f6c47d5e5fd27aa08820abaad9ec14e28e9d9 " diff --git a/meta-openeuler/recipes-core/util-linux/util-linux_2.36.1.bb b/meta-openeuler/recipes-core/util-linux/util-linux_2.37.2.bb similarity index 96% rename from meta-openeuler/recipes-core/util-linux/util-linux_2.36.1.bb rename to meta-openeuler/recipes-core/util-linux/util-linux_2.37.2.bb index b4e986138ed..8642fb6ac55 100644 --- a/meta-openeuler/recipes-core/util-linux/util-linux_2.36.1.bb +++ b/meta-openeuler/recipes-core/util-linux/util-linux_2.37.2.bb @@ -49,9 +49,8 @@ python util_linux_binpackages () { # we must execute before update-alternatives PACKAGE_PREPROCESS_FUNCS PACKAGE_PREPROCESS_FUNCS =+ "util_linux_binpackages " -# skip libuuid as it will be packaged by the util-linux-libuuid recipe python util_linux_libpackages() { - do_split_packages(d, root=d.getVar('UTIL_LINUX_LIBDIR'), file_regex=r'^lib(?!uuid)(.*)\.so\..*$', + do_split_packages(d, root=d.getVar('UTIL_LINUX_LIBDIR'), file_regex=r'^lib(.*)\.so\..*$', output_pattern='${PN}-lib%s', description='${PN} lib%s', extra_depends='', prepend=True, allow_links=True) @@ -198,12 +197,6 @@ do_install_append_class-native () { rm -f ${D}${base_bindir}/kill } -# dm-verity support introduces a circular build dependency, so util-linux-libuuid is split out for target builds -# Need to build libuuid for uuidgen, but then delete it and let the other recipe ship it -do_install_append () { - rm -rf ${D}${includedir}/uuid ${D}${libdir}/pkgconfig/uuid.pc ${D}${libdir}/libuuid* ${D}${base_libdir}/libuuid* -} - ALTERNATIVE_PRIORITY = "80" ALTERNATIVE_LINK_NAME[blkid] = "${base_sbindir}/blkid" -- Gitee From c2fdbd5d9cc09c8300953ceadbf00d5f69075bcc Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 6 Jan 2022 14:37:01 +0800 Subject: [PATCH 145/304] add recipe for rsyslog Signed-off-by: lixiaoyong --- .../recipes-core/rsyslog/rsyslog/initscript | 119 ++++++++++++++++++ .../recipes-core/rsyslog/rsyslog/rsyslog.conf | 85 +++++++++++++ .../rsyslog/rsyslog/rsyslog.logrotate | 40 ++++++ .../recipes-core/rsyslog/rsyslog_8.2110.0.bb | 108 ++++++++++++++++ 4 files changed, 352 insertions(+) create mode 100644 meta-openeuler/recipes-core/rsyslog/rsyslog/initscript create mode 100644 meta-openeuler/recipes-core/rsyslog/rsyslog/rsyslog.conf create mode 100644 meta-openeuler/recipes-core/rsyslog/rsyslog/rsyslog.logrotate create mode 100644 meta-openeuler/recipes-core/rsyslog/rsyslog_8.2110.0.bb diff --git a/meta-openeuler/recipes-core/rsyslog/rsyslog/initscript b/meta-openeuler/recipes-core/rsyslog/rsyslog/initscript new file mode 100644 index 00000000000..96e9d74ca4e --- /dev/null +++ b/meta-openeuler/recipes-core/rsyslog/rsyslog/initscript @@ -0,0 +1,119 @@ +#! /bin/sh +# +# This is an init script for openembedded +# Copy it to /etc/init.d/rsyslog and type +# > update-rc.d rsyslog defaults 5 +# + +PATH=/sbin:/usr/sbin:/bin:/usr/bin +NAME=rsyslog +RSYSLOGD=rsyslogd +RSYSLOGD_BIN=/usr/sbin/rsyslogd +RSYSLOGD_OPTIONS="" +RSYSLOGD_PIDFILE=/var/run/rsyslogd.pid +SCRIPTNAME=/etc/init.d/$NAME +# Exit if the package is not installed +[ -x "$RSYSLOGD_BIN" ] || exit 0 +# Read configuration variable file if it is present +[ -r /etc/default/$NAME ] && . /etc/default/$NAME +# +# Function that starts the daemon/service +# +do_start() +{ + DAEMON=$1 + DAEMON_ARGS=$2 + PIDFILE=$3 + # Return + # 0 if daemon has been started + # 1 if daemon could not be started + # if daemon had already been started, start-stop-daemon will return 1 + # so add -o/--oknodo(if nothing is done, exit 0) + start-stop-daemon -S --quiet --pidfile $PIDFILE --exec $DAEMON \ + --oknodo -- $DAEMON_ARGS || return 1 +} +# +# Function that stops the daemon/service +# +do_stop() +{ + NAME=$1 + PIDFILE=$2 + # Return + # 0 if daemon has been stopped + # 1 if daemon was already stopped + # 2 if daemon could not be stopped + # other if a failure occurred + # QUIT/TERM/INT should work here, but they don't ????? + start-stop-daemon -K --quiet --signal KILL --pidfile $PIDFILE --name $NAME + RETVAL="$?" + rm -f $PIDFILE + return "$RETVAL" +} +# +# Function that sends a SIGHUP to the daemon/service +# +do_reload() { + NAME=$1 + PIDFILE=$2 + start-stop-daemon -K --signal HUP --quiet --pidfile $PIDFILE --name $NAME + return 0 +} + +do_status() { + NAME=$1 + PIDFILE=$2 + # -t: test only but not stop + start-stop-daemon -K -t --quiet --pidfile $PIDFILE --name $NAME + # exit with status 0 if process is found + if [ "$?" = "0" ]; then + return 0 + else + return 1 + fi +} + +case "$1" in + start) + echo -n "starting $RSYSLOGD ... " + do_start "$RSYSLOGD_BIN" "$RSYSLOGD_OPTIONS" "$RSYSLOGD_PIDFILE" + case "$?" in + 0) echo "done" ;; + 1) echo "failed" ;; + esac + ;; + stop) + echo -n "stopping $RSYSLOGD ... " + do_stop "$RSYSLOGD" "$RSYSLOGD_PIDFILE" + case "$?" in + 0|1) echo "done" ;; + 2) echo "failed" ;; + esac + ;; + reload|force-reload) + echo -n "reloading $RSYSLOGD ... " + do_reload "$RSYSLOGD" "$RSYSLOGD_PIDFILE" + echo "done" + ;; + restart) + $0 stop + $0 start + ;; + status) + echo -n "status $RSYSLOGD ... " + do_status "$RSYSLOGD" "$RSYSLOGD_PIDFILE" + if [ "$?" = "0" ]; then + echo "running" + exit 0 + else + echo "stopped" + exit 1 + fi + ;; + *) + echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}" >&2 + exit 3 + ;; +esac +exit 0 + diff --git a/meta-openeuler/recipes-core/rsyslog/rsyslog/rsyslog.conf b/meta-openeuler/recipes-core/rsyslog/rsyslog/rsyslog.conf new file mode 100644 index 00000000000..3db32f0c1cf --- /dev/null +++ b/meta-openeuler/recipes-core/rsyslog/rsyslog/rsyslog.conf @@ -0,0 +1,85 @@ +# rsyslog configuration file + +# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html +# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html + +#### MODULES #### + +$ModLoad imuxsock # provides support for local system logging (e.g. via logger command) +$ModLoad imklog # reads kernel messages (the same are read from journald) +$ModLoad immark # provides --MARK-- message capability + +# Provides UDP syslog reception +#$ModLoad imudp +#$UDPServerRun 514 + +# Provides TCP syslog reception +#$ModLoad imtcp +#$InputTCPServerRun 514 + + +#### GLOBAL DIRECTIVES #### +$FileGroup root +$FileOwner root +$FileCreateMode 0640 + +# Where to place auxiliary files +$WorkDirectory /var/lib/rsyslog + +# Use default timestamp format +$ActionFileDefaultTemplate RSYSLOG_FileFormat + +# File syncing capability is disabled by default. This feature is usually not required, +# not useful and an extreme performance hit +#$ActionFileEnableSync on + +# Include all config files in /etc/rsyslog.d/ +$IncludeConfig /etc/rsyslog.d/*.conf + + +#### RULES #### + +# Log all kernel messages to the console. +# Logging much else clutters up the screen. +#kern.* /dev/console + +# Log anything (except mail) of level info or higher. +# Don't log private authentication messages! +*.info;mail.none /var/log/messages + +# The authpriv file has restricted access. +authpriv.* /var/log/secure + +# Log all the mail messages in one place. +mail.* -/var/log/maillog + + +# Log cron stuff +cron.* /var/log/cron + +# Everybody gets emergency messages +*.emerg :omusrmsg:* + +# Save news errors of level crit and higher in a special file. +uucp,news.crit /var/log/spooler + +# Save boot messages also to boot.log +local7.* /var/log/boot.log + + +# ### begin forwarding rule ### +# The statement between the begin ... end define a SINGLE forwarding +# rule. They belong together, do NOT split them. If you create multiple +# forwarding rules, duplicate the whole block! +# Remote Logging (we use TCP for reliable delivery) +# +# An on-disk queue is created for this action. If the remote host is +# down, messages are spooled to disk and sent when it is up again. +#$ActionQueueFileName fwdRule1 # unique name prefix for spool files +#$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible) +#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown +#$ActionQueueType LinkedList # run asynchronously +#$ActionResumeRetryCount -1 # infinite retries if host is down +# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional +#*.* @@remote-host:514 +# ### end of the forwarding rule ### diff --git a/meta-openeuler/recipes-core/rsyslog/rsyslog/rsyslog.logrotate b/meta-openeuler/recipes-core/rsyslog/rsyslog/rsyslog.logrotate new file mode 100644 index 00000000000..962794577d7 --- /dev/null +++ b/meta-openeuler/recipes-core/rsyslog/rsyslog/rsyslog.logrotate @@ -0,0 +1,40 @@ +# /etc/logrotate.d/rsyslog - Ported from Debian + +/var/log/syslog +{ + rotate 7 + daily + missingok + notifempty + delaycompress + compress + postrotate + @BINDIR@/pkill -HUP rsyslogd 2> /dev/null || true + endscript +} + +/var/log/mail.info +/var/log/mail.warn +/var/log/mail.err +/var/log/mail.log +/var/log/daemon.log +/var/log/kern.log +/var/log/auth.log +/var/log/user.log +/var/log/lpr.log +/var/log/cron.log +/var/log/debug +/var/log/messages +{ + rotate 4 + weekly + missingok + notifempty + compress + delaycompress + sharedscripts + postrotate + @BINDIR@/pkill -HUP rsyslogd 2> /dev/null || true + endscript +} + diff --git a/meta-openeuler/recipes-core/rsyslog/rsyslog_8.2110.0.bb b/meta-openeuler/recipes-core/rsyslog/rsyslog_8.2110.0.bb new file mode 100644 index 00000000000..ab0cf6e3821 --- /dev/null +++ b/meta-openeuler/recipes-core/rsyslog/rsyslog_8.2110.0.bb @@ -0,0 +1,108 @@ +SUMMARY = "Rsyslog is an enhanced multi-threaded syslogd" +DESCRIPTION = "\ + Rsyslog is an enhanced syslogd supporting, among others, MySQL,\ + PostgreSQL, failover log destinations, syslog/tcp, fine grain\ + output format control, high precision timestamps, queued operations\ + and the ability to filter on any message part. It is quite\ + compatible to stock sysklogd and can be used as a drop-in replacement.\ + Its advanced features make it suitable for enterprise-class,\ + encryption protected syslog relay chains while at the same time being\ + very easy to setup for the novice user." + +DEPENDS = "zlib libestr libfastjson bison-native" +HOMEPAGE = "http://www.rsyslog.com/" +LICENSE = "GPLv3 & LGPLv3 & Apache-2.0" +LIC_FILES_CHKSUM = "file://COPYING;md5=51d9635e646fb75e1b74c074f788e973" + +SRC_URI = "file://${BPN}/${BP}.tar.gz \ + file://${BPN}/rsyslog-8.24.0-ensure-parent-dir-exists-when-writting-log-file.patch \ + file://${BPN}/bugfix-rsyslog-7.4.7-imjournal-add-monotonic-timestamp.patch \ + file://${BPN}/bugfix-rsyslog-7.4.7-add-configuration-to-avoid-memory-leak.patch \ + file://${BPN}/rsyslog-8.24.0-set-permission-of-syslogd-dot-pid-to-0644.patch \ + file://${BPN}/rsyslog-8.37.0-initialize-variables-and-check-return-value.patch \ + file://initscript \ + file://rsyslog.conf \ + file://rsyslog.logrotate \ +" +UPSTREAM_CHECK_URI = "https://github.com/rsyslog/rsyslog/releases" +UPSTREAM_CHECK_REGEX = "(?P\d+(\.\d+)+)" + +inherit autotools pkgconfig + +#not enable --enable-libsystemd configuration options +EXTRA_OECONF += "--disable-generate-man-pages ap_cv_atomic_builtins=yes --enable-libsystemd=no" +EXTRA_OECONF_remove_mipsarch = "ap_cv_atomic_builtins=yes" +EXTRA_OECONF_remove_powerpc = "ap_cv_atomic_builtins=yes" +EXTRA_OECONF_remove_riscv32 = "ap_cv_atomic_builtins=yes" +CFLAGS += " -I${RECIPE_SYSROOT}/usr/include/libfastjson/ " +# first line is default yes in configure +PACKAGECONFIG ??= " \ + rsyslogd rsyslogrt klog inet regexp uuid \ + fmhttp imdiag imfile \ + ${@bb.utils.filter('DISTRO_FEATURES', 'snmp', d)} \ +" +RSYSLOG_IMAGE_NAME = "${MACHINE_ARCH}${RTOS_KERNEL_TAG}" +PACKAGECONFIG_remove += "${@bb.utils.contains('RSYSLOG_IMAGE_NAME', 'arm32a15eb-5.10', 'fmhttp', '', d)}" +PACKAGECONFIG_remove += "${@bb.utils.contains('RSYSLOG_IMAGE_NAME', 'arm32a9eb-5.10', 'fmhttp', '', d)}" +PACKAGECONFIG_remove += "${@bb.utils.contains('RSYSLOG_IMAGE_NAME', 'arm32a9eb-tiny-5.10', 'fmhttp', '', d)}" +PACKAGECONFIG_remove += "${@bb.utils.contains('RSYSLOG_IMAGE_NAME', 'arm64eb-5.10', 'fmhttp', '', d)}" +PACKAGECONFIG_remove += "${@bb.utils.contains('RSYSLOG_IMAGE_NAME', 'arm64el-5.10', 'fmhttp', '', d)}" +PACKAGECONFIG_remove += "${@bb.utils.contains('RSYSLOG_IMAGE_NAME', 'arm32a7el-preempt-5.10', 'fmhttp', '', d)}" + +# add imfile module to support file monitor function +PACKAGECONFIG_append_arm64el = "${@bb.utils.contains('RTOS_TAG', '-preempt', 'imfile', '', d)}" + +# default yes in configure +PACKAGECONFIG[relp] = "--enable-relp,--disable-relp,librelp," +PACKAGECONFIG[rsyslogd] = "--enable-rsyslogd,--disable-rsyslogd,," +PACKAGECONFIG[rsyslogrt] = "--enable-rsyslogrt,--disable-rsyslogrt,," +PACKAGECONFIG[fmhttp] = "--enable-fmhttp,--disable-fmhttp,curl," +PACKAGECONFIG[inet] = "--enable-inet,--disable-inet,," +PACKAGECONFIG[klog] = "--enable-klog,--disable-klog,," +PACKAGECONFIG[regexp] = "--enable-regexp,--disable-regexp,," +PACKAGECONFIG[uuid] = "--enable-uuid,--disable-uuid,util-linux," +PACKAGECONFIG[libgcrypt] = "--enable-libgcrypt,--disable-libgcrypt,libgcrypt," +PACKAGECONFIG[testbench] = "--enable-testbench --enable-omstdout,--disable-testbench --disable-omstdout,," + +# default no in configure +PACKAGECONFIG[debug] = "--enable-debug,--disable-debug,," +PACKAGECONFIG[imdiag] = "--enable-imdiag,--disable-imdiag,," +PACKAGECONFIG[imfile] = "--enable-imfile,--disable-imfile,," +PACKAGECONFIG[snmp] = "--enable-snmp,--disable-snmp,net-snmp," +PACKAGECONFIG[gnutls] = "--enable-gnutls,--disable-gnutls,gnutls," +PACKAGECONFIG[imjournal] = "--enable-imjournal,--disable-imjournal," +PACKAGECONFIG[mmjsonparse] = "--enable-mmjsonparse,--disable-mmjsonparse," +PACKAGECONFIG[mysql] = "--enable-mysql,--disable-mysql,mysql5," +PACKAGECONFIG[postgresql] = "--enable-pgsql,--disable-pgsql,postgresql," +PACKAGECONFIG[libdbi] = "--enable-libdbi,--disable-libdbi,libdbi," +PACKAGECONFIG[mail] = "--enable-mail,--disable-mail,," +PACKAGECONFIG[valgrind] = "--enable-valgrind,--disable-valgrind,valgrind," +do_install_append() { + install -d "${D}${sysconfdir}/init.d" + install -d "${D}${sysconfdir}/logrotate.d" + install -d "${D}/var/lib/rsyslog" + install -m 750 ${WORKDIR}/initscript ${D}${sysconfdir}/init.d/syslog + install -m 644 ${WORKDIR}/rsyslog.conf ${D}${sysconfdir}/rsyslog.conf + install -m 644 ${WORKDIR}/rsyslog.logrotate ${D}${sysconfdir}/logrotate.d/logrotate.rsyslog + sed -i -e "s#@BINDIR@#${bindir}#g" ${D}${sysconfdir}/logrotate.d/logrotate.rsyslog + + if ${@bb.utils.contains('PACKAGECONFIG', 'imjournal', 'true', 'false', d)}; then + install -d 0755 ${D}${sysconfdir}/rsyslog.d + echo '$ModLoad imjournal' >> ${D}${sysconfdir}/rsyslog.d/imjournal.conf + fi + if ${@bb.utils.contains('PACKAGECONFIG', 'mmjsonparse', 'true', 'false', d)}; then + install -d 0755 ${D}${sysconfdir}/rsyslog.d + echo '$ModLoad mmjsonparse' >> ${D}${sysconfdir}/rsyslog.d/mmjsonparse.conf + fi +} + +FILES_${PN} += "${bindir}" + +INITSCRIPT_NAME = "syslog" +INITSCRIPT_PARAMS = "defaults" + +CONFFILES_${PN} = "${sysconfdir}/rsyslog.conf" + +RCONFLICTS_${PN} = "busybox-syslog sysklogd syslog-ng" + +RDEPENDS_${PN} += "logrotate" -- Gitee From db65679cad0d278b07d283bf1f8b1f7ee9b73191 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 6 Jan 2022 11:59:37 +0800 Subject: [PATCH 146/304] delete the patch that does not exist Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/libaio/libaio_0.3.112.bb | 1 - 1 file changed, 1 deletion(-) diff --git a/meta-openeuler/recipes-core/libaio/libaio_0.3.112.bb b/meta-openeuler/recipes-core/libaio/libaio_0.3.112.bb index d0b78921f1d..2e9a29a9be5 100644 --- a/meta-openeuler/recipes-core/libaio/libaio_0.3.112.bb +++ b/meta-openeuler/recipes-core/libaio/libaio_0.3.112.bb @@ -9,7 +9,6 @@ SRC_URI = "file://libaio/libaio-${PV}.tar.gz \ file://libaio/0001-libaio-arm64-ilp32.patch \ file://libaio/0002-libaio-makefile-cflags.patch \ file://libaio/0003-libaio-fix-for-x32.patch \ - file://00_arches.patch \ " EXTRA_OEMAKE =+ "prefix=${prefix} includedir=${includedir} libdir=${libdir}" -- Gitee From 23da12ca027452dc4955e2df720f1634f33e8fe8 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Tue, 11 Jan 2022 15:50:02 +0800 Subject: [PATCH 147/304] Revert "openeuler-image: add missed busybox-login package" This reverts commit 40bf248f8be3af8f0611c32cbc4c36688fb79953. --- meta-openeuler/recipes-core/images/openeuler-image.bb | 1 - 1 file changed, 1 deletion(-) diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 408fa7790c7..1e5c1edff8c 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -66,7 +66,6 @@ IMAGE_INSTALL_normal = " \ audit \ auditd \ audispd-plugins \ -busybox-login \ cracklib \ libpwquality \ libpam \ -- Gitee From aa0454bc94ea126d53f546df028aa71b981b15d5 Mon Sep 17 00:00:00 2001 From: ShiXin Date: Tue, 11 Jan 2022 15:56:49 +0800 Subject: [PATCH 148/304] gzip upgrade to 1.11 Signed-off-by: ShiXin --- .../gzip/{gzip-1.10 => gzip}/wrong-path-fix.patch | 0 .../recipes-core/gzip/{gzip_1.10.bb => gzip_1.11.bb} | 7 +++---- 2 files changed, 3 insertions(+), 4 deletions(-) rename meta-openeuler/recipes-core/gzip/{gzip-1.10 => gzip}/wrong-path-fix.patch (100%) rename meta-openeuler/recipes-core/gzip/{gzip_1.10.bb => gzip_1.11.bb} (86%) diff --git a/meta-openeuler/recipes-core/gzip/gzip-1.10/wrong-path-fix.patch b/meta-openeuler/recipes-core/gzip/gzip/wrong-path-fix.patch similarity index 100% rename from meta-openeuler/recipes-core/gzip/gzip-1.10/wrong-path-fix.patch rename to meta-openeuler/recipes-core/gzip/gzip/wrong-path-fix.patch diff --git a/meta-openeuler/recipes-core/gzip/gzip_1.10.bb b/meta-openeuler/recipes-core/gzip/gzip_1.11.bb similarity index 86% rename from meta-openeuler/recipes-core/gzip/gzip_1.10.bb rename to meta-openeuler/recipes-core/gzip/gzip_1.11.bb index 151fb48ad99..3e93b0aeb67 100644 --- a/meta-openeuler/recipes-core/gzip/gzip_1.10.bb +++ b/meta-openeuler/recipes-core/gzip/gzip_1.11.bb @@ -2,9 +2,8 @@ require gzip.inc LICENSE = "GPLv3+" -SRC_URI = "file://gzip/gzip-${PV}.tar.xz \ +SRC_URI = "file://gzip/${BP}.tar.xz \ file://gzip/fix-verbose-disable.patch \ - file://gzip/gzexe.patch \ file://run-ptest \ " #file://gzip/performance-neoncrc32-and-prfm.patch @@ -39,5 +38,5 @@ do_install_ptest() { ${B}/tests/Makefile > ${D}${PTEST_PATH}/src/tests/Makefile } -SRC_URI[md5sum] = "cf9ee51aff167ff69844d5d7d71c8b20" -SRC_URI[sha256sum] = "c91f74430bf7bc20402e1f657d0b252cb80aa66ba333a25704512af346633c68" +SRC_URI[md5sum] = "d1e93996dba00cab0caa7903cd01d454" +SRC_URI[sha256sum] = "9b9a95d68fdcb936849a4d6fada8bf8686cddf58b9b26c9c4289ed0c92a77907" -- Gitee From a65f4e83d57bdf7fc26710ef5405c4834d4f31bf Mon Sep 17 00:00:00 2001 From: ShiXin Date: Tue, 11 Jan 2022 16:00:55 +0800 Subject: [PATCH 149/304] pcre upgrade to 8.45 Signed-off-by: ShiXin --- .../libpcre/{libpcre_8.44.bb => libpcre_8.45.bb} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename meta-openeuler/recipes-core/libpcre/{libpcre_8.44.bb => libpcre_8.45.bb} (92%) diff --git a/meta-openeuler/recipes-core/libpcre/libpcre_8.44.bb b/meta-openeuler/recipes-core/libpcre/libpcre_8.45.bb similarity index 92% rename from meta-openeuler/recipes-core/libpcre/libpcre_8.44.bb rename to meta-openeuler/recipes-core/libpcre/libpcre_8.45.bb index 402992b4a3d..a83d9c6c63f 100644 --- a/meta-openeuler/recipes-core/libpcre/libpcre_8.44.bb +++ b/meta-openeuler/recipes-core/libpcre/libpcre_8.45.bb @@ -6,14 +6,14 @@ SUMMARY = "Perl Compatible Regular Expressions" HOMEPAGE = "http://www.pcre.org" SECTION = "devel" LICENSE = "BSD-3-Clause" -LIC_FILES_CHKSUM = "file://LICENCE;md5=3bb381a66a5385b246d4877922e7511e" +LIC_FILES_CHKSUM = "file://LICENCE;md5=b5d5d1a69a24ea2718263f1ff85a1c58" SRC_URI = "file://pcre/pcre-${PV}.tar.bz2 \ file://run-ptest \ file://Makefile \ " -SRC_URI[md5sum] = "cf7326204cc46c755b5b2608033d9d24" -SRC_URI[sha256sum] = "19108658b23b3ec5058edc9f66ac545ea19f9537234be1ec62b714c84399366d" +SRC_URI[md5sum] = "4452288e6a0eefb2ab11d36010a1eebb" +SRC_URI[sha256sum] = "4dae6fdcd2bb0bb6c37b5f97c33c2be954da743985369cddac3546e3218bffb8" CVE_PRODUCT = "pcre" -- Gitee From 3892621662bb2bc918f7366e8b669bd8bad51512 Mon Sep 17 00:00:00 2001 From: ShiXin Date: Tue, 11 Jan 2022 16:02:19 +0800 Subject: [PATCH 150/304] grep upgrade to 3.7 Signed-off-by: ShiXin --- .../recipes-core/grep/{grep_3.6.bb => grep_3.7.bb} | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) rename meta-openeuler/recipes-core/grep/{grep_3.6.bb => grep_3.7.bb} (85%) diff --git a/meta-openeuler/recipes-core/grep/grep_3.6.bb b/meta-openeuler/recipes-core/grep/grep_3.7.bb similarity index 85% rename from meta-openeuler/recipes-core/grep/grep_3.6.bb rename to meta-openeuler/recipes-core/grep/grep_3.7.bb index ee27996f1d6..22786d6f1bd 100644 --- a/meta-openeuler/recipes-core/grep/grep_3.6.bb +++ b/meta-openeuler/recipes-core/grep/grep_3.7.bb @@ -6,11 +6,8 @@ SECTION = "console/utils" LICENSE = "GPLv3" LIC_FILES_CHKSUM = "file://COPYING;md5=1ebbd3e34237af26da5dc08a4e440464" -SRC_URI = "file://grep/grep-${PV}.tar.xz \ -" -#file://grep/grep-3.6-gnulib-c-stack-fix.patch - -SRC_URI[sha256sum] = "667e15e8afe189e93f9f21a7cd3a7b3f776202f417330b248c2ad4f997d9373e" +SRC_URI = "file://grep/grep-${PV}.tar.xz" +SRC_URI[sha256sum] = "5c10da312460aec721984d5d83246d24520ec438dd48d7ab5a05dbc0d6d6823c" inherit autotools gettext texinfo pkgconfig @@ -33,8 +30,6 @@ do_install () { fi } -#inherit update-alternatives - PACKAGECONFIG ??= "pcre" PACKAGECONFIG[pcre] = "--enable-perl-regexp,--disable-perl-regexp,libpcre" -- Gitee From 5c28d5a564709c51548c3d3fb881c7ab1052819d Mon Sep 17 00:00:00 2001 From: ShiXin Date: Tue, 11 Jan 2022 16:04:52 +0800 Subject: [PATCH 151/304] less upgrade to 590 Signed-off-by: ShiXin --- .../less/{less_563.bb => less_590.bb} | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) rename meta-openeuler/recipes-core/less/{less_563.bb => less_590.bb} (51%) diff --git a/meta-openeuler/recipes-core/less/less_563.bb b/meta-openeuler/recipes-core/less/less_590.bb similarity index 51% rename from meta-openeuler/recipes-core/less/less_563.bb rename to meta-openeuler/recipes-core/less/less_590.bb index a9490e5c0d5..2f65a251b26 100644 --- a/meta-openeuler/recipes-core/less/less_563.bb +++ b/meta-openeuler/recipes-core/less/less_590.bb @@ -26,26 +26,12 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504 \ DEPENDS = "ncurses" SRC_URI = "file://${BPN}/${BPN}-${PV}.tar.gz \ - file://${BPN}/backport-Create-only-one-ifile-when-a-file-is-opened-under-di.patch \ - file://${BPN}/backport-Fix-crash-when-call-set_ifilename-with-a-pointer-to-.patch \ - file://${BPN}/backport-Fix-minor-memory-leak-with-input-preprocessor.-150.patch \ - file://${BPN}/backport-Fix-Tag-not-found-error-while-looking-for-a-tag-s-lo.patch \ - file://${BPN}/backport-Ignore-SIGTSTP-in-secure-mode.patch \ - file://${BPN}/backport-Lesskey-don-t-translate-ctrl-K-in-an-EXTRA-string.patch \ - file://${BPN}/backport-Make-histpattern-return-negative-value-to-indicate-e.patch \ - file://${BPN}/backport-Protect-from-buffer-overrun.patch \ - file://${BPN}/backport-Remove-extraneous-frees-associated-with-removed-call.patch \ - file://${BPN}/backport-Remove-unnecessary-call-to-pshift-in-pappend.patch \ - file://${BPN}/backport-Reset-horizontal-shift-when-opening-a-new-file.patch \ file://${BPN}/less-394-time.patch \ " -#file://${BPN}/less-418-fsync.patch - -SRC_URI[sha256sum] = "ce5b6d2b9fc4442d7a07c93ab128d2dff2ce09a1d4f2d055b95cf28dd0dc9a9a" +SRC_URI[sha256sum] = "6aadf54be8bf57d0e2999a3c5d67b1de63808bb90deb8f77b028eafae3a08e10" UPSTREAM_CHECK_URI = "http://www.greenwoodsoftware.com/less/download.html" -#inherit autotools update-alternatives inherit autotools do_install () { -- Gitee From 704053d9989ce6abeef463d9be8abf79f8f2d4ca Mon Sep 17 00:00:00 2001 From: ShiXin Date: Tue, 11 Jan 2022 16:22:55 +0800 Subject: [PATCH 152/304] kexec-tools upgrade to 2.0.23 Signed-off-by: ShiXin --- ...-tools_2.0.20.bb => kexec-tools_2.0.23.bb} | 32 +++---------------- 1 file changed, 4 insertions(+), 28 deletions(-) rename meta-openeuler/recipes-kernel/kexec/{kexec-tools_2.0.20.bb => kexec-tools_2.0.23.bb} (61%) diff --git a/meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.20.bb b/meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.23.bb similarity index 61% rename from meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.20.bb rename to meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.23.bb index e8cc09d3cc7..43f8c93a0af 100644 --- a/meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.20.bb +++ b/meta-openeuler/recipes-kernel/kexec/kexec-tools_2.0.23.bb @@ -9,38 +9,14 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=ea5bed2f60d357618ca161ad539f7c0a \ DEPENDS = "zlib" SRC_URI = "file://kexec-tools/kexec-tools-${PV}.tar.xz \ - file://kexec-tools/kexec-tools-2.0.20-fix-broken-multiboot2-buliding-for-i386.patch \ - file://kexec-tools/kexec-tools-2.0.20-Remove-duplicated-variable-declarations.patch \ - file://kexec-tools/kexec-add-variant-helper-functions-for-handling-memory-regions.patch \ - file://kexec-tools/arm64-kexec-allocate-memory-space-avoiding-reserved-regions.patch \ - file://kexec-tools/x86-Fix-PAGE_OFFSET-for-kernels-since-4.20.patch \ - file://kexec-tools/Cleanup-remove-the-read_elf_kcore.patch \ - file://kexec-tools/Fix-an-error-definition-about-the-variable-fname.patch \ - file://kexec-tools/Cleanup-move-it-back-from-util_lib-elf_info.c.patch \ - file://kexec-tools/Limit-the-size-of-vmcore-dmesg.txt-to-2G.patch \ - file://kexec-tools/vmcore-dmesg-vmcore-dmesg.c-Fix-shifting-error-reported-by-cppcheck.patch \ - file://kexec-tools/kexec-tools-Fix-possible-out-of-bounds-access-in-ifdown.patch \ - file://kexec-tools/kexec-tools-Fix-kexec_file_load-2-error-handling.patch \ - file://kexec-tools/kexec-tools-Reset-getopt-before-falling-back-to-legacy.patch \ - file://kexec-tools/kexec-support-parsing-the-string-Reserved-to-get-the-correct-e820-reserved-region.patch \ - file://kexec-tools/arm64-kdump-deal-with-a-lot-of-resource-entries-in-proc-iomem.patch \ -" -SRC_URI_append_aarch64 += " \ file://kexec-tools/arm64-support-more-than-one-crash-kernel-regions.patch \ -" -SRC_URI_append += " \ file://kexec-tools/kexec-Add-quick-kexec-support.patch \ -" -SRC_URI_append_aarch64 += " \ file://kexec-tools/kexec-Quick-kexec-implementation-for-arm64.patch \ + file://kdump \ + file://kdump.conf \ + file://kdump.service \ " -SRC_URI_append += " \ - file://kexec-tools/backport-print-add-support-for-lockless-ringbuffer.patch \ - file://kdump \ - file://kdump.conf \ - file://kdump.service \ -" -SRC_URI[sha256sum] = "dad8077f0315445d1f6335579fc4ade222facf82a67124974c7be5303ba4f8c8" +SRC_URI[sha256sum] = "aa63cd6c7dd95b06ceba6240a7fdc6792789cada75a655e6714987175224241b" inherit autotools -- Gitee From 8c4d69059f3456a53c9652fe4113b3ad13dbcd92 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Wed, 12 Jan 2022 16:02:28 +0800 Subject: [PATCH 153/304] add recipe for dosfstools Signed-off-by: lixiaoyong --- .../recipes-core/dosfstools/dosfstools_4.2.bb | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 meta-openeuler/recipes-core/dosfstools/dosfstools_4.2.bb diff --git a/meta-openeuler/recipes-core/dosfstools/dosfstools_4.2.bb b/meta-openeuler/recipes-core/dosfstools/dosfstools_4.2.bb new file mode 100644 index 00000000000..3c26fb9e5ed --- /dev/null +++ b/meta-openeuler/recipes-core/dosfstools/dosfstools_4.2.bb @@ -0,0 +1,26 @@ +# dosfstools OE build file +# Copyright (C) 2004-2006, Advanced Micro Devices, Inc. All Rights Reserved +# Copyright (C) 2015, Sören Brinkmann All Rights Reserved +# Released under the MIT license (see packages/COPYING) +SUMMARY = "DOS FAT Filesystem Utilities" +HOMEPAGE = "https://github.com/dosfstools/dosfstools" +SECTION = "base" +LICENSE = "GPLv3" +LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" + +SRC_URI = "file://dosfstools/${BP}.tar.gz" +SRC_URI[sha256sum] = "64926eebf90092dca21b14259a5301b7b98e7b1943e8a201c7d726084809b527" + +UPSTREAM_CHECK_URI = "https://github.com/dosfstools/dosfstools/releases" + +inherit autotools gettext pkgconfig + +EXTRA_OECONF = "--enable-compat-symlinks --without-iconv" + +CFLAGS += "-D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" + +BBCLASSEXTEND = "native nativesdk" + +ALTERNATIVE_PRIORITY = "100" +ALTERNATIVE_${PN} = "mkfs.vfat" +ALTERNATIVE_LINK_NAME[mkfs.vfat] = "${sbindir}/mkfs.vfat" -- Gitee From 5c8fc5340e6998ede68df6469337a46ec6a0daa1 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Wed, 12 Jan 2022 16:03:32 +0800 Subject: [PATCH 154/304] add recipe for libnl Signed-off-by: lixiaoyong --- .../recipes-core/libnl/files/run-ptest | 16 ++++ .../recipes-core/libnl/libnl_3.5.0.bb | 76 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100755 meta-openeuler/recipes-core/libnl/files/run-ptest create mode 100644 meta-openeuler/recipes-core/libnl/libnl_3.5.0.bb diff --git a/meta-openeuler/recipes-core/libnl/files/run-ptest b/meta-openeuler/recipes-core/libnl/files/run-ptest new file mode 100755 index 00000000000..e5c9eb0a328 --- /dev/null +++ b/meta-openeuler/recipes-core/libnl/files/run-ptest @@ -0,0 +1,16 @@ +#!/bin/sh + +num_fail=0 + +for test in check* +do + ./"$test" \ + && echo "PASS: $test" \ + || { + echo "FAIL: $test" + num_fail=$(( ${num_fail} + 1)) + } + +done + +exit $num_fail diff --git a/meta-openeuler/recipes-core/libnl/libnl_3.5.0.bb b/meta-openeuler/recipes-core/libnl/libnl_3.5.0.bb new file mode 100644 index 00000000000..8250c3100ec --- /dev/null +++ b/meta-openeuler/recipes-core/libnl/libnl_3.5.0.bb @@ -0,0 +1,76 @@ +SUMMARY = "A library for applications dealing with netlink sockets" +DESCRIPTION = "The libnl suite is a collection of libraries providing \ +APIs to netlink protocol based Linux kernel interfaces. libnl is the core \ +library implementing the fundamentals required to use the netlink protocol \ +such as socket handling, message construction and parsing, and sending \ +and receiving of data." +HOMEPAGE = "http://www.infradead.org/~tgr/libnl/" +SECTION = "libs/network" +LICENSE = "LGPLv2.1" +LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c" + +DEPENDS = "flex-native bison-native" + +SRC_URI = "file://libnl3/${BP}.tar.gz \ + file://libnl3/backport-lib-add-include-netlink-private-nl-auto-h-header.patch \ + file://libnl3/backport-lib-use-proper-int-type-for-id-attributes-in-nl_object_identical.patch \ + file://libnl3/backport-route-link-add-RTNL_LINK_REASM_OVERLAPS-stat.patch \ + file://libnl3/backport-route-link-Check-for-null-pointer-in-macvlan.patch \ + file://libnl3/backport-rtnl-link-fix-leaking-rtnl_link_af_ops-in-link_msg_parser.patch \ + file://libnl3/backport-rtnl-route-fix-NLE_NOMEM-handling-in-parse_multipath.patch \ + file://libnl3/solve-redefinition-of-struct-ipv6_mreq.patch \ + file://run-ptest \ + " + +SRC_URI[md5sum] = "74ba57b1b1d6f9f92268aa8141d8e8e4" +SRC_URI[sha256sum] = "352133ec9545da76f77e70ccb48c9d7e5324d67f6474744647a7ed382b5e05fa" + +UPSTREAM_CHECK_URI = "https://github.com/thom311/${BPN}/releases" + +inherit autotools pkgconfig ptest + +FILES_${PN} = "${libdir}/libnl-3.so.* \ + ${libdir}/libnl.so.* \ + ${sysconfdir}" +RREPLACES_${PN} = "libnl2" +RCONFLICTS_${PN} = "libnl2" + +FILES_${PN}-dev += "${libdir}/libnl/cli/*/*.la" +FILES_${PN}-staticdev += "${libdir}/libnl/cli/*/*.a" + +PACKAGES += "${PN}-cli ${PN}-genl ${PN}-idiag ${PN}-nf ${PN}-route ${PN}-xfrm" +FILES_${PN}-cli = "${libdir}/libnl-cli-3.so.* \ + ${libdir}/libnl/cli/*/*.so \ + ${bindir}/genl-ctrl-list \ + ${bindir}/idiag-socket-details \ + ${bindir}/nf-* \ + ${bindir}/nl-*" +FILES_${PN}-genl = "${libdir}/libnl-genl-3.so.* \ + ${libdir}/libnl-genl.so.*" +FILES_${PN}-idiag = "${libdir}/libnl-idiag-3.so.*" +FILES_${PN}-nf = "${libdir}/libnl-nf-3.so.*" +FILES_${PN}-route = "${libdir}/libnl-route-3.so.*" +FILES_${PN}-xfrm = "${libdir}/libnl-xfrm-3.so.*" +RREPLACES_${PN}-genl = "libnl-genl2" +RCONFLICTS_${PN}-genl = "libnl-genl2" + +RDEPENDS_${PN}-ptest += "libcheck" +DEPENDS += "${@bb.utils.contains('PTEST_ENABLED', '1', 'libcheck', '', d)}" + +# make sure the tests don't link against wrong so file +EXTRA_OECONF += "${@bb.utils.contains('PTEST_ENABLED', '1', '--disable-rpath', '', d)}" + +do_compile_ptest() { + # hack to remove the call to `make runtest-TESTS` + sed -i 's/$(MAKE) $(AM_MAKEFLAGS) runtest-TESTS//g' Makefile + oe_runmake check +} + +do_install_ptest(){ + # legacy? tests are also installed, but ptest-runner will not run them + # upstream are not running these tests in their CI pipeline + # issue opened https://github.com/thom311/libnl/issues/270 + install -m 0755 tests/.libs/* ${D}${PTEST_PATH}/ +} + +BBCLASSEXTEND = "native nativesdk" -- Gitee From 1c13762e726ee437e426bd0e6b714315542868ba Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 13 Jan 2022 10:13:29 +0800 Subject: [PATCH 155/304] add recipe for libpcap Signed-off-by: lixiaoyong --- .../recipes-core/libpcap/libpcap_1.10.1.bb | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 meta-openeuler/recipes-core/libpcap/libpcap_1.10.1.bb diff --git a/meta-openeuler/recipes-core/libpcap/libpcap_1.10.1.bb b/meta-openeuler/recipes-core/libpcap/libpcap_1.10.1.bb new file mode 100644 index 00000000000..6cd9ad0b8a9 --- /dev/null +++ b/meta-openeuler/recipes-core/libpcap/libpcap_1.10.1.bb @@ -0,0 +1,45 @@ +SUMMARY = "Interface for user-level network packet capture" +DESCRIPTION = "Libpcap provides a portable framework for low-level network \ +monitoring. Libpcap can provide network statistics collection, \ +security monitoring and network debugging." +HOMEPAGE = "http://www.tcpdump.org/" +BUGTRACKER = "http://sourceforge.net/tracker/?group_id=53067&atid=469577" +SECTION = "libs/network" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=5eb289217c160e2920d2e35bddc36453 \ + file://pcap.h;beginline=1;endline=32;md5=39af3510e011f34b8872f120b1dc31d2" +DEPENDS = "flex-native bison-native" + +SRC_URI = "file://libpcap/${BP}.tar.gz \ + file://libpcap/backport-0003-pcap-linux-apparently-ctc-interfaces-on-s390-has-eth.patch \ + file://libpcap/backport-pcap-config-mitigate-multilib-conflict.patch \ + " +SRC_URI[sha256sum] = "ed285f4accaf05344f90975757b3dbfe772ba41d1c401c2648b7fa45b711bdd4" + +inherit autotools binconfig-disabled pkgconfig + +BINCONFIG = "${bindir}/pcap-config" + +# Explicitly disable dag support. We don't have recipe for it and if enabled here, +# configure script poisons the include dirs with /usr/local/include even when the +# support hasn't been detected. +EXTRA_OECONF = " \ + --with-pcap=linux \ + --without-dag \ + " + +PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'ipv6', d)} \ +" +PACKAGECONFIG[ipv6] = "--enable-ipv6,--disable-ipv6," +PACKAGECONFIG[libnl] = "--with-libnl,--without-libnl,libnl" + +do_configure_prepend () { + #remove hardcoded references to /usr/include + sed 's|\([ "^'\''I]\+\)/usr/include/|\1${STAGING_INCDIR}/|g' -i ${S}/configure.ac + if [ ! -e ${S}/acinclude.m4 ]; then + cat ${S}/aclocal.m4 > ${S}/acinclude.m4 + fi + sed -i -e's,^V_RPATH_OPT=.*$,V_RPATH_OPT=,' ${S}/pcap-config.in +} + +BBCLASSEXTEND = "native" -- Gitee From 447785b8b8d72cbe1debc5c958f1e75eb3e6878f Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 13 Jan 2022 10:14:32 +0800 Subject: [PATCH 156/304] add recipe for libhugetlbfs Signed-off-by: lixiaoyong --- .../libhugetlbfs/libhugetlbfs_2.23.bb | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 meta-openeuler/recipes-core/libhugetlbfs/libhugetlbfs_2.23.bb diff --git a/meta-openeuler/recipes-core/libhugetlbfs/libhugetlbfs_2.23.bb b/meta-openeuler/recipes-core/libhugetlbfs/libhugetlbfs_2.23.bb new file mode 100644 index 00000000000..4b6f150d62a --- /dev/null +++ b/meta-openeuler/recipes-core/libhugetlbfs/libhugetlbfs_2.23.bb @@ -0,0 +1,59 @@ +SUMMARY = "A library which provides easy access to huge pages of memory" +HOMEPAGE = "https://github.com/libhugetlbfs/libhugetlbfs" +LICENSE = "LGPL-2.1" +LIC_FILES_CHKSUM = "file://LGPL-2.1;md5=2d5025d4aa3495befef8f17206a5b0a1" + +SRC_URI = "file://libhugetlbfs/${BP}.tar.gz \ + file://libhugetlbfs/0000-build_flags.patch \ + file://libhugetlbfs/Disable-hugepage-backed-malloc-if-__morecore-is-not-.patch \ + file://libhugetlbfs/libhugetlbfs-make-cflags.patch \ +" +SRC_URI[sha256sum] = "b70672f1e807c61b7eb3adf41c1903b42917951f2e7f8aef6821841700c04479" + +COMPATIBLE_HOST = "(i.86|x86_64|powerpc|powerpc64|aarch64|arm).*-linux*" + +LIBARGS = "LIB32=${baselib} LIB64=${baselib}" +LIBHUGETLBFS_ARCH = "${TARGET_ARCH}" +LIBHUGETLBFS_ARCH_powerpc = "ppc" +LIBHUGETLBFS_ARCH_powerpc64 = "ppc64" +LIBHUGETLBFS_ARCH_powerpc64le = "ppc64" +EXTRA_OEMAKE = "'ARCH=${LIBHUGETLBFS_ARCH}' 'OPT=${CFLAGS}' 'CC=${CC}' ${LIBARGS} BUILDTYPE=NATIVEONLY V=2" +PARALLEL_MAKE = "" +CFLAGS += "-fexpensive-optimizations -frename-registers -fomit-frame-pointer -g0" + +export HUGETLB_LDSCRIPT_PATH="${S}/ldscripts" + +TARGET_CC_ARCH += "${LDFLAGS}" + +#The CUSTOM_LDSCRIPTS doesn't work with the gold linker +#inherit cpan-base +do_configure() { + if [ "${@bb.utils.filter('DISTRO_FEATURES', 'ld-is-gold', d)}" ]; then + sed -i 's/CUSTOM_LDSCRIPTS = yes/CUSTOM_LDSCRIPTS = no/' Makefile + fi +} + +do_install() { + oe_runmake PREFIX=${prefix} DESTDIR=${D} \ + install + rm ${D}/${libdir}/libhugetlbfs.a + rm ${D}/${libdir}/../bin/hugeadm + rm ${D}/${libdir}/../bin/hugectl + rm ${D}/${libdir}/../bin/hugeedit + rm ${D}/${libdir}/../bin/pagesize + rm -rf ${D}/${libdir}/../share/libhugetlbfs + rm -rf ${D}/usr/bin + rm -rf ${D}/${libdir}/libhugetlbfs + rm -rf ${D}/usr/share + rm -rf ${D}/usr/include +} + + +FILES_${PN} += "${libdir}/*.so" +FILES_${PN}-dev = "${includedir}" +FILES_${PN}-dbg += "${libdir}/libhugetlbfs/tests/obj32/.debug ${libdir}/libhugetlbfs/tests/obj64/.debug" + +INSANE_SKIP_${PN} = "dev-so" + +INHIBIT_PACKAGE_STRIP = "1" +INHIBIT_PACKAGE_DEBUG_SPLIT = "1" -- Gitee From f7647bbae215c4e65dd63f261fdf56930b598e6e Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 13 Jan 2022 10:33:28 +0800 Subject: [PATCH 157/304] add msgmerge for e2fsprogs Signed-off-by: lixiaoyong --- meta-openeuler/conf/local.conf.sample | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index 0c3f35558ad..c14c5a18641 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -273,7 +273,8 @@ BB_DISKMON_DIRS ??= "\ CONF_VERSION = "2" HOSTTOOLS += "python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool \ ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader \ - autoupdate libtool libtoolize pkg-config cmake fmt gperf m4 createrepo_c dnf ldconfig msgfmt" + autoupdate libtool libtoolize pkg-config cmake fmt gperf m4 createrepo_c dnf ldconfig \ + msgfmt msgmerge" HOSTTOOLS_remove += "diffstat lz4c pzstd rpcgen" SANITY_REQUIRED_UTILITIES_remove += "diffstat chrpath" CONNECTIVITY_CHECK_URIS = "" -- Gitee From d59a8a819234b2a7367db194000a208f7877daa5 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 13 Jan 2022 10:34:56 +0800 Subject: [PATCH 158/304] add reciper for e2fsprogs Signed-off-by: lixiaoyong --- .../recipes-core/e2fsprogs/e2fsprogs.inc | 26 ++++ .../e2fsprogs/e2fsprogs/run-ptest | 10 ++ .../e2fsprogs/e2fsprogs_1.46.4.bb | 137 ++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 meta-openeuler/recipes-core/e2fsprogs/e2fsprogs.inc create mode 100644 meta-openeuler/recipes-core/e2fsprogs/e2fsprogs/run-ptest create mode 100644 meta-openeuler/recipes-core/e2fsprogs/e2fsprogs_1.46.4.bb diff --git a/meta-openeuler/recipes-core/e2fsprogs/e2fsprogs.inc b/meta-openeuler/recipes-core/e2fsprogs/e2fsprogs.inc new file mode 100644 index 00000000000..aed06a00f08 --- /dev/null +++ b/meta-openeuler/recipes-core/e2fsprogs/e2fsprogs.inc @@ -0,0 +1,26 @@ +SUMMARY = "Ext2 Filesystem Utilities" +DESCRIPTION = "The Ext2 Filesystem Utilities (e2fsprogs) contain all of the standard utilities for creating, \ +fixing, configuring , and debugging ext2 filesystems." +HOMEPAGE = "http://e2fsprogs.sourceforge.net/" + +LICENSE = "GPLv2 & LGPLv2 & BSD & MIT" +LICENSE_e2fsprogs-dumpe2fs = "GPLv2" +LICENSE_e2fsprogs-e2fsck = "GPLv2" +LICENSE_e2fsprogs-mke2fs = "GPLv2" +LICENSE_e2fsprogs-tune2fs = "GPLv2" +LICENSE_e2fsprogs-badblocks = "GPLv2" +LIC_FILES_CHKSUM = "file://NOTICE;md5=d50be0580c0b0a7fbc7a4830bbe6c12b \ + file://lib/ext2fs/ext2fs.h;beginline=1;endline=9;md5=596a8dedcb4e731c6b21c7a46fba6bef \ + file://lib/e2p/e2p.h;beginline=1;endline=7;md5=8a74ade8f9d65095d70ef2d4bf48e36a \ + file://lib/uuid/uuid.h.in;beginline=1;endline=32;md5=dbb8079e114a5f841934b99e59c8820a \ + file://lib/uuid/COPYING;md5=58dcd8452651fc8b07d1f65ce07ca8af \ + file://lib/et/et_name.c;beginline=1;endline=11;md5=ead236447dac7b980dbc5b4804d8c836 \ + file://lib/ss/ss.h;beginline=1;endline=20;md5=6e89ad47da6e75fecd2b5e0e81e1d4a6" +SECTION = "base" +DEPENDS = "util-linux attr" + +SRC_URI = "file://e2fsprogs/${BP}.tar.xz" + +inherit autotools gettext texinfo pkgconfig multilib_header ptest + +BBCLASSEXTEND = "native nativesdk" diff --git a/meta-openeuler/recipes-core/e2fsprogs/e2fsprogs/run-ptest b/meta-openeuler/recipes-core/e2fsprogs/e2fsprogs/run-ptest new file mode 100644 index 00000000000..c97c0377e9c --- /dev/null +++ b/meta-openeuler/recipes-core/e2fsprogs/e2fsprogs/run-ptest @@ -0,0 +1,10 @@ +#!/bin/sh + +cd ./test +SKIP_SLOW_TESTS=yes ./test_script | sed -u -e '/:[[:space:]]ok/s/^/PASS: /' -e '/:[[:space:]]failed/s/^/FAIL: /' -e '/:[[:space:]]skipped/s/^/SKIP: /' +rm -rf /var/volatile/tmp/*e2fsprogs* +rm -f tmp-* +rm -f *.tmp +rm -f *.ok +rm -f *.failed +rm -f *.log diff --git a/meta-openeuler/recipes-core/e2fsprogs/e2fsprogs_1.46.4.bb b/meta-openeuler/recipes-core/e2fsprogs/e2fsprogs_1.46.4.bb new file mode 100644 index 00000000000..29b317af440 --- /dev/null +++ b/meta-openeuler/recipes-core/e2fsprogs/e2fsprogs_1.46.4.bb @@ -0,0 +1,137 @@ +require e2fsprogs.inc + +SRC_URI += "file://e2fsprogs/0001-e2fsprogs-set-hugefile-from-4T-to-1T-in-hugefile-tes.patch \ + file://e2fsprogs/0002-libss-add-newer-libreadline.so.8-to-dlopen-path.patch \ + file://e2fsprogs/0003-tests-update-expect-files-for-f_mmp_garbage.patch \ + file://e2fsprogs/0004-tests-update-expect-files-for-f_large_dir-and-f_larg.patch \ + file://run-ptest \ +" + +UPSTREAM_CHECK_GITTAGREGEX = "v(?P\d+\.\d+(\.\d+)*)$" + +EXTRA_OECONF += "--libdir=${base_libdir} --sbindir=${base_sbindir} \ + --enable-elf-shlibs --disable-libuuid --disable-uuidd \ + --disable-libblkid --enable-verbose-makecmds \ + --with-crond-dir=no" + +EXTRA_OECONF_darwin = "--libdir=${base_libdir} --sbindir=${base_sbindir} --enable-bsd-shlibs" + +PACKAGECONFIG ??= "" +PACKAGECONFIG[fuse] = '--enable-fuse2fs,--disable-fuse2fs,fuse' + +# make locale rules sometimes fire, sometimes don't as git doesn't preserve +# file mktime. Touch the files introducing non-determinism to the build +do_compile_prepend (){ + find ${S}/po -type f -name "*.po" -exec touch {} + +} + +do_install () { + oe_runmake 'DESTDIR=${D}' install + oe_runmake 'DESTDIR=${D}' install-libs + # We use blkid from util-linux now so remove from here + rm -f ${D}${base_libdir}/libblkid* + rm -rf ${D}${includedir}/blkid + rm -f ${D}${base_libdir}/pkgconfig/blkid.pc + rm -f ${D}${base_sbindir}/blkid + rm -f ${D}${base_sbindir}/fsck + rm -f ${D}${base_sbindir}/findfs + + # e2initrd_helper and the pkgconfig files belong in libdir + if [ ! ${D}${libdir} -ef ${D}${base_libdir} ]; then + install -d ${D}${libdir} + mv ${D}${base_libdir}/e2initrd_helper ${D}${libdir} + mv ${D}${base_libdir}/pkgconfig ${D}${libdir} + fi + + oe_multilib_header ext2fs/ext2_types.h + install -d ${D}${base_bindir} + mv ${D}${bindir}/chattr ${D}${base_bindir}/chattr.e2fsprogs + + install -v -m 755 ${S}/contrib/populate-extfs.sh ${D}${base_sbindir}/ + + # Clean host path (build directory) in compile_et, mk_cmds + sed -i -e "s,\(ET_DIR=.*\)${S}/lib/et\(.*\),\1${datadir}/et\2,g" ${D}${bindir}/compile_et + sed -i -e "s,\(SS_DIR=.*\)${S}/lib/ss\(.*\),\1${datadir}/ss\2,g" ${D}${bindir}/mk_cmds +} + +# Need to find the right mke2fs.conf file +e2fsprogs_conf_fixup () { + for i in mke2fs mkfs.ext2 mkfs.ext3 mkfs.ext4; do + create_wrapper ${D}${base_sbindir}/$i MKE2FS_CONFIG=${sysconfdir}/mke2fs.conf + done +} + +do_install_append_class-native() { + e2fsprogs_conf_fixup +} + +do_install_append_class-nativesdk() { + e2fsprogs_conf_fixup +} + +do_install_append_class-target() { + mv ${D}${base_sbindir}/mke2fs ${D}${base_sbindir}/mke2fs.e2fsprogs + mv ${D}${base_sbindir}/mkfs.ext2 ${D}${base_sbindir}/mkfs.ext2.e2fsprogs + mv ${D}${base_sbindir}/tune2fs ${D}${base_sbindir}/tune2fs.e2fsprogs +} + +RDEPENDS_e2fsprogs = "e2fsprogs-badblocks e2fsprogs-dumpe2fs" +RRECOMMENDS_e2fsprogs = "e2fsprogs-mke2fs e2fsprogs-e2fsck" + +PACKAGES =+ "e2fsprogs-badblocks e2fsprogs-dumpe2fs e2fsprogs-e2fsck e2fsprogs-e2scrub e2fsprogs-mke2fs e2fsprogs-resize2fs e2fsprogs-tune2fs" +PACKAGES =+ "libcomerr libss libe2p libext2fs" + +FILES_e2fsprogs-dumpe2fs = "${base_sbindir}/dumpe2fs" +FILES_e2fsprogs-resize2fs = "${base_sbindir}/resize2fs*" +FILES_e2fsprogs-e2fsck = "${base_sbindir}/e2fsck ${base_sbindir}/fsck.ext*" +FILES_e2fsprogs-e2scrub = "${base_sbindir}/e2scrub*" +FILES_e2fsprogs-mke2fs = "${base_sbindir}/mke2fs.e2fsprogs ${base_sbindir}/mkfs.ext* ${sysconfdir}/mke2fs.conf" +FILES_e2fsprogs-tune2fs = "${base_sbindir}/tune2fs.e2fsprogs ${base_sbindir}/e2label" +FILES_e2fsprogs-badblocks = "${base_sbindir}/badblocks" +FILES_libcomerr = "${base_libdir}/libcom_err.so.*" +FILES_libss = "${base_libdir}/libss.so.*" +FILES_libe2p = "${base_libdir}/libe2p.so.*" +FILES_libext2fs = "${libdir}/e2initrd_helper ${base_libdir}/libext2fs.so.*" +FILES_${PN}-dev += "${datadir}/*/*.awk ${datadir}/*/*.sed ${base_libdir}/*.so ${bindir}/compile_et ${bindir}/mk_cmds" + +ALTERNATIVE_${PN} = "chattr" +ALTERNATIVE_PRIORITY = "100" +ALTERNATIVE_LINK_NAME[chattr] = "${base_bindir}/chattr" +ALTERNATIVE_TARGET[chattr] = "${base_bindir}/chattr.e2fsprogs" + +ALTERNATIVE_${PN}-doc = "fsck.8" +ALTERNATIVE_LINK_NAME[fsck.8] = "${mandir}/man8/fsck.8" + +ALTERNATIVE_${PN}-mke2fs = "mke2fs mkfs.ext2" +ALTERNATIVE_LINK_NAME[mke2fs] = "${base_sbindir}/mke2fs" +ALTERNATIVE_LINK_NAME[mkfs.ext2] = "${base_sbindir}/mkfs.ext2" + +ALTERNATIVE_${PN}-tune2fs = "tune2fs" +ALTERNATIVE_LINK_NAME[tune2fs] = "${base_sbindir}/tune2fs" + +RDEPENDS_e2fsprogs-e2scrub = "bash" +RDEPENDS_e2fsprogs-e2scrub_remove += "bash" +RDEPENDS_${PN}-ptest += "coreutils procps bash bzip2 diffutils perl sed" +RDEPENDS_${PN}-ptest += "e2fsprogs-badblocks e2fsprogs-dumpe2fs e2fsprogs-e2fsck e2fsprogs-mke2fs e2fsprogs-resize2fs e2fsprogs-tune2fs" + +do_compile_ptest() { + oe_runmake -C ${B}/tests +} + +do_install_ptest() { + # This file's permissions depends on the host umask so be deterministic + chmod 0644 ${B}/tests/test_data.tmp + cp -R --no-dereference --preserve=mode,links -v ${B}/tests ${D}${PTEST_PATH}/test + cp -R --no-dereference --preserve=mode,links -v ${S}/tests/* ${D}${PTEST_PATH}/test + sed -e 's!../e2fsck/e2fsck!e2fsck!g' \ + -e 's!../misc/tune2fs!tune2fs!g' -i ${D}${PTEST_PATH}/test/*/expect* + sed -e 's!../e2fsck/e2fsck!${base_sbindir}/e2fsck!g' -i ${D}${PTEST_PATH}/test/*/script + + # Remove various files + find "${D}${PTEST_PATH}" -type f \ + \( -name 'Makefile' -o -name 'Makefile.in' -o -name '*.o' -o -name '*.c' -o -name '*.h' \)\ + -exec rm -f {} + + + install -d ${D}${PTEST_PATH}/lib + install -m 0644 ${B}/lib/config.h ${D}${PTEST_PATH}/lib/ +} -- Gitee From 9c0e57e48adee4fa9277ab9bba333e1ab0695971 Mon Sep 17 00:00:00 2001 From: lisimin Date: Thu, 13 Jan 2022 14:14:33 +0800 Subject: [PATCH 159/304] release Image and vmlinux for kernel Signed-off-by: lisimin --- meta-openeuler/conf/machine/qemu-common.inc | 2 ++ meta-openeuler/recipes-core/images/openeuler-image.bb | 5 ++++- meta-openeuler/recipes-kernel/linux/linux-openeuler.bb | 7 +++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/meta-openeuler/conf/machine/qemu-common.inc b/meta-openeuler/conf/machine/qemu-common.inc index 8cc61831956..89943981703 100644 --- a/meta-openeuler/conf/machine/qemu-common.inc +++ b/meta-openeuler/conf/machine/qemu-common.inc @@ -1 +1,3 @@ MACHINEOVERRIDES =. "eulermachine:" +KERNEL_IMAGETYPE ?= "zImage" +KERNEL_IMAGETYPE_FOR_MAKE ?= "zImage" diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 1e5c1edff8c..50e3a02d89d 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -37,9 +37,11 @@ fakeroot do_openeuler_initrd() { test -d "${rootfs_dir}" && rm -r "${rootfs_dir}" cp -a "${WORKDIR}/rootfs" "${rootfs_dir}" pushd "${rootfs_dir}" - local imagename=$(ls boot/*Image-* | xargs basename) + local imagename=$(ls boot/${KERNEL_IMAGETYPE}-* | xargs basename) rm -f "${OUTPUT_DIR}"/*Image "${OUTPUT_DIR}"/initrd mv boot/${imagename} "${OUTPUT_DIR}"/$(echo ${imagename} | cut -d "-" -f 1) + mv boot/vmlinux* "${OUTPUT_DIR}"/ + mv boot/Image* "${OUTPUT_DIR}"/ echo "${HOSTNAME}" > etc/hostname chmod +x etc/rc.d/* touch etc/security/opasswd @@ -130,6 +132,7 @@ libarchive \ libevent \ iSulad \ kernel-module-overlay-5.10.0 \ +kernel-img \ " IMAGE_INSTALL += "${ROOTFS_BOOTSTRAP_INSTALL} ${IMAGE_INSTALL_normal} ${IMAGE_INSTALL_pro}" diff --git a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb index 9d01d839f24..f8f8320aceb 100644 --- a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb +++ b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb @@ -14,7 +14,6 @@ inherit kernel-version kernel-module-split export EXTRA_CFLAGS = "${CFLAGS}" export EXTRA_LDFLAGS = "${LDFLAGS}" -EXTRA_OEMAKE = "CC='${CC}' LD='${CCLD}' V=1 ARCH=${ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y HOSTCC='${BUILD_CC}' HOSTCPP='${BUILD_CPP}'" EXTRA_OEMAKE = "CC='${CC}' V=1 ARCH=${ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y HOSTCC='${BUILD_CC}' HOSTCPP='${BUILD_CPP}'" PACKAGES_DYNAMIC += "^kernel-module-.*" @@ -25,13 +24,12 @@ KERNEL_CLASSES ?= " kernel-uimage " inherit ${KERNEL_CLASSES} KERNEL_VERSION = "${@get_kernelversion_headers('${B}')}" -KERNEL_IMAGETYPE_FOR_MAKE = "zImage" KERNEL_PACKAGE_NAME ??= "kernel" -KERNEL_IMAGETYPE ?= "zImage" # kernel-base becomes kernel-${KERNEL_VERSION} # kernel-image becomes kernel-image-${KERNEL_VERSION} -PACKAGES = "${PN} ${KERNEL_PACKAGE_NAME} ${KERNEL_PACKAGE_NAME}-base ${KERNEL_PACKAGE_NAME}-vmlinux ${KERNEL_PACKAGE_NAME}-image ${KERNEL_PACKAGE_NAME}-dev ${KERNEL_PACKAGE_NAME}-modules" +PACKAGES = "${PN} ${KERNEL_PACKAGE_NAME} ${KERNEL_PACKAGE_NAME}-base ${KERNEL_PACKAGE_NAME}-vmlinux ${KERNEL_PACKAGE_NAME}-image ${KERNEL_PACKAGE_NAME}-dev ${KERNEL_PACKAGE_NAME}-modules ${KERNEL_PACKAGE_NAME}-img" FILES_${PN} = "" +FILES_${KERNEL_PACKAGE_NAME}-img = "/boot/Image-${KERNEL_VERSION}" FILES_${KERNEL_PACKAGE_NAME}-base = "${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.order ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.builtin ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.builtin.modinfo" FILES_${KERNEL_PACKAGE_NAME}-image = "/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION} /boot/vmlinux-${KERNEL_VERSION}" FILES_${KERNEL_PACKAGE_NAME}-dev = "/boot/System.map* /boot/Module.symvers* /boot/config* ${KERNEL_SRC_PATH} ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/build" @@ -159,6 +157,7 @@ do_install() { install -m 0644 System.map ${D}/boot/System.map-${KERNEL_VERSION} install -m 0644 .config ${D}/boot/config-${KERNEL_VERSION} install -m 0644 vmlinux ${D}/boot/vmlinux-${KERNEL_VERSION} + install -m 0644 ${KERNEL_OUTPUT_DIR}/Image ${D}/${KERNEL_IMAGEDEST}/Image-${KERNEL_VERSION} [ -e Module.symvers ] && install -m 0644 Module.symvers ${D}/boot/Module.symvers-${KERNEL_VERSION} install -d ${D}${sysconfdir}/modules-load.d install -d ${D}${sysconfdir}/modprobe.d -- Gitee From 930547ced3d5a6a6cde49d7d09e4016c33ad3337 Mon Sep 17 00:00:00 2001 From: lisimin Date: Thu, 13 Jan 2022 15:19:13 +0800 Subject: [PATCH 160/304] change hostname and opasswd to os-base, not config when do_rootfs Signed-off-by: lisimin --- .../recipes-core/images/openeuler-image.bb | 4 ---- .../recipes-core/os-base/os-base_1.0.bb | 15 ++++++++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 50e3a02d89d..36981fe7c33 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -29,7 +29,6 @@ TOOLCHAIN_TARGET_TASK_remove += "${@multilib_pkg_extend(d, 'packagegroup-core-st TOOLCHAIN_HOST_TASK_task-populate-sdk-ext = "" TOOLCHAIN_HOST_TASK = "" OUTPUT_DIR = "${TOPDIR}/output" -HOSTNAME = "openeuler" fakeroot do_openeuler_initrd() { test -d "${OUTPUT_DIR}" || mkdir -p "${OUTPUT_DIR}" @@ -42,10 +41,7 @@ fakeroot do_openeuler_initrd() { mv boot/${imagename} "${OUTPUT_DIR}"/$(echo ${imagename} | cut -d "-" -f 1) mv boot/vmlinux* "${OUTPUT_DIR}"/ mv boot/Image* "${OUTPUT_DIR}"/ - echo "${HOSTNAME}" > etc/hostname chmod +x etc/rc.d/* - touch etc/security/opasswd - chmod 600 etc/security/opasswd rm -r ./boot chown -R root:root ./* find . | cpio -H newc -o | gzip -c > "${OUTPUT_DIR}"/initrd diff --git a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb index bfd77f44809..c41a3665a2c 100644 --- a/meta-openeuler/recipes-core/os-base/os-base_1.0.bb +++ b/meta-openeuler/recipes-core/os-base/os-base_1.0.bb @@ -25,6 +25,8 @@ SRC_URI = "file://bashrc \ file://rc.sysinit \ file://rc.local" +hostname = "openeuler" + do_install() { install -d ${D}/etc cp ${WORKDIR}/bashrc ${D}/etc/ @@ -39,9 +41,9 @@ do_install() { install -m 0600 ${WORKDIR}/shadow ${D}/etc/ install -m 0600 ${WORKDIR}/sysctl.conf ${D}/etc/ install -d ${D}/etc/rc.d - cp ${WORKDIR}/rc.functions ${D}/etc/rc.d - cp ${WORKDIR}/rc.sysinit ${D}/etc/rc.d - cp ${WORKDIR}/rc.local ${D}/etc/rc.d + install -m 0744 ${WORKDIR}/rc.functions ${D}/etc/rc.d + install -m 0744 ${WORKDIR}/rc.sysinit ${D}/etc/rc.d + install -m 0744 ${WORKDIR}/rc.local ${D}/etc/rc.d install -m 0755 -d ${D}/etc/init.d/ install -m 0750 ${WORKDIR}/rcS ${D}/etc/init.d/ mkdir -p ${D}/var/log/ @@ -49,6 +51,13 @@ do_install() { mkdir -p ${D}/var/run/faillock ${D}/tmp mkdir -p ${D}/proc ${D}/sys ${D}/root ${D}/dev ${D}/sys/fs/cgroup mkdir -p ${D}/var/log/audit ${D}/var/run/sshd + if [ "${hostname}" ]; then + echo ${hostname} > ${D}${sysconfdir}/hostname + echo "127.0.1.1 ${hostname}" >> ${D}${sysconfdir}/hosts + fi + mkdir -p ${D}${sysconfdir}/security/ + touch ${D}${sysconfdir}/security/opasswd + chmod 600 ${D}${sysconfdir}/security/opasswd } FILES_${PN} = "/" -- Gitee From ed048fe8df82867bd5626dc2b895a2a041777ec1 Mon Sep 17 00:00:00 2001 From: lisimin Date: Thu, 13 Jan 2022 17:48:36 +0800 Subject: [PATCH 161/304] change initrd from tar.gz to cpio.gz change image by IMAGE_PREPROCESS_COMMAND and IMAGE_POSTPROCESS_COMMAND, not custom function Signed-off-by: lisimin --- .../recipes-core/images/openeuler-image.bb | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 36981fe7c33..77cf77484d5 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -8,12 +8,15 @@ IMAGE_LINGUAS = " " LICENSE = "MIT" inherit core-image -IMAGE_TYPES = "cpio" -IMAGE_FSTYPES_DEBUGFS = "cpio" +IMAGE_FSTYPES = "cpio.gz" +IMAGE_FSTYPES_DEBUGFS = "cpio.gz" +INITRAMFS_MAXSIZE = "262144" +#delete depends to cpio-native +do_image_cpio[depends] = "" + #not add run-postinsts to PACKAGE_INSTALL, so that not fail when do_rootfs?? ROOTFS_BOOTSTRAP_INSTALL = "" -#tar:lower version has no --sort=name -IMAGE_CMD_tar = "${IMAGE_CMD_TAR} --format=posix --numeric-owner -cf ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.tar -C ${IMAGE_ROOTFS} . || [ $? -eq 1 ]" + #not depends to update-alternatives do_rootfs[depends] = "" #not depends to ldconfig-native @@ -30,24 +33,23 @@ TOOLCHAIN_HOST_TASK_task-populate-sdk-ext = "" TOOLCHAIN_HOST_TASK = "" OUTPUT_DIR = "${TOPDIR}/output" -fakeroot do_openeuler_initrd() { +delete_boot_from_rootfs() { test -d "${OUTPUT_DIR}" || mkdir -p "${OUTPUT_DIR}" - local rootfs_dir="${WORKDIR}/rootfs_tmp" - test -d "${rootfs_dir}" && rm -r "${rootfs_dir}" - cp -a "${WORKDIR}/rootfs" "${rootfs_dir}" - pushd "${rootfs_dir}" - local imagename=$(ls boot/${KERNEL_IMAGETYPE}-* | xargs basename) - rm -f "${OUTPUT_DIR}"/*Image "${OUTPUT_DIR}"/initrd - mv boot/${imagename} "${OUTPUT_DIR}"/$(echo ${imagename} | cut -d "-" -f 1) + pushd "${IMAGE_ROOTFS}" + rm -f "${OUTPUT_DIR}"/*Image* "${OUTPUT_DIR}"/initrd "${OUTPUT_DIR}"/vmlinux* + mv boot/${KERNEL_IMAGETYPE}-* "${OUTPUT_DIR}"/${KERNEL_IMAGETYPE} mv boot/vmlinux* "${OUTPUT_DIR}"/ mv boot/Image* "${OUTPUT_DIR}"/ - chmod +x etc/rc.d/* rm -r ./boot - chown -R root:root ./* - find . | cpio -H newc -o | gzip -c > "${OUTPUT_DIR}"/initrd popd } -addtask do_openeuler_initrd after do_image_complete before do_build + +copy_openeuler_distro() { + cp -fp ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${IMAGE_FSTYPES} "${OUTPUT_DIR}"/initrd +} + +IMAGE_PREPROCESS_COMMAND += "delete_boot_from_rootfs;" +IMAGE_POSTPROCESS_COMMAND += "copy_openeuler_distro;" #No kernel-abiversion file found, cannot run depmod, aborting USE_DEPMOD = "0" -- Gitee From 67c40cf79405f001073f9fc8d2606e054510d3b7 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Fri, 14 Jan 2022 17:21:01 +0800 Subject: [PATCH 162/304] all: clean FILESPATH and DL_DIR * use OPENEULER_SP_DIR as the software package dir of openEuler. * All openEuler software packages will be downloaded into OPENEULER_SP_DIR by provided tool. * OPENEULER_SP_DIR will be prepended into FILESEXTRAPATH of all recipes in openeuler.conf, so no need to repeat it in each recipe Signed-off-by: Wayne Ren --- meta-openeuler/classes/get_dl_dir.bbclass | 11 ----------- meta-openeuler/conf/distro/openeuler.conf | 13 +++++++------ meta-openeuler/conf/local.conf.sample | 13 ++++++++----- .../recipes-core/busybox/busybox_1.33.1.bb | 1 - .../recipes-core/clibcni/clibcni_2.0.4.bb | 2 -- meta-openeuler/recipes-core/curl/curl_7.77.0.bb | 2 -- meta-openeuler/recipes-core/glibc/glibc_2.34.bb | 1 - .../recipes-core/http-parser/http-parser_2.9.4.bb | 2 -- meta-openeuler/recipes-core/iSulad/iSulad_2.0.10.bb | 3 +-- meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb | 2 -- .../recipes-core/libarchive/libarchive_3.5.1.bb | 2 -- meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc | 2 -- meta-openeuler/recipes-core/libcap/libcap_2.32.bb | 2 -- .../recipes-core/libevent/libevent_2.1.12.bb | 3 --- .../recipes-core/libevhtp/libevhtp_1.2.18.bb | 2 -- .../recipes-core/libseccomp/libseccomp_2.5.1.bb | 2 -- .../libwebsockets/libwebsockets_4.0.20.bb | 2 -- meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb | 2 -- meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb | 2 -- meta-openeuler/recipes-core/zlib/zlib_1.2.11.bb | 2 -- .../recipes-devtools/pseudo/pseudo_git.bbappend | 2 +- 21 files changed, 17 insertions(+), 56 deletions(-) delete mode 100644 meta-openeuler/classes/get_dl_dir.bbclass diff --git a/meta-openeuler/classes/get_dl_dir.bbclass b/meta-openeuler/classes/get_dl_dir.bbclass deleted file mode 100644 index 1c43639c3d5..00000000000 --- a/meta-openeuler/classes/get_dl_dir.bbclass +++ /dev/null @@ -1,11 +0,0 @@ -python set_dldir() { - import subprocess - dl_dir = d.getVar('DL_DIR', True) - oeroot = d.getVar('COREBASE', True) - srctopdir = os.path.abspath(os.path.dirname(oeroot)) - if not dl_dir or dl_dir == "downloads": - d.setVar('DL_DIR', srctopdir) -} - -addhandler set_dldir -set_dldir[eventmask] = "bb.event.RecipePreFinalise" diff --git a/meta-openeuler/conf/distro/openeuler.conf b/meta-openeuler/conf/distro/openeuler.conf index 93b84711aee..24050299a4b 100644 --- a/meta-openeuler/conf/distro/openeuler.conf +++ b/meta-openeuler/conf/distro/openeuler.conf @@ -56,20 +56,21 @@ INHERIT += "reproducible_build" BB_SIGNATURE_HANDLER ?= "OEEquivHash" BB_HASHSERVE ??= "auto" -#set binary gcc,not effect?? -#TCMODE = "gcc-bin" + PREFERRED_PROVIDER_virtual/kernel = "linux-openeuler" #add by lisimin,delete depends #UNINATIVE_CHECKSUM[x86_64] = "dead" #UNINATIVE_URL = "unset" -LOCAL_SRC_DIR = "${BPN}" INHIBIT_PACKAGE_DEBUG_SPLIT = "1" -#DL_DIR = "${LOCAL_FILES}" -DL_DIR = "downloads" + +# for all .bb file, OPENEULER_SP_DIR will be included +# in file path +FILESEXTRAPATHS_prepend = "${OPENEULER_SP_DIR}:" + export RPMDEPS = "default" -INHERIT += "get_dl_dir get_rpmdeps" +INHERIT += "get_rpmdeps" #disable the file checksum of fetch do_fetch[file-checksums] = "" diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index 0c3f35558ad..9934a4f9fa3 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -301,8 +301,11 @@ ftp://.*/.* file:///${LOCAL_FILES} \n \ http://.*/.* file:///${LOCAL_FILES} \n \ https://.*/.* file:///${LOCAL_FILES} \n" -#not add PR in workpath -#PF = "${PN}-${EXTENDPE}${PV}" -#STAMP = "${STAMPS_DIR}/${MULTIMACH_TARGET_SYS}/${PN}/${EXTENDPE}${PV}" -#WORKDIR = "${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}/${PN}/${EXTENDPE}${PV}" -LOCAL_FILES = "/usr1/openeuler/src/" +# openEuler software package dir +# all openeEuler software packages will be downloaded by specific tool +# into this dir with the following format: +# +# busybox +# openssh +# ..... +OPENEULER_SP_DIR = "/usr1/openeuler/src/" diff --git a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb index 0c58fe71cb8..51af79e86cc 100644 --- a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb +++ b/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb @@ -19,7 +19,6 @@ inherit kernel-arch SRC_URI = "file://busybox/busybox-1.33.1.tar.bz2 \ file://yocto-embedded-tools/config/arm64/defconfig-busybox \ " -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" S = "${WORKDIR}/${BPN}-${PV}" #not split debug files with dwarfsrcfiles,no dwarfsrcfiles diff --git a/meta-openeuler/recipes-core/clibcni/clibcni_2.0.4.bb b/meta-openeuler/recipes-core/clibcni/clibcni_2.0.4.bb index 1f747c41479..751f711a9d9 100644 --- a/meta-openeuler/recipes-core/clibcni/clibcni_2.0.4.bb +++ b/meta-openeuler/recipes-core/clibcni/clibcni_2.0.4.bb @@ -8,8 +8,6 @@ SRC_URI = "file://clibcni/v2.0.4.tar.gz \ file://clibcni/0002-add-error-info-for-failed-run-cni-plugin.patch \ " -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}" inherit cmake diff --git a/meta-openeuler/recipes-core/curl/curl_7.77.0.bb b/meta-openeuler/recipes-core/curl/curl_7.77.0.bb index 2629ea9568e..370eef54425 100644 --- a/meta-openeuler/recipes-core/curl/curl_7.77.0.bb +++ b/meta-openeuler/recipes-core/curl/curl_7.77.0.bb @@ -16,8 +16,6 @@ SRC_URI = "file://curl/curl-7.77.0.tar.xz \ file://curl/backport-CVE-2021-22926.patch \ " -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}-${PV}" CVE_PRODUCT = "curl libcurl" diff --git a/meta-openeuler/recipes-core/glibc/glibc_2.34.bb b/meta-openeuler/recipes-core/glibc/glibc_2.34.bb index b4a42602b28..0b073699fc2 100644 --- a/meta-openeuler/recipes-core/glibc/glibc_2.34.bb +++ b/meta-openeuler/recipes-core/glibc/glibc_2.34.bb @@ -28,7 +28,6 @@ SRC_URI_arm = "file://openeuler_gcc_arm32le" #Not strip toolchain INHIBIT_SYSROOT_STRIP = "1" INSANE_SKIP_${PN} += "already-stripped" -#FILESPATH_prepend += "${LOCAL_FILES}:" DL_DIR = "${LOCAL_SYSROOT_DL_DIR}" S_aarch64 = "${WORKDIR}/openeuler_gcc_arm64le" S_arm = "${WORKDIR}/openeuler_gcc_arm32le" diff --git a/meta-openeuler/recipes-core/http-parser/http-parser_2.9.4.bb b/meta-openeuler/recipes-core/http-parser/http-parser_2.9.4.bb index 7e8baf17e6f..76857503b4f 100644 --- a/meta-openeuler/recipes-core/http-parser/http-parser_2.9.4.bb +++ b/meta-openeuler/recipes-core/http-parser/http-parser_2.9.4.bb @@ -7,8 +7,6 @@ LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;m SRC_URI = "file://http-parser/http-parser-2.9.4.tar.gz" -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}-${PV}" INHIBIT_PACKAGE_DEBUG_SPLIT = "1" diff --git a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.10.bb b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.10.bb index e31bde748f4..c93f9ad5567 100644 --- a/meta-openeuler/recipes-core/iSulad/iSulad_2.0.10.bb +++ b/meta-openeuler/recipes-core/iSulad/iSulad_2.0.10.bb @@ -26,8 +26,7 @@ SRC_URI = "file://iSulad/v2.0.10.tar.gz \ file://iSulad/0019-add-pull-request-gateway-checker-for-build-and-ut.patch \ file://iSulad/0020-Optimize-websocket-streaming-service-code.patch \ " -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" + S = "${WORKDIR}/${BPN}" WARN_QA_remove += "uppercase-pn" diff --git a/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb b/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb index 6c14926cebb..35afc1b9959 100644 --- a/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb +++ b/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb @@ -6,8 +6,6 @@ LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;m SRC_URI = "file://lcr/v2.0.6.tar.gz \ " -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}" inherit cmake diff --git a/meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb b/meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb index 68609a9c84e..d2da1f0d4b0 100644 --- a/meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb +++ b/meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb @@ -7,8 +7,6 @@ SRC_URI = "file://libarchive/libarchive-3.5.1.tar.gz \ file://libarchive/libarchive-uninitialized-value.patch \ " -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}-${PV}" inherit cmake diff --git a/meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc b/meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc index 69409f0c851..45478074b49 100644 --- a/meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc +++ b/meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc @@ -9,8 +9,6 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f \ SRC_URI = "file://libcap-ng/libcap-ng-${PV}.tar.gz" -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}-${PV}" SRC_URI[md5sum] = "5883ed10b621c87e29a05cff36d2928e" diff --git a/meta-openeuler/recipes-core/libcap/libcap_2.32.bb b/meta-openeuler/recipes-core/libcap/libcap_2.32.bb index 8571b725d0a..8cf19b0ff93 100644 --- a/meta-openeuler/recipes-core/libcap/libcap_2.32.bb +++ b/meta-openeuler/recipes-core/libcap/libcap_2.32.bb @@ -13,8 +13,6 @@ SRC_URI = "file://libcap/libcap-2.32.tar.gz \ file://libcap/Avoid-segfaulting-when-the-kernel-is-ahead-of-libcap.patch \ " -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}-${PV}" DEPENDS = "hostperl-runtime-native gperf-native" diff --git a/meta-openeuler/recipes-core/libevent/libevent_2.1.12.bb b/meta-openeuler/recipes-core/libevent/libevent_2.1.12.bb index 7bee6e71d8c..932d72669c2 100644 --- a/meta-openeuler/recipes-core/libevent/libevent_2.1.12.bb +++ b/meta-openeuler/recipes-core/libevent/libevent_2.1.12.bb @@ -12,9 +12,6 @@ SRC_URI = "file://libevent/libevent-2.1.12-stable.tar.gz \ file://libevent/http-add-callback-to-allow-server-to-decline-and-the.patch \ " -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" - UPSTREAM_CHECK_URI = "http://libevent.org/" S = "${WORKDIR}/${BPN}-${PV}-stable" diff --git a/meta-openeuler/recipes-core/libevhtp/libevhtp_1.2.18.bb b/meta-openeuler/recipes-core/libevhtp/libevhtp_1.2.18.bb index fadb6177fbd..eaa55944000 100644 --- a/meta-openeuler/recipes-core/libevhtp/libevhtp_1.2.18.bb +++ b/meta-openeuler/recipes-core/libevhtp/libevhtp_1.2.18.bb @@ -13,8 +13,6 @@ SRC_URI = "file://libevhtp/1.2.18.tar.gz \ file://libevhtp/0005-libevhtp-add-securce-compile-options.patch \ " -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}-${PV}" DEPENDS = "libevent" diff --git a/meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.1.bb b/meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.1.bb index 6b14fd0a90c..a37f52bc387 100644 --- a/meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.1.bb +++ b/meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.1.bb @@ -9,8 +9,6 @@ LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;m SRC_URI = "file://libseccomp/libseccomp-2.5.1.tar.gz" -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}-${PV}" diff --git a/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb b/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb index 6528b0dc351..52dd9eea0d0 100644 --- a/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb +++ b/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb @@ -5,8 +5,6 @@ LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;m SRC_URI = "file://libwebsockets/libwebsockets-4.0.20.tar.gz" -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}-${PV}" inherit cmake diff --git a/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb b/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb index 7f21b9c1946..9205e33ec24 100644 --- a/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb +++ b/meta-openeuler/recipes-core/lxc/lxc_4.0.3.bb @@ -44,8 +44,6 @@ SRC_URI = "file://lxc/lxc-4.0.3.tar.gz \ file://check_only_rootfs_as_filesystem_type.patch \ " -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" DEPENDS = "yajl libseccomp libcap" diff --git a/meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb b/meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb index f12fa0d475e..ac8d8f6c61c 100644 --- a/meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb +++ b/meta-openeuler/recipes-core/yajl/yajl_2.1.0.bb @@ -11,8 +11,6 @@ SRC_URI = "file://yajl/2.1.0.tar.gz \ file://yajl/yajl-2.1.0-fix-memory-leak.patch \ " -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}-${PV}" inherit cmake diff --git a/meta-openeuler/recipes-core/zlib/zlib_1.2.11.bb b/meta-openeuler/recipes-core/zlib/zlib_1.2.11.bb index 652448df066..11e045e70cb 100644 --- a/meta-openeuler/recipes-core/zlib/zlib_1.2.11.bb +++ b/meta-openeuler/recipes-core/zlib/zlib_1.2.11.bb @@ -6,8 +6,6 @@ SECTION = "libs" LICENSE = "Zlib" LIC_FILES_CHKSUM = "file://zlib.h;beginline=6;endline=23;md5=5377232268e952e9ef63bc555f7aa6c0" -FILESPATH_prepend += "${LOCAL_FILES}/${BPN}:" -DL_DIR = "${LOCAL_FILES}" S = "${WORKDIR}/${BPN}-${PV}" SRC_URI = "file://${BPN}/${BPN}-${PV}.tar.xz \ " diff --git a/meta-openeuler/recipes-devtools/pseudo/pseudo_git.bbappend b/meta-openeuler/recipes-devtools/pseudo/pseudo_git.bbappend index 3cd742c6ee6..7fe85595a57 100644 --- a/meta-openeuler/recipes-devtools/pseudo/pseudo_git.bbappend +++ b/meta-openeuler/recipes-devtools/pseudo/pseudo_git.bbappend @@ -4,7 +4,7 @@ XSRC_URI = "git://git.yoctoproject.org/pseudo;branch=oe-core \ file://fallback-passwd \ file://fallback-group \ " -FILESPATH_prepend += "${LOCAL_FILES}:" + SRC_URI_remove_class-native = " \ http://downloads.yoctoproject.org/mirror/sources/pseudo-prebuilt-2.33.tar.xz;subdir=git/prebuilt;name=prebuilt \ file://older-glibc-symbols.patch" -- Gitee From 8b667f9ebfa0489062f41e1d68698d9c016b4e9d Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Sat, 15 Jan 2022 22:15:48 +0800 Subject: [PATCH 163/304] classes: remove unused get_euler_config.bbclass get_euler_config.bbclass is not used now, remove it Signed-off-by: Wayne Ren --- meta-openeuler/classes/get_euler_config.bbclass | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 meta-openeuler/classes/get_euler_config.bbclass diff --git a/meta-openeuler/classes/get_euler_config.bbclass b/meta-openeuler/classes/get_euler_config.bbclass deleted file mode 100644 index 25bccd9ea23..00000000000 --- a/meta-openeuler/classes/get_euler_config.bbclass +++ /dev/null @@ -1,15 +0,0 @@ -python set_rpmdeps() { - import subprocess - configfile = d.getVar('EULER_CONFIG_FILE', True) - if not configfile: - oeroot = d.getVar('COREBASE', True) - euler_meta = os.path.join(os.path.abspath(os.path.dirname(oeroot)), "meta-openeuler") - d.setVar('DL_DIR', os.path.abspath(os.path.dirname(oeroot))) - rpmdeps = subprocess.Popen('rpm --eval="%{_rpmconfigdir}"', shell=True, stdout=subprocess.PIPE) - stdout, stderr = rpmdeps.communicate() - d.setVar('RPMDEPS', os.path.join(str(stdout, "utf-8").strip(), "rpmdeps")) - #bb.warn("xxxxxxxxxxxxxxxxxx xxxxRPMDEPS=%s"%d.getVar('RPMDEPS', True)) -} - -addhandler set_rpmdeps -set_rpmdeps[eventmask] = "bb.event.RecipePreFinalise" -- Gitee From 2e1d9c38c4cca0eb1a7fe9bff13b91d2c1d27571 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Mon, 17 Jan 2022 00:09:59 +0800 Subject: [PATCH 164/304] toolchain: clean up of cross toolchain related recipes * delete config.xml, use OPENEULER_TOOLCHAIN_DIR as external openEuler toolchain's path * fix typos and clean up comments Signed-off-by: Wayne Ren --- meta-openeuler/conf/layer.conf | 2 - meta-openeuler/conf/local.conf.sample | 10 ++++ meta-openeuler/config.xml | 24 -------- .../recipes-core/glibc/glibc_2.34.bb | 60 +++++++++---------- .../gcc/gcc-bin-toolchain.inc | 10 +--- 5 files changed, 41 insertions(+), 65 deletions(-) delete mode 100644 meta-openeuler/config.xml diff --git a/meta-openeuler/conf/layer.conf b/meta-openeuler/conf/layer.conf index f77e92b56a0..c4a89465752 100644 --- a/meta-openeuler/conf/layer.conf +++ b/meta-openeuler/conf/layer.conf @@ -18,5 +18,3 @@ LAYERVERSION_openeuler = "13" LAYERDEPENDS_openeuler = "core" REQUIRED_POKY_BBLAYERS_CONF_VERSION = "2" - -EULER_CONFIG_FILE := '${@os.path.normpath("${LAYERDIR}/config.xml")}' diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index 9934a4f9fa3..65ce97daaad 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -309,3 +309,13 @@ https://.*/.* file:///${LOCAL_FILES} \n" # openssh # ..... OPENEULER_SP_DIR = "/usr1/openeuler/src/" + +# openEuler cross toolchain dir +# prebuilt toolchain with c library is used to build openEuler embedded +# distribution. The prebuilt toolchain should be downloaded and placed in +# OPENEULER_TOOLCHAIN_DIR with the following format: +# +# openeuler_gcc_arm64le +# openeuler_gcc_arm32le" +OPENEULER_TOOLCHAIN_DIR_aarch64 = "/usr1/openeuler/gcc/openeuler_gcc_arm64le" +OPENEULER_TOOLCHAIN_DIR_arm = "/usr1/openeuler/gcc/openeuler_gcc_arm64le" diff --git a/meta-openeuler/config.xml b/meta-openeuler/config.xml deleted file mode 100644 index 32209e22c09..00000000000 --- a/meta-openeuler/config.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - /usr1/openeuler/gcc/openeuler_gcc_arm32le - /usr1/openeuler/gcc/openeuler_gcc_arm64le - /opt/buildtools/cmake-3.18.3/bin/ - /opt/buildtools/python-3.9.2/bin/ - /opt/buildtools/ninja-1.10.1/bin - /opt/buildtools/gperf-3.1/bin - /opt/buildtools/patchelf-0.12/bin/ - /opt/buildtools/chrpath-0.16/bin/ - /opt/buildtools/gcc-7.3.0/bin/ - /opt/buildtools/compiler_cpu-v200r007c10b007/ - /opt/buildtools/cmake-3.18.3/bin/ - /opt/buildtools/python-3.9.2/bin/ - /opt/buildtools/ninja-1.10.1/bin - /opt/buildtools/gperf-3.1/bin - /opt/buildtools/p7zip-17.03/bin/ - - - - arm64le - arm32le - - diff --git a/meta-openeuler/recipes-core/glibc/glibc_2.34.bb b/meta-openeuler/recipes-core/glibc/glibc_2.34.bb index 0b073699fc2..f1a7bd36ebc 100644 --- a/meta-openeuler/recipes-core/glibc/glibc_2.34.bb +++ b/meta-openeuler/recipes-core/glibc/glibc_2.34.bb @@ -1,19 +1,16 @@ -SUMMARY = "Dummy Linux kernel" -DESCRIPTION = "Dummy Linux kernel, to be selected as the preferred \ -provider for virtual/kernel to satisfy dependencies for situations \ -where you wish to build the kernel externally from the build system." -SECTION = "kernel" +SUMMARY = "GLIBC (GNU C Library)" +DESCRIPTION = "The GNU C Library is used as the system C library in most systems with the Linux kernel. \ + In openEuler, glibc is prebuilt and part of toolchain. This recipe just installs the glibc \ + binary" +HOMEPAGE = "http://www.gnu.org/software/libc/libc.html" +SECTION = "libs" +LICENSE = "GPLv2 & LGPLv2.1" -LICENSE = "GPLv2" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" PACKAGES = "${PN}-dbg catchsegv sln nscd ldconfig ldd tzcode glibc-thread-db ${PN}-pic libcidn libmemusage malloc-debug libnss-db libsegfault ${PN}-pcprofile libsotruss ${PN} ${PN}-utils glibc-extra-nss ${PN}-dev ${PN}-staticdev ${PN}-doc ${PN}-src" #DEPENDS = "virtual/${TARGET_PREFIX}gcc libgcc-initial linux-libc-headers" -PROVIDES += " \ - virtual/libc \ - virtual/libiconv \ -" PROVIDES += "virtual/libc virtual/libiconv virtual/libintl" #RPROVIDES_${PN}-dev += "libc-dev" @@ -23,14 +20,17 @@ INHIBIT_DEFAULT_DEPS = "1" PR = "r1" require ../../recipes-devtools/gcc/gcc-bin-toolchain.inc + SRC_URI_aarch64 = "file://openeuler_gcc_arm64le" SRC_URI_arm = "file://openeuler_gcc_arm32le" + #Not strip toolchain INHIBIT_SYSROOT_STRIP = "1" INSANE_SKIP_${PN} += "already-stripped" -DL_DIR = "${LOCAL_SYSROOT_DL_DIR}" + S_aarch64 = "${WORKDIR}/openeuler_gcc_arm64le" S_arm = "${WORKDIR}/openeuler_gcc_arm32le" + PSEUDO_DISABLED = "1" PRIVATE_LIBS_${PN}-dev_append = "libdl.so.2 libresolv.so.2 libm.so.6 librt.so.1 libnsl.so.1 libnss_files.so.2 " @@ -53,24 +53,24 @@ do_install() { } FILES_${PN} = " \ -${base_libdir}/ld-linux*.so.* \ -${libdir}/libc.so \ -${base_libdir}/libm.so \ -${base_libdir}/libc.so.6 \ -${base_libdir}/libm.so.6 \ -${libdir}/libcrypt.so \ -${libdir}/libnss_compat.so \ -${libdir}/libresolv.so \ -${base_libdir}/libcrypt.so.1 \ -${base_libdir}/libnss_compat.so.2 \ -${base_libdir}/libnsl.so.1 \ -{base_libdir}/libnss_files.so.2 \ -${base_libdir}/libresolv.so.2 \ -${base_libdir}/librt* \ -${base_libdir}/libpthread* \ -${base_libdir}/libutil* \ -${base_libdir}/libgcc_s.so.1 \ -${base_libdir}/libtirpc.so* \ + ${base_libdir}/ld-linux*.so.* \ + ${libdir}/libc.so \ + ${base_libdir}/libm.so \ + ${base_libdir}/libc.so.6 \ + ${base_libdir}/libm.so.6 \ + ${libdir}/libcrypt.so \ + ${libdir}/libnss_compat.so \ + ${libdir}/libresolv.so \ + ${base_libdir}/libcrypt.so.1 \ + ${base_libdir}/libnss_compat.so.2 \ + ${base_libdir}/libnsl.so.1 \ + {base_libdir}/libnss_files.so.2 \ + ${base_libdir}/libresolv.so.2 \ + ${base_libdir}/librt* \ + ${base_libdir}/libpthread* \ + ${base_libdir}/libutil* \ + ${base_libdir}/libgcc_s.so.1 \ + ${base_libdir}/libtirpc.so* \ " INSANE_SKIP_${PN} += "installed-vs-shipped" INSANE_SKIP += "dev-elf dev-so" @@ -81,4 +81,4 @@ do_stash_locale() { : } addtask do_stash_locale -BBCLASSEXTEND = "native nativesdk" +BBCLASSEXTEND = "nativesdk" diff --git a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc index 4f0e7a9efba..e82b1ae4a4a 100644 --- a/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc +++ b/meta-openeuler/recipes-devtools/gcc/gcc-bin-toolchain.inc @@ -9,16 +9,8 @@ EULER_TOOLCHAIN_GCC_PATH = "/gcc/${EULER_TOOLCHAIN_GCC_PATH_INNER}" python () { import os - import platform - import subprocess - host = platform.machine() - tune = d.getVar('TARGET_ARCH', True) - config_xml = d.getVar('EULER_CONFIG_FILE', True) - cmd = 'grep "name=\\\"sdk\\\"" %s | grep "tune=\\\"%s\\\"" | grep "hostmachine=\\\"%s\\\"" | awk -F"[<>]" \'{print $3}\'' % (config_xml, tune, host) - compiler_path = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) - stdout, stderr = compiler_path.communicate() - local_toolchain = str(stdout, "utf-8").strip() + local_toolchain = str(d.getVar('OPENEULER_TOOLCHAIN_DIR', True)) if not os.path.exists(local_toolchain): return 1 if os.path.exists(local_toolchain): -- Gitee From 9b1719b47e02bed06f09813e0a87218ae3a56717 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Mon, 17 Jan 2022 10:51:09 +0800 Subject: [PATCH 165/304] image: remove /boot only when it exists remove /boot dir as we don't need it in the final image when it exists Signed-off-by: Wayne Ren --- .../recipes-core/images/openeuler-image.bb | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 77cf77484d5..af02c65ed6c 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -36,11 +36,15 @@ OUTPUT_DIR = "${TOPDIR}/output" delete_boot_from_rootfs() { test -d "${OUTPUT_DIR}" || mkdir -p "${OUTPUT_DIR}" pushd "${IMAGE_ROOTFS}" - rm -f "${OUTPUT_DIR}"/*Image* "${OUTPUT_DIR}"/initrd "${OUTPUT_DIR}"/vmlinux* - mv boot/${KERNEL_IMAGETYPE}-* "${OUTPUT_DIR}"/${KERNEL_IMAGETYPE} - mv boot/vmlinux* "${OUTPUT_DIR}"/ - mv boot/Image* "${OUTPUT_DIR}"/ - rm -r ./boot + rm -f "${OUTPUT_DIR}"/initrd + # remove /boot from rootfs for final image + if [-d ./boot]; then + rm -f "${OUTPUT_DIR}"/Image* "${OUTPUT_DIR}"/vmlinux* + mv boot/${KERNEL_IMAGETYPE}-* "${OUTPUT_DIR}"/${KERNEL_IMAGETYPE} + mv boot/vmlinux* "${OUTPUT_DIR}"/ + mv boot/Image* "${OUTPUT_DIR}"/ + rm -r ./boot + fi popd } -- Gitee From 94dd8ec30c13fbd3c42680a312b5b17182ec7d50 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 17 Jan 2022 14:17:50 +0800 Subject: [PATCH 166/304] add recipe for cifs-utils Signed-off-by: lixiaoyong --- .../cifs-utils/cifs-utils_6.14.bb | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 meta-openeuler/recipes-core/cifs-utils/cifs-utils_6.14.bb diff --git a/meta-openeuler/recipes-core/cifs-utils/cifs-utils_6.14.bb b/meta-openeuler/recipes-core/cifs-utils/cifs-utils_6.14.bb new file mode 100644 index 00000000000..053dae81a39 --- /dev/null +++ b/meta-openeuler/recipes-core/cifs-utils/cifs-utils_6.14.bb @@ -0,0 +1,36 @@ +DESCRIPTION = "A a package of utilities for doing and managing mounts of the Linux CIFS filesystem." +HOMEPAGE = "http://wiki.samba.org/index.php/LinuxCIFS_utils" +SECTION = "otherosfs" +LICENSE = "GPLv3 & LGPLv3" +LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" + +SRC_URI = "file://cifs-utils/${BP}.tar.bz2" +SRC_URI[sha256sum] = "6609e8074b5421295ff012a31f02ccd9a058415c619c81362ebb788dbf0756b8" + +PACKAGECONFIG ??= "" +PACKAGECONFIG[cap] = "--with-libcap,--without-libcap,libcap" +# when enabled, it creates ${bindir}/cifscreds and --ignore-fail-on-non-empty in do_install_append is needed +PACKAGECONFIG[cifscreds] = "--enable-cifscreds,--disable-cifscreds,keyutils" +# when enabled, it creates ${sbindir}/cifs.upcall and --ignore-fail-on-non-empty in do_install_append is needed +PACKAGECONFIG[cifsupcall] = "--enable-cifsupcall,--disable-cifsupcall,krb5 libtalloc keyutils" +PACKAGECONFIG[cifsidmap] = "--enable-cifsidmap,--disable-cifsidmap,keyutils samba" +PACKAGECONFIG[cifsacl] = "--enable-cifsacl,--disable-cifsacl,samba" +PACKAGECONFIG[pam] = "--enable-pam --with-pamdir=${base_libdir}/security,--disable-pam,libpam keyutils" + +inherit autotools pkgconfig + +do_install_append() { + # Remove empty /usr/bin and /usr/sbin directories since the mount helper + # is installed to /sbin + rmdir --ignore-fail-on-non-empty ${D}${bindir} ${D}${sbindir} +} + +do_compile_prepend() { + #fix open source compile error because of the dependency problem + cat Makefile | grep "@\$(MAKE) \$(AM_MAKEFLAGS) install-exec-am install-data-am" || return 1 + sed -i 's/^[[:space:]]@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am/\t\@\$(MAKE) \$(AM_MAKEFLAGS) install-data-am\n\t\@\$(MAKE) \$(AM_MAKEFLAGS) install-exec-am/g' Makefile +} + +FILES_${PN} += "${base_libdir}/security" +FILES_${PN}-dbg += "${base_libdir}/security/.debug" +RRECOMMENDS_${PN} = "kernel-module-cifs" -- Gitee From ffca23527561131070f8e92c26a900ea05d6519e Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 17 Jan 2022 14:23:16 +0800 Subject: [PATCH 167/304] add rpcgen for nfs-utils Signed-off-by: lixiaoyong --- meta-openeuler/conf/local.conf.sample | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index 67c83fb26e4..1e27ef52a47 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -274,8 +274,8 @@ CONF_VERSION = "2" HOSTTOOLS += "python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool \ ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader \ autoupdate libtool libtoolize pkg-config cmake fmt gperf m4 createrepo_c dnf ldconfig \ - msgfmt msgmerge" -HOSTTOOLS_remove += "diffstat lz4c pzstd rpcgen" + msgfmt msgmerge rpcgen" +HOSTTOOLS_remove += "diffstat lz4c pzstd" SANITY_REQUIRED_UTILITIES_remove += "diffstat chrpath" CONNECTIVITY_CHECK_URIS = "" ASSUME_PROVIDED += "rpm-native dwarfsrcfiles-native depmodwrapper-cross kmod-native bc-native \ -- Gitee From 612e65f0e434328f2dda332e722dd63e85660e80 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 17 Jan 2022 14:24:22 +0800 Subject: [PATCH 168/304] add recipe for nfs-utils Signed-off-by: lixiaoyong --- .../nfs-utils/nfs-utils/nfs-mountd.service | 17 +++ .../nfs-utils/nfs-utils/nfs-server.service | 23 +++ .../nfs-utils/nfs-utils/nfs-statd.service | 14 ++ .../nfs-utils/nfs-utils/nfs-utils.conf | 35 +++++ .../nfs-utils/nfs-utils/nfscommon | 63 ++++++++ .../nfs-utils/nfs-utils/nfsserver | 130 +++++++++++++++++ .../nfs-utils/nfs-utils/proc-fs-nfsd.mount | 8 ++ .../recipes-core/nfs-utils/nfs-utils_2.5.4.bb | 136 ++++++++++++++++++ 8 files changed, 426 insertions(+) create mode 100644 meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-mountd.service create mode 100644 meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-server.service create mode 100644 meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-statd.service create mode 100644 meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-utils.conf create mode 100644 meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfscommon create mode 100644 meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfsserver create mode 100644 meta-openeuler/recipes-core/nfs-utils/nfs-utils/proc-fs-nfsd.mount create mode 100644 meta-openeuler/recipes-core/nfs-utils/nfs-utils_2.5.4.bb diff --git a/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-mountd.service b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-mountd.service new file mode 100644 index 00000000000..c01415de842 --- /dev/null +++ b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-mountd.service @@ -0,0 +1,17 @@ +[Unit] +Description=NFS Mount Daemon +DefaultDependencies=no +After=rpcbind.socket +Requires=proc-fs-nfsd.mount +After=proc-fs-nfsd.mount +After=network.target local-fs.target +BindsTo=nfs-server.service +ConditionPathExists=@SYSCONFDIR@/exports + +[Service] +EnvironmentFile=-@SYSCONFDIR@/nfs-utils.conf +ExecStart=@SBINDIR@/rpc.mountd -F $MOUNTD_OPTS +LimitNOFILE=@HIGH_RLIMIT_NOFILE@ + +[Install] +WantedBy=multi-user.target diff --git a/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-server.service b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-server.service new file mode 100644 index 00000000000..5c845b7e82f --- /dev/null +++ b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-server.service @@ -0,0 +1,23 @@ +[Unit] +Description=NFS server and services +DefaultDependencies=no +Requires=network.target proc-fs-nfsd.mount +Requires=nfs-mountd.service +Wants=rpcbind.service +After=local-fs.target +After=network.target proc-fs-nfsd.mount rpcbind.service nfs-mountd.service +ConditionPathExists=@SYSCONFDIR@/exports + +[Service] +Type=oneshot +EnvironmentFile=-@SYSCONFDIR@/nfs-utils.conf +ExecStartPre=@SBINDIR@/exportfs -r +ExecStart=@SBINDIR@/rpc.nfsd $NFSD_OPTS $NFSD_COUNT +ExecStop=@SBINDIR@/rpc.nfsd 0 +ExecStopPost=@SBINDIR@/exportfs -au +ExecStopPost=@SBINDIR@/exportfs -f +ExecReload=@SBINDIR@/exportfs -r +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-statd.service b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-statd.service new file mode 100644 index 00000000000..4fa64e19980 --- /dev/null +++ b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-statd.service @@ -0,0 +1,14 @@ +[Unit] +Description=NFS status monitor for NFSv2/3 locking. +DefaultDependencies=no +Conflicts=umount.target +Requires=nss-lookup.target rpcbind.service +After=network.target nss-lookup.target rpcbind.service + +[Service] +EnvironmentFile=-@SYSCONFDIR@/nfs-utils.conf +ExecStart=@SBINDIR@/rpc.statd -F $STATD_OPTS +LimitNOFILE=@HIGH_RLIMIT_NOFILE@ + +[Install] +WantedBy=multi-user.target diff --git a/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-utils.conf b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-utils.conf new file mode 100644 index 00000000000..a1007a7fbf4 --- /dev/null +++ b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfs-utils.conf @@ -0,0 +1,35 @@ +# Parameters to be passed to nfs-utils (clients & server) service files. +# + +# Options to pass to rpc.nfsd. +NFSD_OPTS="" + +# Number of servers to start up; the default is 8 servers. +NFSD_COUNT="" + +# Where to mount nfsd filesystem; the default is "/proc/fs/nfsd". +PROCNFSD_MOUNTPOINT="" + +# Options used to mount nfsd filesystem; the default is "rw,nodev,noexec,nosuid". +PROCNFSD_MOUNTOPTS="" + +# Options for rpc.mountd. +# If you have a port-based firewall, you might want to set up +# a fixed port here using the --port option. +MOUNTD_OPTS="" + +# Parameters to be passed to nfs-common (nfs clients & server) init script. +# + +# If you do not set values for the NEED_ options, they will be attempted +# autodetected; this should be sufficient for most people. Valid alternatives +# for the NEED_ options are "yes" and "no". + +# Do you want to start the statd daemon? It is not needed for NFSv4. +NEED_STATD="" + +# Options to pass to rpc.statd. +# N.B. statd normally runs on both client and server, and run-time +# options should be specified accordingly. +# STATD_OPTS="-p 32765 -o 32766" +STATD_OPTS="" diff --git a/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfscommon b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfscommon new file mode 100644 index 00000000000..992267d5a16 --- /dev/null +++ b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfscommon @@ -0,0 +1,63 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: nfs-common +# Required-Start: $portmap hwclock +# Required-Stop: $portmap hwclock +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: NFS support for both client and server +# Description: NFS is a popular protocol for file sharing across +# TCP/IP networks. This service provides various +# support functions for NFS mounts. +### END INIT INFO +# +# Startup script for nfs-utils +# +# +# Location of executables: + +# Source function library. +. /etc/init.d/functions + +test -x "$NFS_STATD" || NFS_STATD=/usr/sbin/rpc.statd +test -z "$STATD_PID" && STATD_PID=/var/run/rpc.statd.pid +# +# The default state directory is /var/lib/nfs +test -n "$NFS_STATEDIR" || NFS_STATEDIR=/var/lib/nfs +# +#---------------------------------------------------------------------- +# Startup and shutdown functions. +# Actual startup/shutdown is at the end of this file. + +start_statd(){ + echo -n "starting statd: " + start-stop-daemon --start --exec "$NFS_STATD" --pidfile "$STATD_PID" + echo done +} +stop_statd(){ + echo -n 'stopping statd: ' + start-stop-daemon --stop --quiet --signal 1 --pidfile "$STATD_PID" + echo done +} +#---------------------------------------------------------------------- +# +# supported options: +# start +# stop +# restart: stops and starts mountd +#FIXME: need to create the /var/lib/nfs/... directories +case "$1" in + start) + start_statd;; + stop) + stop_statd;; + status) + status $NFS_STATD + exit $?;; + restart) + $0 stop + $0 start;; + *) + echo "Usage: $0 {start|stop|status|restart}" + exit 1;; +esac diff --git a/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfsserver b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfsserver new file mode 100644 index 00000000000..0f5747cc6db --- /dev/null +++ b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/nfsserver @@ -0,0 +1,130 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: nfs-kernel-server +# Required-Start: $remote_fs nfs-common $portmap hwclock +# Required-Stop: $remote_fs nfs-common $portmap hwclock +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Kernel NFS server support +# Description: NFS is a popular protocol for file sharing across +# TCP/IP networks. This service provides NFS server +# functionality, which is configured via the +# /etc/exports file. +### END INIT INFO +# +# Startup script for nfs-utils +# +# Source function library. +. /etc/init.d/functions +# +# The environment variable NFS_SERVERS may be set in /etc/default/nfsd +# Other control variables may be overridden here too +test -r /etc/default/nfsd && . /etc/default/nfsd +# +# Location of executables: +test -x "$NFS_MOUNTD" || NFS_MOUNTD=/usr/sbin/rpc.mountd +test -x "$NFS_NFSD" || NFS_NFSD=/usr/sbin/rpc.nfsd +# +# The user mode program must also exist (it just starts the kernel +# threads using the kernel module code). +test -x "$NFS_MOUNTD" || exit 0 +test -x "$NFS_NFSD" || exit 0 +# +# Default is 8 threads, value is settable between 1 and the truely +# ridiculous 99 +test "$NFS_SERVERS" != "" && test "$NFS_SERVERS" -gt 0 && test "$NFS_SERVERS" -lt 100 || NFS_SERVERS=8 +# +#---------------------------------------------------------------------- +# Startup and shutdown functions. +# Actual startup/shutdown is at the end of this file. +#mountd +start_mountd(){ + echo -n 'starting mountd: ' + start-stop-daemon --start --exec "$NFS_MOUNTD" -- "$@" + echo done +} +stop_mountd(){ + echo -n 'stopping mountd: ' + start-stop-daemon --stop --quiet --exec "$NFS_MOUNTD" + echo done +} +# +#nfsd +start_nfsd(){ + modprobe -q nfsd + grep -q nfsd /proc/filesystems || { + echo NFS daemon support not enabled in kernel + exit 1 + } + grep -q nfsd /proc/mounts || mount -t nfsd nfsd /proc/fs/nfsd + grep -q nfsd /proc/mounts || { + echo nfsd filesystem could not be mounted at /proc/fs/nfsd + exit 1 + } + + echo -n "starting $1 nfsd kernel threads: " + start-stop-daemon --start --exec "$NFS_NFSD" -- "$@" + echo done +} +delay_nfsd(){ + for delay in 0 1 2 3 4 5 6 7 8 9 + do + if pidof nfsd >/dev/null + then + echo -n . + sleep 1 + else + return 0 + fi + done + return 1 +} +stop_nfsd(){ + # WARNING: this kills any process with the executable + # name 'nfsd'. + echo -n 'stopping nfsd: ' + start-stop-daemon --stop --quiet --signal 1 --name nfsd + if delay_nfsd || { + echo failed + echo ' using signal 9: ' + start-stop-daemon --stop --quiet --signal 9 --name nfsd + delay_nfsd + } + then + echo done + else + echo failed + fi +} + +#---------------------------------------------------------------------- +# +# supported options: +# start +# stop +# reload: reloads the exports file +# restart: stops and starts mountd +#FIXME: need to create the /var/lib/nfs/... directories +case "$1" in + start) + test -r /etc/exports && exportfs -r + start_nfsd "$NFS_SERVERS" + start_mountd + test -r /etc/exports && exportfs -a;; + stop) exportfs -ua + stop_mountd + stop_nfsd;; + status) + status /usr/sbin/rpc.mountd + RETVAL=$? + status nfsd + rval=$? + [ $RETVAL -eq 0 ] && exit $rval + exit $RETVAL;; + reload) test -r /etc/exports && exportfs -r;; + restart) + $0 stop + $0 start;; + *) echo "Usage: $0 {start|stop|status|reload|restart}" + exit 1;; +esac diff --git a/meta-openeuler/recipes-core/nfs-utils/nfs-utils/proc-fs-nfsd.mount b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/proc-fs-nfsd.mount new file mode 100644 index 00000000000..630801b3751 --- /dev/null +++ b/meta-openeuler/recipes-core/nfs-utils/nfs-utils/proc-fs-nfsd.mount @@ -0,0 +1,8 @@ +[Unit] +Description=NFSD configuration filesystem +After=systemd-modules-load.service + +[Mount] +What=nfsd +Where=/proc/fs/nfsd +Type=nfsd diff --git a/meta-openeuler/recipes-core/nfs-utils/nfs-utils_2.5.4.bb b/meta-openeuler/recipes-core/nfs-utils/nfs-utils_2.5.4.bb new file mode 100644 index 00000000000..6b51b6ad7c3 --- /dev/null +++ b/meta-openeuler/recipes-core/nfs-utils/nfs-utils_2.5.4.bb @@ -0,0 +1,136 @@ +SUMMARY = "userspace utilities for kernel nfs" +DESCRIPTION = "The nfs-utils package provides a daemon for the kernel \ +NFS server and related tools." +HOMEPAGE = "http://nfs.sourceforge.net/" +SECTION = "console/network" + +LICENSE = "MIT & GPLv2+ & BSD" +LIC_FILES_CHKSUM = "file://COPYING;md5=95f3a93a5c3c7888de623b46ea085a84" + +# util-linux for libblkid +DEPENDS = "libcap libevent util-linux libtirpc" +RDEPENDS_${PN} = "${PN}-client" +RRECOMMENDS_${PN} = "kernel-module-nfsd" + +USERADD_PACKAGES = "${PN}-client" +USERADD_PARAM_${PN}-client = "--system --home-dir /var/lib/nfs \ + --shell /bin/false --user-group rpcuser" + +SRC_URI = "file://nfs-utils/${BP}.tar.xz \ + file://nfs-utils/0000-systemd-idmapd-require-rpc-pipefs.patch \ + file://nfs-utils/0001-correct-the-statd-path-in-man.patch \ + file://nfsserver \ + file://nfscommon \ + file://nfs-utils.conf \ + file://nfs-server.service \ + file://nfs-mountd.service \ + file://nfs-statd.service \ + file://proc-fs-nfsd.mount \ + " +SRC_URI[sha256sum] = "51997d94e4c8bcef5456dd36a9ccc38e231207c4e9b6a9a2c108841e6aebe3dd" + +# Only kernel-module-nfsd is required here (but can be built-in) - the nfsd module will +# pull in the remainder of the dependencies. + +INITSCRIPT_PACKAGES = "${PN} ${PN}-client" +INITSCRIPT_NAME = "nfsserver" +INITSCRIPT_PARAMS = "defaults" +INITSCRIPT_NAME_${PN}-client = "nfscommon" +INITSCRIPT_PARAMS_${PN}-client = "defaults 19 21" + +inherit autotools-brokensep pkgconfig systemd + +SYSTEMD_PACKAGES = "${PN} ${PN}-client" +SYSTEMD_SERVICE_${PN} = "nfs-server.service nfs-mountd.service" +SYSTEMD_SERVICE_${PN}-client = "nfs-statd.service" + +# --enable-uuid is need for cross-compiling +EXTRA_OECONF = "--with-statduser=rpcuser \ + --enable-mountconfig \ + --enable-libmount-mount \ + --enable-uuid \ + --disable-gss \ + --disable-nfsdcltrack \ + --with-statdpath=/var/lib/nfs/statd \ + --with-rpcgen=${HOSTTOOLS_DIR}/rpcgen \ + " + +PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'ipv6', d)} \ +" +PACKAGECONFIG_remove_libc-musl = "tcp-wrappers" +PACKAGECONFIG[ipv6] = "--enable-ipv6,--disable-ipv6," +# libdevmapper is available in meta-oe +PACKAGECONFIG[nfsv41] = "--enable-nfsv41,--disable-nfsv41,libdevmapper,libdevmapper" +# keyutils is available in meta-oe +PACKAGECONFIG[nfsv4] = "--enable-nfsv4,--disable-nfsv4,keyutils,python3-core" + +PACKAGES =+ "${PN}-client ${PN}-mount ${PN}-stats" + +CONFFILES_${PN}-client += "${localstatedir}/lib/nfs/etab \ + ${localstatedir}/lib/nfs/rmtab \ + ${localstatedir}/lib/nfs/xtab \ + ${localstatedir}/lib/nfs/statd/state \ + ${sysconfdir}/nfsmount.conf" + +FILES_${PN}-client = "${sbindir}/*statd \ + ${sbindir}/rpc.idmapd ${sbindir}/sm-notify \ + ${sbindir}/showmount ${sbindir}/nfsstat \ + ${localstatedir}/lib/nfs \ + ${sysconfdir}/nfs-utils.conf \ + ${sysconfdir}/nfsmount.conf \ + ${sysconfdir}/init.d/nfscommon \ + ${systemd_unitdir}/system/nfs-statd.service" +RDEPENDS_${PN}-client = "${PN}-mount" + +FILES_${PN}-mount = "${base_sbindir}/*mount.nfs*" + +FILES_${PN}-stats = "${sbindir}/mountstats ${sbindir}/nfsiostat ${sbindir}/nfsdclnts" + +FILES_${PN}-staticdev += "${libdir}/libnfsidmap/*.a" + +FILES_${PN} += "${systemd_unitdir} ${libdir}/libnfsidmap/" + +do_configure_prepend() { + sed -i -e 's,sbindir = /sbin,sbindir = ${base_sbindir},g' \ + ${S}/utils/mount/Makefile.am +} + +# Make clean needed because the package comes with +# precompiled 64-bit objects that break the build +do_compile_prepend() { + make clean +} + +# Works on systemd only +HIGH_RLIMIT_NOFILE ??= "4096" + +do_install_append () { + install -d ${D}${sysconfdir}/init.d + install -m 0755 ${WORKDIR}/nfsserver ${D}${sysconfdir}/init.d/nfsserver + install -m 0755 ${WORKDIR}/nfscommon ${D}${sysconfdir}/init.d/nfscommon + + install -m 0755 ${WORKDIR}/nfs-utils.conf ${D}${sysconfdir} + install -m 0755 ${S}/utils/mount/nfsmount.conf ${D}${sysconfdir} + + install -d ${D}${systemd_unitdir}/system + install -m 0644 ${WORKDIR}/nfs-server.service ${D}${systemd_unitdir}/system/ + install -m 0644 ${WORKDIR}/nfs-mountd.service ${D}${systemd_unitdir}/system/ + install -m 0644 ${WORKDIR}/nfs-statd.service ${D}${systemd_unitdir}/system/ + sed -i -e 's,@SBINDIR@,${sbindir},g' \ + -e 's,@SYSCONFDIR@,${sysconfdir},g' \ + -e 's,@HIGH_RLIMIT_NOFILE@,${HIGH_RLIMIT_NOFILE},g' \ + ${D}${systemd_unitdir}/system/*.service + if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then + install -m 0644 ${WORKDIR}/proc-fs-nfsd.mount ${D}${systemd_unitdir}/system/ + install -d ${D}${systemd_unitdir}/system/sysinit.target.wants/ + ln -sf ../proc-fs-nfsd.mount ${D}${systemd_unitdir}/system/sysinit.target.wants/proc-fs-nfsd.mount + fi + + # kernel code as of 3.8 hard-codes this path as a default + install -d ${D}/var/lib/nfs/v4recovery + + chmod 0644 ${D}${localstatedir}/lib/nfs/statd/state + + # Make python tools use python 3 + sed -i -e '1s,#!.*python.*,#!${bindir}/python3,' ${D}${sbindir}/mountstats ${D}${sbindir}/nfsiostat +} -- Gitee From 6dc24b14b7cc61660dda5f0a19ae17833b3eb118 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 17 Jan 2022 14:26:19 +0800 Subject: [PATCH 169/304] add recipe for iptables Signed-off-by: lixiaoyong --- .../iptables/iptables/ip6tables.rules | 0 .../iptables/iptables/ip6tables.service | 13 +++ .../iptables/iptables/iptables.rules | 0 .../iptables/iptables/iptables.service | 13 +++ .../recipes-core/iptables/iptables_1.8.7.bb | 104 ++++++++++++++++++ 5 files changed, 130 insertions(+) create mode 100644 meta-openeuler/recipes-core/iptables/iptables/ip6tables.rules create mode 100644 meta-openeuler/recipes-core/iptables/iptables/ip6tables.service create mode 100644 meta-openeuler/recipes-core/iptables/iptables/iptables.rules create mode 100644 meta-openeuler/recipes-core/iptables/iptables/iptables.service create mode 100644 meta-openeuler/recipes-core/iptables/iptables_1.8.7.bb diff --git a/meta-openeuler/recipes-core/iptables/iptables/ip6tables.rules b/meta-openeuler/recipes-core/iptables/iptables/ip6tables.rules new file mode 100644 index 00000000000..e69de29bb2d diff --git a/meta-openeuler/recipes-core/iptables/iptables/ip6tables.service b/meta-openeuler/recipes-core/iptables/iptables/ip6tables.service new file mode 100644 index 00000000000..6c059fca49b --- /dev/null +++ b/meta-openeuler/recipes-core/iptables/iptables/ip6tables.service @@ -0,0 +1,13 @@ +[Unit] +Description=IPv6 Packet Filtering Framework +Before=network-pre.target +Wants=network-pre.target + +[Service] +Type=oneshot +ExecStart=@SBINDIR@/ip6tables-restore -w -- @RULESDIR@/ip6tables.rules +ExecReload=@SBINDIR@/ip6tables-restore -w -- @RULESDIR@/ip6tables.rules +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/meta-openeuler/recipes-core/iptables/iptables/iptables.rules b/meta-openeuler/recipes-core/iptables/iptables/iptables.rules new file mode 100644 index 00000000000..e69de29bb2d diff --git a/meta-openeuler/recipes-core/iptables/iptables/iptables.service b/meta-openeuler/recipes-core/iptables/iptables/iptables.service new file mode 100644 index 00000000000..0eb3c343de7 --- /dev/null +++ b/meta-openeuler/recipes-core/iptables/iptables/iptables.service @@ -0,0 +1,13 @@ +[Unit] +Description=IPv4 Packet Filtering Framework +Before=network-pre.target +Wants=network-pre.target + +[Service] +Type=oneshot +ExecStart=@SBINDIR@/iptables-restore -w -- @RULESDIR@/iptables.rules +ExecReload=@SBINDIR@/iptables-restore -w -- @RULESDIR@/iptables.rules +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/meta-openeuler/recipes-core/iptables/iptables_1.8.7.bb b/meta-openeuler/recipes-core/iptables/iptables_1.8.7.bb new file mode 100644 index 00000000000..b2e7e2a20a4 --- /dev/null +++ b/meta-openeuler/recipes-core/iptables/iptables_1.8.7.bb @@ -0,0 +1,104 @@ +SUMMARY = "Tools for managing kernel packet filtering capabilities" +DESCRIPTION = "iptables is the userspace command line program used to configure and control network packet \ +filtering code in Linux." +HOMEPAGE = "http://www.netfilter.org/" +BUGTRACKER = "http://bugzilla.netfilter.org/" +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ + file://iptables/iptables.c;beginline=13;endline=25;md5=c5cffd09974558cf27d0f763df2a12dc \ +" +SRC_URI = "file://iptables/iptables-${PV}.tar.bz2 \ + file://iptables.service \ + file://iptables.rules \ + file://ip6tables.service \ + file://ip6tables.rules \ + " +SRC_URI[sha256sum] = "c109c96bb04998cd44156622d36f8e04b140701ec60531a10668cfdff5e8d8f0" + +SYSTEMD_SERVICE_${PN} = "\ + iptables.service \ + ${@bb.utils.contains('PACKAGECONFIG', 'ipv6', 'ip6tables.service', '', d)} \ +" + +inherit autotools pkgconfig systemd + +EXTRA_OECONF = "--with-kernel=${STAGING_INCDIR}" + +PACKAGECONFIG ?= "${@bb.utils.filter('DISTRO_FEATURES', 'ipv6', d)}" +PACKAGECONFIG[ipv6] = "--enable-ipv6,--disable-ipv6," + +# libnftnl recipe is in meta-networking layer(previously known as libnftables) +PACKAGECONFIG[libnftnl] = "--enable-nftables,--disable-nftables,libnftnl" + +do_configure_prepend() { + # Remove some libtool m4 files + # Keep ax_check_linker_flags.m4 which belongs to autoconf-archive. + rm -f libtool.m4 lt~obsolete.m4 ltoptions.m4 ltsugar.m4 ltversion.m4 +} + +IPTABLES_RULES_DIR ?= "${sysconfdir}/${BPN}" + +do_install_append() { + install -d ${D}${IPTABLES_RULES_DIR} + install -m 0644 ${WORKDIR}/iptables.rules ${D}${IPTABLES_RULES_DIR} + + install -d ${D}${systemd_system_unitdir} + install -m 0644 ${WORKDIR}/iptables.service ${D}${systemd_system_unitdir} + + sed -i \ + -e 's,@SBINDIR@,${sbindir},g' \ + -e 's,@RULESDIR@,${IPTABLES_RULES_DIR},g' \ + ${D}${systemd_system_unitdir}/iptables.service + + if ${@bb.utils.contains('PACKAGECONFIG', 'ipv6', 'true', 'false', d)} ; then + install -m 0644 ${WORKDIR}/ip6tables.rules ${D}${IPTABLES_RULES_DIR} + install -m 0644 ${WORKDIR}/ip6tables.service ${D}${systemd_system_unitdir} + + sed -i \ + -e 's,@SBINDIR@,${sbindir},g' \ + -e 's,@RULESDIR@,${IPTABLES_RULES_DIR},g' \ + ${D}${systemd_system_unitdir}/ip6tables.service + fi +} + +PACKAGES =+ "${PN}-modules ${PN}-apply" +PACKAGES_DYNAMIC += "^${PN}-module-.*" + +python populate_packages_prepend() { + modules = do_split_packages(d, '${libdir}/xtables', r'lib(.*)\.so$', '${PN}-module-%s', '${PN} module %s', extra_depends='') + if modules: + metapkg = d.getVar('PN') + '-modules' + d.appendVar('RDEPENDS_' + metapkg, ' ' + ' '.join(modules)) +} + +RDEPENDS_${PN} = "${PN}-module-xt-standard" +RRECOMMENDS_${PN} = " \ + ${PN}-modules \ + kernel-module-x-tables \ + kernel-module-ip-tables \ + kernel-module-iptable-filter \ + kernel-module-iptable-nat \ + kernel-module-nf-defrag-ipv4 \ + kernel-module-nf-conntrack \ + kernel-module-nf-conntrack-ipv4 \ + kernel-module-nf-nat \ + kernel-module-ipt-masquerade \ + ${@bb.utils.contains('PACKAGECONFIG', 'ipv6', '\ + kernel-module-ip6table-filter \ + kernel-module-ip6-tables \ + ', '', d)} \ +" + +FILES_${PN} += "${datadir}/xtables" + +FILES_${PN}-apply = "${sbindir}/ip*-apply" +RDEPENDS_${PN}-apply = "${PN}" + +# Include the symlinks as well in respective packages +FILES_${PN}-module-xt-conntrack += "${libdir}/xtables/libxt_state.so" +FILES_${PN}-module-xt-ct += "${libdir}/xtables/libxt_NOTRACK.so" + +ALLOW_EMPTY_${PN}-modules = "1" + +INSANE_SKIP_${PN}-module-xt-conntrack = "dev-so" +INSANE_SKIP_${PN}-module-xt-ct = "dev-so" -- Gitee From 86a99d42fd547ad812c96ee58e61d54747f29277 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 17 Jan 2022 14:26:53 +0800 Subject: [PATCH 170/304] add recipe for iproute2 Signed-off-by: lixiaoyong --- .../recipes-core/iproute2/iproute2.inc | 91 +++++++++++++++++++ .../recipes-core/iproute2/iproute2_5.15.0.bb | 11 +++ 2 files changed, 102 insertions(+) create mode 100644 meta-openeuler/recipes-core/iproute2/iproute2.inc create mode 100644 meta-openeuler/recipes-core/iproute2/iproute2_5.15.0.bb diff --git a/meta-openeuler/recipes-core/iproute2/iproute2.inc b/meta-openeuler/recipes-core/iproute2/iproute2.inc new file mode 100644 index 00000000000..ba83686c2bd --- /dev/null +++ b/meta-openeuler/recipes-core/iproute2/iproute2.inc @@ -0,0 +1,91 @@ +SUMMARY = "TCP / IP networking and traffic control utilities" +DESCRIPTION = "Iproute2 is a collection of utilities for controlling \ +TCP / IP networking and traffic control in Linux. Of the utilities ip \ +and tc are the most important. ip controls IPv4 and IPv6 \ +configuration and tc stands for traffic control." +HOMEPAGE = "http://www.linuxfoundation.org/collaborate/workgroups/networking/iproute2" +SECTION = "base" +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://COPYING;md5=eb723b61539feef013de476e68b5c50a \ + file://ip/ip.c;beginline=3;endline=8;md5=689d691d0410a4b64d3899f8d6e31817" + +DEPENDS = "flex-native bison-native iptables libcap" + +inherit pkgconfig + +CLEANBROKEN = "1" + +PACKAGECONFIG ??= "elf" +PACKAGECONFIG[elf] = ",,elfutils," + +IPROUTE2_MAKE_SUBDIRS = "lib tc ip bridge misc genl ${@bb.utils.filter('PACKAGECONFIG', 'devlink tipc rdma', d)}" + +EXTRA_OEMAKE = "\ + CC='${CC}' \ + KERNEL_INCLUDE=${STAGING_INCDIR} \ + DOCDIR=${docdir}/iproute2 \ + SUBDIRS='${IPROUTE2_MAKE_SUBDIRS}' \ + SBINDIR='${base_sbindir}' \ + LIBDIR='${libdir}' \ +" + +do_configure_append () { + sh configure ${STAGING_INCDIR} + # Explicitly disable ATM support + sed -i -e '/TC_CONFIG_ATM/d' config.mk +} + +do_install () { + oe_runmake DESTDIR=${D} install + mv ${D}${base_sbindir}/ip ${D}${base_sbindir}/ip.iproute2 + install -d ${D}${datadir} + mv ${D}/share/* ${D}${datadir}/ || true + rm ${D}/share -rf || true +} + +# The .so files in iproute2-tc are modules, not traditional libraries +INSANE_SKIP_${PN}-tc = "dev-so" + +IPROUTE2_PACKAGES =+ "\ + ${PN}-devlink \ + ${PN}-genl \ + ${PN}-ifstat \ + ${PN}-ip \ + ${PN}-lnstat \ + ${PN}-nstat \ + ${PN}-rtacct \ + ${PN}-ss \ + ${PN}-tc \ + ${PN}-tipc \ + ${PN}-rdma \ + ${PN}-bash-completion \ +" + +PACKAGE_BEFORE_PN = "${IPROUTE2_PACKAGES}" +RDEPENDS_${PN} += "${PN}-ip" + +FILES_${PN}-bash-completion = "${datadir}/bash-completion/completions" + +FILES_${PN}-tc = "${base_sbindir}/tc* \ + ${libdir}/tc/*.so" +FILES_${PN}-lnstat = "${base_sbindir}/lnstat \ + ${base_sbindir}/ctstat \ + ${base_sbindir}/rtstat" +FILES_${PN}-ifstat = "${base_sbindir}/ifstat" +FILES_${PN}-ip = "${base_sbindir}/ip.${PN} ${sysconfdir}/iproute2" +FILES_${PN}-genl = "${base_sbindir}/genl" +FILES_${PN}-rtacct = "${base_sbindir}/rtacct" +FILES_${PN}-nstat = "${base_sbindir}/nstat" +FILES_${PN}-ss = "${base_sbindir}/ss" +FILES_${PN}-tipc = "${base_sbindir}/tipc" +FILES_${PN}-devlink = "${base_sbindir}/devlink" +FILES_${PN}-rdma = "${base_sbindir}/rdma" + +ALTERNATIVE_${PN}-ip = "ip" +ALTERNATIVE_TARGET[ip] = "${base_sbindir}/ip.${BPN}" +ALTERNATIVE_LINK_NAME[ip] = "${base_sbindir}/ip" +ALTERNATIVE_PRIORITY = "100" + +ALTERNATIVE_${PN}-tc = "tc" +ALTERNATIVE_LINK_NAME[tc] = "${base_sbindir}/tc" +ALTERNATIVE_PRIORITY_${PN}-tc = "100" diff --git a/meta-openeuler/recipes-core/iproute2/iproute2_5.15.0.bb b/meta-openeuler/recipes-core/iproute2/iproute2_5.15.0.bb new file mode 100644 index 00000000000..6eb76673237 --- /dev/null +++ b/meta-openeuler/recipes-core/iproute2/iproute2_5.15.0.bb @@ -0,0 +1,11 @@ +require iproute2.inc + +SRC_URI = "file://iproute/${BP}.tar.xz \ + file://iproute/bugfix-iproute2-3.10.0-fix-maddr-show.patch \ + file://iproute/bugfix-iproute2-change-proc-to-ipnetnsproc-which-is-private.patch \ + " + +SRC_URI[sha256sum] = "56d7dcb05b564c94cf6e4549cec2f93f2dc58085355c08dcb2a8f8249c946080" + +# CFLAGS are computed in Makefile and reference CCOPTS +EXTRA_OEMAKE_append = " CCOPTS='${CFLAGS}'" -- Gitee From a4483ab28e3d75efa434047d4470945725e8b0f7 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 17 Jan 2022 14:35:59 +0800 Subject: [PATCH 171/304] add recipe for Linux DiskQuota Signed-off-by: lixiaoyong --- .../recipes-core/quota/quota_4.06.bb | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 meta-openeuler/recipes-core/quota/quota_4.06.bb diff --git a/meta-openeuler/recipes-core/quota/quota_4.06.bb b/meta-openeuler/recipes-core/quota/quota_4.06.bb new file mode 100644 index 00000000000..735a33b4b81 --- /dev/null +++ b/meta-openeuler/recipes-core/quota/quota_4.06.bb @@ -0,0 +1,35 @@ +SUMMARY = "Tools for monitoring & limiting user disk usage per filesystem" +SECTION = "base" +HOMEPAGE = "http://sourceforge.net/projects/linuxquota/" +DESCRIPTION = "Tools and patches for the Linux Diskquota system as part of the Linux kernel" +BUGTRACKER = "http://sourceforge.net/tracker/?group_id=18136&atid=118136" +LICENSE = "BSD & GPLv2+ & LGPLv2.1+" +LIC_FILES_CHKSUM = "file://rquota_server.c;beginline=1;endline=20;md5=fe7e0d7e11c6f820f8fa62a5af71230f \ + file://svc_socket.c;beginline=1;endline=17;md5=24d5a8792da45910786eeac750be8ceb" + +SRC_URI = "file://quota/${BP}.tar.gz \ + file://quota/0000-Limit-number-of-comparison-characters-to-4.patch \ + file://quota/0001-Limit-maximum-of-RPC-port.patch \ + file://quota/0002-quotaio_xfs-Warn-when-large-kernel-timestamps-cannot.patch \ +" +SRC_URI[sha256sum] = "2f3e03039f378d4f0d97acdb49daf581dcaad64d2e1ddf129495fd579fbd268d" + +CVE_PRODUCT = "linux_diskquota" + +UPSTREAM_CHECK_URI = "http://sourceforge.net/projects/linuxquota/files/quota-tools/" +UPSTREAM_CHECK_REGEX = "/quota-tools/(?P(\d+[\.\-_]*)+)/" + +DEPENDS = "gettext-native e2fsprogs libnl" + +inherit autotools-brokensep gettext pkgconfig + +CFLAGS += "${@bb.utils.contains('PACKAGECONFIG', 'rpc', '-I${STAGING_INCDIR}/tirpc', '', d)}" +LDFLAGS += "${@bb.utils.contains('PACKAGECONFIG', 'rpc', '-ltirpc', '', d)}" +ASNEEDED = "" + +PACKAGECONFIG ??= "rpc bsd" +PACKAGECONFIG_libc-musl = "tcp-wrappers rpc" + +PACKAGECONFIG[rpc] = "--enable-rpc,--disable-rpc,libtirpc" +PACKAGECONFIG[bsd] = "--enable-bsd_behaviour=yes,--enable-bsd_behaviour=no," +PACKAGECONFIG[ldapmail] = "--enable-ldapmail,--disable-ldapmail,openldap" -- Gitee From a3cc8fb4bdb8ea5e2a6e7e63d5a353b1220c4502 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Mon, 17 Jan 2022 14:38:00 +0800 Subject: [PATCH 172/304] add recipe for rpcbind Signed-off-by: lixiaoyong --- .../recipes-core/rpcbind/rpcbind/init.d | 87 +++++++++++++++++++ .../recipes-core/rpcbind/rpcbind/rpcbind.conf | 3 + .../recipes-core/rpcbind/rpcbind_1.2.6.bb | 57 ++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 meta-openeuler/recipes-core/rpcbind/rpcbind/init.d create mode 100644 meta-openeuler/recipes-core/rpcbind/rpcbind/rpcbind.conf create mode 100644 meta-openeuler/recipes-core/rpcbind/rpcbind_1.2.6.bb diff --git a/meta-openeuler/recipes-core/rpcbind/rpcbind/init.d b/meta-openeuler/recipes-core/rpcbind/rpcbind/init.d new file mode 100644 index 00000000000..67499aa828b --- /dev/null +++ b/meta-openeuler/recipes-core/rpcbind/rpcbind/init.d @@ -0,0 +1,87 @@ +#!/bin/sh +# +# start/stop rpcbind daemon. + +### BEGIN INIT INFO +# Provides: rpcbind +# Required-Start: $network +# Required-Stop: $network +# Default-Start: S 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: RPC portmapper replacement +# Description: rpcbind is a server that converts RPC (Remote +# Procedure Call) program numbers into DARPA +# protocol port numbers. It must be running in +# order to make RPC calls. Services that use +# RPC include NFS and NIS. +### END INIT INFO + +# Source function library. +. /etc/init.d/functions + +test -f /sbin/rpcbind || exit 0 + +OPTIONS="" +if [ -f /etc/default/rpcbind ] +then + . /etc/default/rpcbind +elif [ -f /etc/rpcbind.conf ] +then + . /etc/rpcbind.conf +fi + +start () +{ + echo -n "Starting rpcbind daemon..." + if pidof /sbin/rpcbind >/dev/null; then + echo "already running." + exit 0 + fi + start-stop-daemon --start --quiet --exec /sbin/rpcbind -- "$@" + if [ $? -eq 0 ]; then + echo "done." + else + echo "failed." + fi +} + +stop () +{ + echo "Stopping rpcbind daemon..." + if ! pidof /sbin/rpcbind >/dev/null; then + echo "not running." + return 0 + fi + start-stop-daemon --stop --quiet --exec /sbin/rpcbind + if [ $? -eq 0 ]; then + echo "done." + else + echo "failed." + fi +} + +case "$1" in + start) + start $OPTIONS + ;; + stop) + stop + ;; + force-reload) + stop + start $OPTIONS + ;; + restart) + stop + start $OPTIONS + ;; + status) + status /sbin/rpcbind + ;; + *) + echo "Usage: /etc/init.d/rpcbind {start|stop|force-reload|restart|status}" + exit 1 + ;; +esac + +exit $? diff --git a/meta-openeuler/recipes-core/rpcbind/rpcbind/rpcbind.conf b/meta-openeuler/recipes-core/rpcbind/rpcbind/rpcbind.conf new file mode 100644 index 00000000000..f423ac17889 --- /dev/null +++ b/meta-openeuler/recipes-core/rpcbind/rpcbind/rpcbind.conf @@ -0,0 +1,3 @@ +# Optional arguments passed to rpcbind. +# +RPCBIND_OPTIONS="" diff --git a/meta-openeuler/recipes-core/rpcbind/rpcbind_1.2.6.bb b/meta-openeuler/recipes-core/rpcbind/rpcbind_1.2.6.bb new file mode 100644 index 00000000000..978fd3e8375 --- /dev/null +++ b/meta-openeuler/recipes-core/rpcbind/rpcbind_1.2.6.bb @@ -0,0 +1,57 @@ +SUMMARY = "Universal Addresses to RPC Program Number Mapper" +DESCRIPTION = "The rpcbind utility is a server that converts RPC \ + program numbers into universal addresses." +SECTION = "console/network" +HOMEPAGE = "http://sourceforge.net/projects/rpcbind/" +BUGTRACKER = "http://sourceforge.net/tracker/?group_id=201237&atid=976751" +DEPENDS = "libtirpc quota" + +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://COPYING;md5=b46486e4c4a416602693a711bb5bfa39 \ + file://src/rpcinfo.c;beginline=1;endline=27;md5=f8a8cd2cb25ac5aa16767364fb0e3c24" + +SRC_URI = "file://rpcbind/${BP}.tar.bz2 \ + file://rpcbind/rpcbind-0.2.3-systemd-envfile.patch \ + file://rpcbind/rpcbind-0.2.4-runstatdir.patch \ + file://rpcbind/rpcbind-0.2.4-systemd-service.patch \ + file://rpcbind/rpcbind-0.2.4-systemd-rundir.patch \ + file://rpcbind/CVE-2017-8779.patch \ + file://rpcbind/bugfix-listen-tcp-port-111.patch \ + file://init.d \ + file://rpcbind.conf \ +" +SRC_URI[md5sum] = "2d84ebbb7d6fb1fc3566d2d4b37f214b" +SRC_URI[sha256sum] = "5613746489cae5ae23a443bb85c05a11741a5f12c8f55d2bb5e83b9defeee8de" + +inherit autotools systemd pkgconfig + +PACKAGECONFIG ??= "tcp-wrappers" +PACKAGECONFIG[tcp-wrappers] = "--enable-libwrap,--disable-libwrap,tcp-wrappers" + +INITSCRIPT_NAME = "rpcbind" +INITSCRIPT_PARAMS = "start 12 2 3 4 5 . stop 60 0 1 6 ." + +SYSTEMD_SERVICE_${PN} = "rpcbind.service rpcbind.socket" + +USERADD_PACKAGES = "${PN}" +USERADD_PARAM_${PN} = "--system --no-create-home --home-dir / \ + --shell /bin/false --user-group rpc" + +PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)}" +PACKAGECONFIG[systemd] = "--with-systemdsystemunitdir=${systemd_unitdir}/system/, \ + --without-systemdsystemunitdir, \ + systemd \ +" + +EXTRA_OECONF += " --enable-warmstarts --with-rpcuser=rpc --without-systemdsystemunitdir" + +do_install_append () { + install -d ${D}${sysconfdir}/init.d + sed -e 's,/etc/,${sysconfdir}/,g' \ + -e 's,/sbin/,${sbindir}/,g' \ + ${WORKDIR}/init.d > ${D}${sysconfdir}/init.d/rpcbind + chmod 0755 ${D}${sysconfdir}/init.d/rpcbind +} + +ALTERNATIVE_${PN} = "rpcinfo" +ALTERNATIVE_LINK_NAME[rpcinfo] = "${bindir}/rpcinfo" -- Gitee From 0136b1efd3456c7892cb82d318925d634b2f2bf8 Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 18 Jan 2022 17:19:49 +0800 Subject: [PATCH 173/304] add meta-raspberrypi get from https://git.yoctoproject.org/git/meta-raspberrypi, branch hardknott Signed-off-by: lisimin --- bsp/meta-raspberrypi/COPYING.MIT | 17 + bsp/meta-raspberrypi/README.md | 84 + .../classes/sdcard_image-rpi.bbclass | 209 ++ bsp/meta-raspberrypi/conf/layer.conf | 40 + .../conf/machine/include/rpi-base.inc | 146 + .../machine/include/rpi-default-providers.inc | 15 + .../machine/include/rpi-default-settings.inc | 9 + .../machine/include/rpi-default-versions.inc | 3 + .../machine/include/tune-arm1176jzf-s.inc | 17 + .../conf/machine/raspberrypi-cm.conf | 8 + .../conf/machine/raspberrypi-cm3.conf | 13 + .../conf/machine/raspberrypi.conf | 14 + .../conf/machine/raspberrypi0-wifi.conf | 18 + .../conf/machine/raspberrypi0.conf | 8 + .../conf/machine/raspberrypi2.conf | 14 + .../conf/machine/raspberrypi3-64.conf | 36 + .../conf/machine/raspberrypi3.conf | 21 + .../conf/machine/raspberrypi4-64.conf | 36 + .../conf/machine/raspberrypi4.conf | 21 + bsp/meta-raspberrypi/docs/Makefile | 225 ++ bsp/meta-raspberrypi/docs/conf.py | 343 ++ bsp/meta-raspberrypi/docs/contributing.md | 109 + bsp/meta-raspberrypi/docs/extra-apps.md | 9 + .../docs/extra-build-config.md | 351 ++ bsp/meta-raspberrypi/docs/index.rst | 26 + bsp/meta-raspberrypi/docs/layer-contents.md | 36 + bsp/meta-raspberrypi/docs/readme.md | 1 + .../lirc/lirc/lirc-gpio-ir-0.10.patch | 175 + .../lirc/lirc/lircd.service | 11 + .../lirc/lirc_0.10.1.bbappend | 6 + .../packagegroup-rpi-test.bbappend | 4 + .../python/python3-sense-hat_2.2.0.bb | 24 + .../libcamera/libcamera.bbappend | 2 + .../recipes-support/drbd/drbd_%.bbappend | 3 + .../packagegroup-meta-oe.bbappend | 1 + .../recipes-qt/qt5/qtbase_%.bbappend | 19 + .../files/custom-licenses/Broadcom-RPi | 29 + bsp/meta-raspberrypi/img/balena.png | Bin 0 -> 7307 bytes bsp/meta-raspberrypi/kas-poky-rpi.yml | 61 + .../lib/oeqa/runtime/cases/parselogs_rpi.py | 18 + .../recipes-bsp/armstubs/armstubs.bb | 38 + .../recipes-bsp/bootfiles/rpi-bootfiles.bb | 43 + .../recipes-bsp/bootfiles/rpi-cmdline.bb | 51 + .../recipes-bsp/bootfiles/rpi-config_git.bb | 267 ++ .../common/raspberrypi-firmware.inc | 9 + .../recipes-bsp/common/raspberrypi-tools.inc | 9 + .../formfactor/formfactor/rpi/machconfig | 6 + .../formfactor/formfactor_%.bbappend | 1 + .../rpi-u-boot-scr/files/boot.cmd.in | 4 + .../rpi-u-boot-scr/rpi-u-boot-scr.bb | 28 + ...Move-ofdata_to_platdata-call-earlier.patch | 51 + .../recipes-bsp/u-boot/files/fw_env.config | 1 + .../recipes-bsp/u-boot/u-boot_%.bbappend | 15 + ...01-bcm43xx-Add-bcm43xx-3wire-variant.patch | 26 + ...-speed-must-be-reset-after-the-firmw.patch | 37 + ...ncrease-firmware-load-timeout-to-30s.patch | 25 + ...-the-43xx-firmware-into-lib-firmware.patch | 25 + .../bluez5/bluez5_%.bbappend | 10 + ...rrect-path-for-hciconfig-under-Yocto.patch | 27 + .../pi-bluetooth/pi-bluetooth_0.1.12.bb | 47 + .../recipes-core/images/rpi-basic-image.bb | 15 + .../recipes-core/images/rpi-hwup-image.bb | 11 + .../recipes-core/images/rpi-test-image.bb | 6 + .../packagegroup-core-tools-testapps.bbappend | 2 + .../packagegroups/packagegroup-rpi-test.bb | 29 + .../psplash/files/psplash-raspberrypi-img.h | 3210 +++++++++++++++++ .../recipes-core/psplash/psplash_%.bbappend | 2 + .../recipes-core/udev/udev-rules-rpi.bb | 18 + .../udev/udev-rules-rpi/99-com.rules | 21 + .../udev/udev-rules-rpi/can.rules | 1 + .../udev-rules-udisks-rpi/80-udisks-rpi.rules | 10 + .../udev/udev-rules-udisks-rpi_1.0.bb | 13 + .../recipes-devtools/bcm2835/bcm2835_1.52.bb | 42 + .../remove-initscript-lsb-dependency.patch | 96 + .../pi-blaster/pi-blaster_git.bb | 23 + .../python/python3-adafruit-blinka_6.2.2.bb | 30 + ...-adafruit-circuitpython-busdevice_5.0.5.bb | 18 + ...hon3-adafruit-circuitpython-motor_3.2.6.bb | 18 + ...3-adafruit-circuitpython-motorkit_1.6.1.bb | 22 + ...n3-adafruit-circuitpython-pca9685_3.3.4.bb | 20 + ...3-adafruit-circuitpython-register_1.9.4.bb | 15 + .../python3-adafruit-platformdetect_3.1.1.bb | 15 + .../python/python3-adafruit-pureio_1.1.8.bb | 19 + ...include-asm-ioctl.h-for-ioctl-define.patch | 33 + .../python/python3-rtimu_git.bb | 15 + .../0001-Remove-nested-functions.patch | 265 ++ .../recipes-devtools/python/rpi-gpio_0.7.0.bb | 18 + ...s.h-explicitly-for-getting-caddr_t-d.patch | 30 + .../recipes-devtools/python/rpio_0.10.0.bb | 23 + .../raspi-gpio/raspi-gpio_git.bb | 16 + .../recipes-graphics/cairo/cairo_%.bbappend | 3 + .../kmscube/kmscube_%.bbappend | 2 + .../libsdl2/libsdl2_%.bbappend | 5 + .../recipes-graphics/libva/libva_%.bbappend | 3 + .../recipes-graphics/mesa/libglu_%.bbappend | 3 + .../mesa/mesa-demos_%.bbappend | 2 + .../recipes-graphics/mesa/mesa-gl_%.bbappend | 8 + .../recipes-graphics/mesa/mesa_%.bbappend | 6 + .../recipes-graphics/piglit/piglit_%.bbappend | 5 + ...nore-add-archives-from-lib-directory.patch | 24 + ...002-add-install-targets-to-Makefiles.patch | 214 ++ .../raspidmx/0003-switch-to-pkg-config.patch | 114 + .../0004-add-libvchostif-to-link.patch | 170 + .../0005-change-library-linking-order.patch | 87 + ...me-Makefile-install-sample-png-files.patch | 24 + .../raspidmx/0007-Makefile-reorganize.patch | 57 + .../recipes-graphics/raspidmx/raspidmx_git.bb | 31 + ...ications-to-set-next-resource-handle.patch | 205 ++ ...d-Add-support-for-the-Wayland-winsys.patch | 1891 ++++++++++ .../0003-wayland-Add-Wayland-example.patch | 863 +++++ ...and-egl-Add-bcm_host-to-dependencies.patch | 25 + ...-faulty-assert-to-make-weston-happy-.patch | 26 + ...o-out-wl-buffers-in-egl_surface_free.patch | 30 + ...nitialize-front-back-wayland-buffers.patch | 31 + .../files/0008-Remove-RPC_FLUSH.patch | 24 + .../0009-fix-cmake-dependency-race.patch | 75 + ...or-framerate-with-nested-composition.patch | 57 + ...11-build-shared-library-for-vchostif.patch | 25 + ...ffer-wrapping-interface-for-dispmanx.patch | 89 + ...plement-triple-buffering-for-wayland.patch | 87 + ...xt.h-Define-GL_R8_EXT-and-GL_RG8_EXT.patch | 32 + ...015-EGL-glplatform.h-define-EGL_CAST.patch | 29 + ...ayland-compositor-state-data-per-pro.patch | 141 + ...-typedef-for-EGL_EXT_image_dma_buf_i.patch | 34 + ...IMG_context_priority-related-defines.patch | 32 + ...define-__wordsize-if-already-defined.patch | 28 + .../0020-openmaxil-add-pkg-config-file.patch | 40 + ...ble-format-overflow-warning-as-error.patch | 34 + ...cations-remove-non-existent-projects.patch | 30 + ...ptionally-build-wayland-specific-app.patch | 28 + ...Sync-needed-defines-for-weston-build.patch | 38 + .../recipes-graphics/userland/userland_git.bb | 108 + .../recipes-graphics/vc-graphics/files/egl.pc | 10 + .../vc-graphics/files/vchiq.sh | 24 + .../vc-graphics/vc-graphics-hardfp.bb | 6 + .../vc-graphics/vc-graphics.bb | 6 + .../vc-graphics/vc-graphics.inc | 54 + .../wayland/wayland_%.bbappend | 7 + .../wayland/weston_%.bbappend | 10 + .../xserver-xf86-config/rpi/xorg.conf | 6 + .../rpi/xorg.conf.d/98-pitft.conf | 5 + .../rpi/xorg.conf.d/99-calibration.conf | 6 + .../xserver-xf86-config_%.bbappend | 16 + .../xorg-xserver/xserver-xorg_%.bbappend | 5 + .../bluez-firmware-rpidistro_git.bb | 100 + .../linux-firmware-rpidistro_git.bb | 116 + ...-bpf-Skip-perf-hw-events-test-if-the.patch | 35 + ...-bpf-Fix-perf_buffer-test-on-systems.patch | 94 + .../linux/files/android-drivers.cfg | 8 + .../linux/files/initramfs-image-bundle.cfg | 5 + .../recipes-kernel/linux/files/powersave.cfg | 13 + .../raspberrypi4-64/rpi4-64-kernel-misc.cfg | 2 + .../linux/files/vc4graphics.cfg | 6 + .../linux/linux-raspberrypi-dev.bb | 35 + .../linux/linux-raspberrypi.inc | 36 + .../linux/linux-raspberrypi_5.10.bb | 19 + .../linux/linux-raspberrypi_5.4.bb | 23 + ...uire-buffer-when-src-pad-isn-t-activ.patch | 48 + .../0003-no-timeout-on-get-state.patch | 24 + ...handle-drain-requests-while-flushing.patch | 30 + ...omx_video_dec_set_format-if-there-s-.patch | 36 + .../gstreamer/gstreamer1.0-omx_%.bbappend | 12 + .../gstreamer1.0-plugins-bad_%.bbappend | 2 + .../gstreamer1.0-plugins-base_%.bbappend | 6 + .../gstreamer1.0-plugins-good_1.18.%.bbappend | 1 + .../0001-Fix-build-with-vc4-driver.patch | 49 + ...ile.include-which-includes-hardcoded.patch | 84 + ...xx-and-ld-variables-from-environment.patch | 42 + ...aders-from-ffmpeg-are-installed-in-u.patch | 63 + .../0003-Remove-strip-step-in-Makefile.patch | 27 + ...XTRA_CFLAGS-and-FFMPEG_EXTRA_LDFLAGS.patch | 37 + ...ire-internet-connection-during-build.patch | 55 + ...peg-configure-compile-race-condition.patch | 37 + ...-Remove-Makefile-hardcoded-arch-tune.patch | 8 + .../omxplayer/cross-crompile-ffmpeg.patch | 12 + .../omxplayer/fix-tar-command-with-DIST.patch | 32 + .../omxplayer/use-native-pkg-config.patch | 28 + .../omxplayer/omxplayer_git.bb | 108 + .../recipes-multimedia/x264/x264_%.bbappend | 2 + .../wic/sdimage-raspberrypi.wks | 6 + 180 files changed, 13114 insertions(+) create mode 100644 bsp/meta-raspberrypi/COPYING.MIT create mode 100644 bsp/meta-raspberrypi/README.md create mode 100644 bsp/meta-raspberrypi/classes/sdcard_image-rpi.bbclass create mode 100644 bsp/meta-raspberrypi/conf/layer.conf create mode 100644 bsp/meta-raspberrypi/conf/machine/include/rpi-base.inc create mode 100644 bsp/meta-raspberrypi/conf/machine/include/rpi-default-providers.inc create mode 100644 bsp/meta-raspberrypi/conf/machine/include/rpi-default-settings.inc create mode 100644 bsp/meta-raspberrypi/conf/machine/include/rpi-default-versions.inc create mode 100644 bsp/meta-raspberrypi/conf/machine/include/tune-arm1176jzf-s.inc create mode 100644 bsp/meta-raspberrypi/conf/machine/raspberrypi-cm.conf create mode 100644 bsp/meta-raspberrypi/conf/machine/raspberrypi-cm3.conf create mode 100644 bsp/meta-raspberrypi/conf/machine/raspberrypi.conf create mode 100644 bsp/meta-raspberrypi/conf/machine/raspberrypi0-wifi.conf create mode 100644 bsp/meta-raspberrypi/conf/machine/raspberrypi0.conf create mode 100644 bsp/meta-raspberrypi/conf/machine/raspberrypi2.conf create mode 100644 bsp/meta-raspberrypi/conf/machine/raspberrypi3-64.conf create mode 100644 bsp/meta-raspberrypi/conf/machine/raspberrypi3.conf create mode 100644 bsp/meta-raspberrypi/conf/machine/raspberrypi4-64.conf create mode 100644 bsp/meta-raspberrypi/conf/machine/raspberrypi4.conf create mode 100644 bsp/meta-raspberrypi/docs/Makefile create mode 100644 bsp/meta-raspberrypi/docs/conf.py create mode 100644 bsp/meta-raspberrypi/docs/contributing.md create mode 100644 bsp/meta-raspberrypi/docs/extra-apps.md create mode 100644 bsp/meta-raspberrypi/docs/extra-build-config.md create mode 100644 bsp/meta-raspberrypi/docs/index.rst create mode 100644 bsp/meta-raspberrypi/docs/layer-contents.md create mode 120000 bsp/meta-raspberrypi/docs/readme.md create mode 100644 bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-connectivity/lirc/lirc/lirc-gpio-ir-0.10.patch create mode 100644 bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-connectivity/lirc/lirc/lircd.service create mode 100644 bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-connectivity/lirc/lirc_0.10.1.bbappend create mode 100644 bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-core/packagegroups/packagegroup-rpi-test.bbappend create mode 100644 bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-devtools/python/python3-sense-hat_2.2.0.bb create mode 100644 bsp/meta-raspberrypi/dynamic-layers/multimedia-layer/recipes-multimedia/libcamera/libcamera.bbappend create mode 100644 bsp/meta-raspberrypi/dynamic-layers/networking-layer/recipes-support/drbd/drbd_%.bbappend create mode 100644 bsp/meta-raspberrypi/dynamic-layers/openembedded-layer/recipes-core/packagegroups/packagegroup-meta-oe.bbappend create mode 100644 bsp/meta-raspberrypi/dynamic-layers/qt5-layer/recipes-qt/qt5/qtbase_%.bbappend create mode 100644 bsp/meta-raspberrypi/files/custom-licenses/Broadcom-RPi create mode 100644 bsp/meta-raspberrypi/img/balena.png create mode 100644 bsp/meta-raspberrypi/kas-poky-rpi.yml create mode 100644 bsp/meta-raspberrypi/lib/oeqa/runtime/cases/parselogs_rpi.py create mode 100644 bsp/meta-raspberrypi/recipes-bsp/armstubs/armstubs.bb create mode 100644 bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-bootfiles.bb create mode 100644 bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-cmdline.bb create mode 100644 bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bb create mode 100644 bsp/meta-raspberrypi/recipes-bsp/common/raspberrypi-firmware.inc create mode 100644 bsp/meta-raspberrypi/recipes-bsp/common/raspberrypi-tools.inc create mode 100644 bsp/meta-raspberrypi/recipes-bsp/formfactor/formfactor/rpi/machconfig create mode 100644 bsp/meta-raspberrypi/recipes-bsp/formfactor/formfactor_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/files/boot.cmd.in create mode 100644 bsp/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/rpi-u-boot-scr.bb create mode 100644 bsp/meta-raspberrypi/recipes-bsp/u-boot/files/0001-dm-core-Move-ofdata_to_platdata-call-earlier.patch create mode 100644 bsp/meta-raspberrypi/recipes-bsp/u-boot/files/fw_env.config create mode 100644 bsp/meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0001-bcm43xx-Add-bcm43xx-3wire-variant.patch create mode 100644 bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch create mode 100644 bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0003-Increase-firmware-load-timeout-to-30s.patch create mode 100644 bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0004-Move-the-43xx-firmware-into-lib-firmware.patch create mode 100644 bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-connectivity/pi-bluetooth/pi-bluetooth/0001-bthelper-correct-path-for-hciconfig-under-Yocto.patch create mode 100644 bsp/meta-raspberrypi/recipes-connectivity/pi-bluetooth/pi-bluetooth_0.1.12.bb create mode 100644 bsp/meta-raspberrypi/recipes-core/images/rpi-basic-image.bb create mode 100644 bsp/meta-raspberrypi/recipes-core/images/rpi-hwup-image.bb create mode 100644 bsp/meta-raspberrypi/recipes-core/images/rpi-test-image.bb create mode 100644 bsp/meta-raspberrypi/recipes-core/packagegroups/packagegroup-core-tools-testapps.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-core/packagegroups/packagegroup-rpi-test.bb create mode 100644 bsp/meta-raspberrypi/recipes-core/psplash/files/psplash-raspberrypi-img.h create mode 100644 bsp/meta-raspberrypi/recipes-core/psplash/psplash_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-core/udev/udev-rules-rpi.bb create mode 100644 bsp/meta-raspberrypi/recipes-core/udev/udev-rules-rpi/99-com.rules create mode 100644 bsp/meta-raspberrypi/recipes-core/udev/udev-rules-rpi/can.rules create mode 100644 bsp/meta-raspberrypi/recipes-core/udev/udev-rules-udisks-rpi/80-udisks-rpi.rules create mode 100644 bsp/meta-raspberrypi/recipes-core/udev/udev-rules-udisks-rpi_1.0.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/bcm2835/bcm2835_1.52.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/pi-blaster/files/remove-initscript-lsb-dependency.patch create mode 100644 bsp/meta-raspberrypi/recipes-devtools/pi-blaster/pi-blaster_git.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-blinka_6.2.2.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-busdevice_5.0.5.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-motor_3.2.6.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-motorkit_1.6.1.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-pca9685_3.3.4.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-register_1.9.4.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-platformdetect_3.1.1.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-pureio_1.1.8.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/python3-rtimu/0001-include-asm-ioctl.h-for-ioctl-define.patch create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/python3-rtimu_git.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/rpi-gpio/0001-Remove-nested-functions.patch create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/rpi-gpio_0.7.0.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/rpio/0001-include-sys-types.h-explicitly-for-getting-caddr_t-d.patch create mode 100644 bsp/meta-raspberrypi/recipes-devtools/python/rpio_0.10.0.bb create mode 100644 bsp/meta-raspberrypi/recipes-devtools/raspi-gpio/raspi-gpio_git.bb create mode 100644 bsp/meta-raspberrypi/recipes-graphics/cairo/cairo_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-graphics/kmscube/kmscube_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-graphics/libsdl2/libsdl2_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-graphics/libva/libva_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-graphics/mesa/libglu_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-graphics/mesa/mesa-demos_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-graphics/mesa/mesa-gl_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-graphics/mesa/mesa_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-graphics/piglit/piglit_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0001-gitignore-add-archives-from-lib-directory.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0002-add-install-targets-to-Makefiles.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0003-switch-to-pkg-config.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0004-add-libvchostif-to-link.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0005-change-library-linking-order.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0006-game-Makefile-install-sample-png-files.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0007-Makefile-reorganize.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx_git.bb create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0001-Allow-applications-to-set-next-resource-handle.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0002-wayland-Add-support-for-the-Wayland-winsys.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0003-wayland-Add-Wayland-example.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0004-wayland-egl-Add-bcm_host-to-dependencies.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0005-interface-remove-faulty-assert-to-make-weston-happy-.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0006-zero-out-wl-buffers-in-egl_surface_free.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0007-initialize-front-back-wayland-buffers.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0008-Remove-RPC_FLUSH.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0009-fix-cmake-dependency-race.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0010-Fix-for-framerate-with-nested-composition.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0011-build-shared-library-for-vchostif.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0012-implement-buffer-wrapping-interface-for-dispmanx.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0013-Implement-triple-buffering-for-wayland.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0014-GLES2-gl2ext.h-Define-GL_R8_EXT-and-GL_RG8_EXT.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0015-EGL-glplatform.h-define-EGL_CAST.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0016-Allow-multiple-wayland-compositor-state-data-per-pro.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0017-khronos-backport-typedef-for-EGL_EXT_image_dma_buf_i.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0018-Add-EGL_IMG_context_priority-related-defines.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0019-libfdt-Undefine-__wordsize-if-already-defined.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0020-openmaxil-add-pkg-config-file.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0021-cmake-Disable-format-overflow-warning-as-error.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0022-all-host_applications-remove-non-existent-projects.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0023-hello_pi-optionally-build-wayland-specific-app.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/files/0024-userland-Sync-needed-defines-for-weston-build.patch create mode 100644 bsp/meta-raspberrypi/recipes-graphics/userland/userland_git.bb create mode 100644 bsp/meta-raspberrypi/recipes-graphics/vc-graphics/files/egl.pc create mode 100644 bsp/meta-raspberrypi/recipes-graphics/vc-graphics/files/vchiq.sh create mode 100644 bsp/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics-hardfp.bb create mode 100644 bsp/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.bb create mode 100644 bsp/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.inc create mode 100644 bsp/meta-raspberrypi/recipes-graphics/wayland/wayland_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-graphics/wayland/weston_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf create mode 100644 bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/98-pitft.conf create mode 100644 bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/99-calibration.conf create mode 100644 bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xorg_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-kernel/bluez-firmware-rpidistro/bluez-firmware-rpidistro_git.bb create mode 100644 bsp/meta-raspberrypi/recipes-kernel/linux-firmware-rpidistro/linux-firmware-rpidistro_git.bb create mode 100644 bsp/meta-raspberrypi/recipes-kernel/linux/files/0001-Revert-selftests-bpf-Skip-perf-hw-events-test-if-the.patch create mode 100644 bsp/meta-raspberrypi/recipes-kernel/linux/files/0002-Revert-selftests-bpf-Fix-perf_buffer-test-on-systems.patch create mode 100644 bsp/meta-raspberrypi/recipes-kernel/linux/files/android-drivers.cfg create mode 100644 bsp/meta-raspberrypi/recipes-kernel/linux/files/initramfs-image-bundle.cfg create mode 100644 bsp/meta-raspberrypi/recipes-kernel/linux/files/powersave.cfg create mode 100644 bsp/meta-raspberrypi/recipes-kernel/linux/files/raspberrypi4-64/rpi4-64-kernel-misc.cfg create mode 100644 bsp/meta-raspberrypi/recipes-kernel/linux/files/vc4graphics.cfg create mode 100644 bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-dev.bb create mode 100644 bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi.inc create mode 100644 bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.10.bb create mode 100644 bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.4.bb create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0001-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-no-timeout-on-get-state.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0004-Properly-handle-drain-requests-while-flushing.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.18.%.bbappend create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Fix-build-with-vc4-driver.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Remove-Makefile.include-which-includes-hardcoded.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Specify-cc-cxx-and-ld-variables-from-environment.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0002-Libraries-and-headers-from-ffmpeg-are-installed-in-u.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0003-Remove-strip-step-in-Makefile.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0004-Add-FFMPEG_EXTRA_CFLAGS-and-FFMPEG_EXTRA_LDFLAGS.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0005-Don-t-require-internet-connection-during-build.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0006-Prevent-ffmpeg-configure-compile-race-condition.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0007-Remove-Makefile-hardcoded-arch-tune.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/cross-crompile-ffmpeg.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/fix-tar-command-with-DIST.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/use-native-pkg-config.patch create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer_git.bb create mode 100644 bsp/meta-raspberrypi/recipes-multimedia/x264/x264_%.bbappend create mode 100644 bsp/meta-raspberrypi/wic/sdimage-raspberrypi.wks diff --git a/bsp/meta-raspberrypi/COPYING.MIT b/bsp/meta-raspberrypi/COPYING.MIT new file mode 100644 index 00000000000..fb950dc69fe --- /dev/null +++ b/bsp/meta-raspberrypi/COPYING.MIT @@ -0,0 +1,17 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/bsp/meta-raspberrypi/README.md b/bsp/meta-raspberrypi/README.md new file mode 100644 index 00000000000..7e95cc4415d --- /dev/null +++ b/bsp/meta-raspberrypi/README.md @@ -0,0 +1,84 @@ +# meta-raspberrypi + +Yocto BSP layer for the Raspberry Pi boards - . + +[![Build Status](https://yocto-ci.resin.io/job/meta-raspberrypi1/badge/icon)](https://yocto-ci.resin.io/job/meta-raspberrypi1) +[![Build Status](https://yocto-ci.resin.io/job/meta-raspberrypi2/badge/icon)](https://yocto-ci.resin.io/job/meta-raspberrypi2) +[![Build Status](https://yocto-ci.resin.io/job/meta-raspberrypi3/badge/icon)](https://yocto-ci.resin.io/job/meta-raspberrypi3) +[![Build Status](https://yocto-ci.resin.io/job/meta-raspberrypi4/badge/icon)](https://yocto-ci.resin.io/job/meta-raspberrypi4) +[![Documentation Status](https://readthedocs.org/projects/meta-raspberrypi/badge/?version=latest)](https://meta-raspberrypi.readthedocs.io/en/latest/?badge=latest) +[![Matrix](https://img.shields.io/matrix/meta-raspberrypi:cub.icu.svg?server_fqdn=matrix.cub.icu)](https://matrix.to/#/#meta-raspberrypi:cub.icu) + +| | | +|:-: | :-: | +| Build server sponsored by | [![balena.io](./img/balena.png)](https://www.balena.io/). | + +## Quick links + +* Git repository web frontend: + +* Mailing list (yocto mailing list): +* Issues management (Github Issues): + +* Documentation: + +## Description + +This is the general hardware specific BSP overlay for the RaspberryPi device. + +More information can be found at: (Official Site) + +The core BSP part of meta-raspberrypi should work with different +OpenEmbedded/Yocto distributions and layer stacks, such as: + +* Distro-less (only with OE-Core). +* Yoe Disto (Video and Camera Products). +* Yocto/Poky (main focus of testing). + +## Dependencies + +This layer depends on: + +* URI: git://git.yoctoproject.org/poky + * branch: master + * revision: HEAD + +* URI: git://git.openembedded.org/meta-openembedded + * layers: meta-oe, meta-multimedia, meta-networking, meta-python + * branch: master + * revision: HEAD + +## Quick Start + +1. source poky/oe-init-build-env rpi-build +2. Add this layer to bblayers.conf and the dependencies above +3. Set MACHINE in local.conf to one of the supported boards +4. bitbake core-image-base +5. Use bmaptool to copy the generated .wic.bz2 file to the SD card +6. Boot your RPI + +## Quick Start with kas + +1. Install kas build tool from PyPi (sudo pip3 install kas) +2. kas build meta-raspberrypi/kas-poky-rpi.yml +3. Use bmaptool to copy the generated .wic.bz2 file to the SD card +4. Boot your RPI + +To adjust the build configuration with specific options (I2C, SPI, ...), simply add +a section as follows: + +``` +local_conf_header: + rpi-specific: | + ENABLE_I2C = "1" + RPI_EXTRA_CONFIG = "dtoverlay=pi3-disable-bt" +``` + +To configure the machine, you have to update the `machine` variable. +And the same for the `distro`. + +For further information, you can read more at + +## Maintainers + +* Andrei Gherzan `` diff --git a/bsp/meta-raspberrypi/classes/sdcard_image-rpi.bbclass b/bsp/meta-raspberrypi/classes/sdcard_image-rpi.bbclass new file mode 100644 index 00000000000..e803a0da955 --- /dev/null +++ b/bsp/meta-raspberrypi/classes/sdcard_image-rpi.bbclass @@ -0,0 +1,209 @@ +inherit image_types + +# +# Create an image that can be written onto a SD card using dd. +# +# The disk layout used is: +# +# 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved for other data +# IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - bootloader and kernel +# BOOT_SPACE -> SDIMG_SIZE - rootfs +# + +# Default Free space = 1.3x +# Use IMAGE_OVERHEAD_FACTOR to add more space +# <---------> +# 4MiB 48MiB SDIMG_ROOTFS +# <-----------------------> <----------> <----------------------> +# ------------------------ ------------ ------------------------ +# | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_SIZE | +# ------------------------ ------------ ------------------------ +# ^ ^ ^ ^ +# | | | | +# 0 4MiB 4MiB + 48MiB 4MiB + 48Mib + SDIMG_ROOTFS + +# This image depends on the rootfs image +IMAGE_TYPEDEP_rpi-sdimg = "${SDIMG_ROOTFS_TYPE}" + +# Kernel image name +SDIMG_KERNELIMAGE_raspberrypi ?= "kernel.img" +SDIMG_KERNELIMAGE_raspberrypi2 ?= "kernel7.img" +SDIMG_KERNELIMAGE_raspberrypi3-64 ?= "kernel8.img" + +# Boot partition volume id +# Shorten raspberrypi to just rpi to keep it under 11 characters +# now enforced by mkfs.vfat from dosfstools-4.2 +BOOTDD_VOLUME_ID ?= "${@d.getVar('MACHINE').replace('raspberrypi', 'rpi')}" + +# Boot partition size [in KiB] (will be rounded up to IMAGE_ROOTFS_ALIGNMENT) +BOOT_SPACE ?= "49152" + +# Set alignment to 4MB [in KiB] +IMAGE_ROOTFS_ALIGNMENT = "4096" + +# Use an uncompressed ext3 by default as rootfs +SDIMG_ROOTFS_TYPE ?= "ext3" +SDIMG_ROOTFS = "${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${SDIMG_ROOTFS_TYPE}" + +# For the names of kernel artifacts +inherit kernel-artifact-names + +RPI_SDIMG_EXTRA_DEPENDS ?= "" + +do_image_rpi_sdimg[depends] = " \ + parted-native:do_populate_sysroot \ + mtools-native:do_populate_sysroot \ + dosfstools-native:do_populate_sysroot \ + virtual/kernel:do_deploy \ + rpi-bootfiles:do_deploy \ + ${@bb.utils.contains('MACHINE_FEATURES', 'armstub', 'armstubs:do_deploy', '' ,d)} \ + ${@bb.utils.contains('RPI_USE_U_BOOT', '1', 'u-boot:do_deploy', '',d)} \ + ${@bb.utils.contains('RPI_USE_U_BOOT', '1', 'u-boot-default-script:do_deploy', '',d)} \ + ${RPI_SDIMG_EXTRA_DEPENDS} \ +" + +do_image_rpi_sdimg[recrdeps] = "do_build" + +# SD card image name +SDIMG = "${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.rpi-sdimg" + +# Additional files and/or directories to be copied into the vfat partition from the IMAGE_ROOTFS. +FATPAYLOAD ?= "" + +# SD card vfat partition image name +SDIMG_VFAT_DEPLOY ?= "${RPI_USE_U_BOOT}" +SDIMG_VFAT = "${IMAGE_NAME}.vfat" +SDIMG_LINK_VFAT = "${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.vfat" + +def split_overlays(d, out, ver=None): + dts = d.getVar("KERNEL_DEVICETREE") + # Device Tree Overlays are assumed to be suffixed by '-overlay.dtb' (4.1.x) or by '.dtbo' (4.4.9+) string and will be put in a dedicated folder + if out: + overlays = oe.utils.str_filter_out('\S+\-overlay\.dtb$', dts, d) + overlays = oe.utils.str_filter_out('\S+\.dtbo$', overlays, d) + else: + overlays = oe.utils.str_filter('\S+\-overlay\.dtb$', dts, d) + \ + " " + oe.utils.str_filter('\S+\.dtbo$', dts, d) + + return overlays + +IMAGE_CMD_rpi-sdimg () { + + # Align partitions + BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE} + ${IMAGE_ROOTFS_ALIGNMENT} - 1) + BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE_ALIGNED} - ${BOOT_SPACE_ALIGNED} % ${IMAGE_ROOTFS_ALIGNMENT}) + SDIMG_SIZE=$(expr ${IMAGE_ROOTFS_ALIGNMENT} + ${BOOT_SPACE_ALIGNED} + $ROOTFS_SIZE) + + echo "Creating filesystem with Boot partition ${BOOT_SPACE_ALIGNED} KiB and RootFS $ROOTFS_SIZE KiB" + + # Check if we are building with device tree support + DTS="${KERNEL_DEVICETREE}" + + # Initialize sdcard image file + dd if=/dev/zero of=${SDIMG} bs=1024 count=0 seek=${SDIMG_SIZE} + + # Create partition table + parted -s ${SDIMG} mklabel msdos + # Create boot partition and mark it as bootable + parted -s ${SDIMG} unit KiB mkpart primary fat32 ${IMAGE_ROOTFS_ALIGNMENT} $(expr ${BOOT_SPACE_ALIGNED} \+ ${IMAGE_ROOTFS_ALIGNMENT}) + parted -s ${SDIMG} set 1 boot on + # Create rootfs partition to the end of disk + parted -s ${SDIMG} -- unit KiB mkpart primary ext2 $(expr ${BOOT_SPACE_ALIGNED} \+ ${IMAGE_ROOTFS_ALIGNMENT}) -1s + parted ${SDIMG} print + + # Create a vfat image with boot files + BOOT_BLOCKS=$(LC_ALL=C parted -s ${SDIMG} unit b print | awk '/ 1 / { print substr($4, 1, length($4 -1)) / 512 /2 }') + rm -f ${WORKDIR}/boot.img + mkfs.vfat -F32 -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${WORKDIR}/boot.img $BOOT_BLOCKS + mcopy -v -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${BOOTFILES_DIR_NAME}/* ::/ || bbfatal "mcopy cannot copy ${DEPLOY_DIR_IMAGE}/${BOOTFILES_DIR_NAME}/* into boot.img" + if [ "${@bb.utils.contains("MACHINE_FEATURES", "armstub", "1", "0", d)}" = "1" ]; then + mcopy -v -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/armstubs/${ARMSTUB} ::/ || bbfatal "mcopy cannot copy ${DEPLOY_DIR_IMAGE}/armstubs/${ARMSTUB} into boot.img" + fi + if test -n "${DTS}"; then + # Copy board device trees to root folder + for dtbf in ${@split_overlays(d, True)}; do + dtb=`basename $dtbf` + mcopy -v -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/$dtb ::$dtb || bbfatal "mcopy cannot copy ${DEPLOY_DIR_IMAGE}/$dtb into boot.img" + done + + # Copy device tree overlays to dedicated folder + mmd -i ${WORKDIR}/boot.img overlays + for dtbf in ${@split_overlays(d, False)}; do + dtb=`basename $dtbf` + mcopy -v -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/$dtb ::overlays/$dtb || bbfatal "mcopy cannot copy ${DEPLOY_DIR_IMAGE}/$dtb into boot.img" + done + fi + if [ "${RPI_USE_U_BOOT}" = "1" ]; then + mcopy -v -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/u-boot.bin ::${SDIMG_KERNELIMAGE} || bbfatal "mcopy cannot copy ${DEPLOY_DIR_IMAGE}/u-boot.bin into boot.img" + mcopy -v -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/boot.scr ::boot.scr || bbfatal "mcopy cannot copy ${DEPLOY_DIR_IMAGE}/boot.scr into boot.img" + if [ ! -z "${INITRAMFS_IMAGE}" -a "${INITRAMFS_IMAGE_BUNDLE}" = "1" ]; then + mcopy -v -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${INITRAMFS_LINK_NAME}.bin ::${KERNEL_IMAGETYPE} || bbfatal "mcopy cannot copy ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${INITRAMFS_LINK_NAME}.bin into boot.img" + else + mcopy -v -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} ::${KERNEL_IMAGETYPE} || bbfatal "mcopy cannot copy ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} into boot.img" + fi + else + if [ ! -z "${INITRAMFS_IMAGE}" -a "${INITRAMFS_IMAGE_BUNDLE}" = "1" ]; then + mcopy -v -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${INITRAMFS_LINK_NAME}.bin ::${SDIMG_KERNELIMAGE} || bbfatal "mcopy cannot copy ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${INITRAMFS_LINK_NAME}.bin into boot.img" + else + mcopy -v -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} ::${SDIMG_KERNELIMAGE} || bbfatal "mcopy cannot copy ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} into boot.img" + fi + fi + + # Add files (eg. hypervisor binaries) from the deploy dir + if [ -n "${DEPLOYPAYLOAD}" ] ; then + echo "Copying deploy file payload into VFAT" + for entry in ${DEPLOYPAYLOAD} ; do + # Split entry at optional ':' to enable file renaming for the destination + if [ $(echo "$entry" | grep -c :) = "0" ] ; then + DEPLOY_FILE="$entry" + DEST_FILENAME="$entry" + else + DEPLOY_FILE="$(echo "$entry" | cut -f1 -d:)" + DEST_FILENAME="$(echo "$entry" | cut -f2- -d:)" + fi + mcopy -v -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${DEPLOY_FILE} ::${DEST_FILENAME} || bbfatal "mcopy cannot copy ${DEPLOY_DIR_IMAGE}/${DEPLOY_FILE} into boot.img" + done + fi + + if [ -n "${FATPAYLOAD}" ] ; then + echo "Copying payload into VFAT" + for entry in ${FATPAYLOAD} ; do + # use bbwarn instead of bbfatal to stop aborting on vfat issues like not supporting .~lock files + mcopy -v -i ${WORKDIR}/boot.img -s ${IMAGE_ROOTFS}$entry :: || bbwarn "mcopy cannot copy ${IMAGE_ROOTFS}$entry into boot.img" + done + fi + + # Add stamp file + echo "${IMAGE_NAME}" > ${WORKDIR}/image-version-info + mcopy -v -i ${WORKDIR}/boot.img ${WORKDIR}/image-version-info :: || bbfatal "mcopy cannot copy ${WORKDIR}/image-version-info into boot.img" + + # Deploy vfat partition + if [ "${SDIMG_VFAT_DEPLOY}" = "1" ]; then + cp ${WORKDIR}/boot.img ${IMGDEPLOYDIR}/${SDIMG_VFAT} + ln -sf ${SDIMG_VFAT} ${SDIMG_LINK_VFAT} + fi + + # Burn Partitions + dd if=${WORKDIR}/boot.img of=${SDIMG} conv=notrunc seek=1 bs=$(expr ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) + # If SDIMG_ROOTFS_TYPE is a .xz file use xzcat + if echo "${SDIMG_ROOTFS_TYPE}" | egrep -q "*\.xz" + then + xzcat ${SDIMG_ROOTFS} | dd of=${SDIMG} conv=notrunc seek=1 bs=$(expr 1024 \* ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) + else + dd if=${SDIMG_ROOTFS} of=${SDIMG} conv=notrunc seek=1 bs=$(expr 1024 \* ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) + fi +} + +ROOTFS_POSTPROCESS_COMMAND += " rpi_generate_sysctl_config ; " + +rpi_generate_sysctl_config() { + # systemd sysctl config + test -d ${IMAGE_ROOTFS}${sysconfdir}/sysctl.d && \ + echo "vm.min_free_kbytes = 8192" > ${IMAGE_ROOTFS}${sysconfdir}/sysctl.d/rpi-vm.conf + + # sysv sysctl config + IMAGE_SYSCTL_CONF="${IMAGE_ROOTFS}${sysconfdir}/sysctl.conf" + test -e ${IMAGE_ROOTFS}${sysconfdir}/sysctl.conf && \ + sed -e "/vm.min_free_kbytes/d" -i ${IMAGE_SYSCTL_CONF} + echo "" >> ${IMAGE_SYSCTL_CONF} && echo "vm.min_free_kbytes = 8192" >> ${IMAGE_SYSCTL_CONF} +} diff --git a/bsp/meta-raspberrypi/conf/layer.conf b/bsp/meta-raspberrypi/conf/layer.conf new file mode 100644 index 00000000000..2518379ae70 --- /dev/null +++ b/bsp/meta-raspberrypi/conf/layer.conf @@ -0,0 +1,40 @@ +# We have a conf and classes directory, append to BBPATH +BBPATH .= ":${LAYERDIR}" + +# We have a recipes directory containing .bb and .bbappend files, add to BBFILES +BBFILES += "${LAYERDIR}/recipes*/*/*.bb \ + ${LAYERDIR}/recipes*/*/*.bbappend" + +BBFILE_COLLECTIONS += "raspberrypi" +BBFILE_PATTERN_raspberrypi := "^${LAYERDIR}/" +BBFILE_PRIORITY_raspberrypi = "9" + +LAYERSERIES_COMPAT_raspberrypi = "hardknott honister" +LAYERDEPENDS_raspberrypi = "core" + +# Additional license directories. +LICENSE_PATH += "${LAYERDIR}/files/custom-licenses" + +# The dynamic-layers directory hosts the extensions and layer specific +# modifications. +# +# The .bbappend and .bb files are included if the respective layer +# collection is available. +BBFILES += "${@' '.join('${LAYERDIR}/dynamic-layers/%s/recipes*/*/*.bbappend' % layer \ + for layer in BBFILE_COLLECTIONS.split())}" +BBFILES += "${@' '.join('${LAYERDIR}/dynamic-layers/%s/recipes*/*/*.bb' % layer \ + for layer in BBFILE_COLLECTIONS.split())}" + +BBFILES_DYNAMIC += " \ + openembedded-layer:${LAYERDIR}/dynamic-layers/openembedded-layer/*/*/*.bb \ + openembedded-layer:${LAYERDIR}/dynamic-layers/openembedded-layer/*/*/*.bbappend \ + networking-layer:${LAYERDIR}/dynamic-layers/networking-layer/*/*/*.bb \ + networking-layer:${LAYERDIR}/dynamic-layers/networking-layer/*/*/*.bbappend \ + qt5-layer:${LAYERDIR}/dynamic-layers/qt5-layer/*/*/*.bb \ + qt5-layer:${LAYERDIR}/dynamic-layers/qt5-layer/*/*/*.bbappend \ + multimedia-layer:${LAYERDIR}/dynamic-layers/multimedia-layer/*/*/*.bb \ + multimedia-layer:${LAYERDIR}/dynamic-layers/multimedia-layer/*/*/*.bbappend \ +" + +DEFAULT_TEST_SUITES_remove_rpi = "parselogs" +DEFAULT_TEST_SUITES_append_rpi = " parselogs_rpi" diff --git a/bsp/meta-raspberrypi/conf/machine/include/rpi-base.inc b/bsp/meta-raspberrypi/conf/machine/include/rpi-base.inc new file mode 100644 index 00000000000..a800078473b --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/include/rpi-base.inc @@ -0,0 +1,146 @@ +include conf/machine/include/rpi-default-settings.inc +include conf/machine/include/rpi-default-versions.inc +include conf/machine/include/rpi-default-providers.inc + +SOC_FAMILY = "rpi" +include conf/machine/include/soc-family.inc + +IMAGE_FSTYPES ?= "tar.bz2 ext3 wic.bz2 wic.bmap" +WKS_FILE ?= "sdimage-raspberrypi.wks" + +XSERVER = " \ + xserver-xorg \ + ${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "xserver-xorg-extension-glx", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "xf86-video-modesetting", "xf86-video-fbdev", d)} \ + " + +RPI_KERNEL_DEVICETREE_OVERLAYS ?= " \ + overlays/overlay_map.dtb \ + overlays/at86rf233.dtbo \ + overlays/disable-bt.dtbo \ + overlays/dwc2.dtbo \ + overlays/gpio-ir.dtbo \ + overlays/gpio-ir-tx.dtbo \ + overlays/gpio-key.dtbo \ + overlays/hifiberry-amp.dtbo \ + overlays/hifiberry-dac.dtbo \ + overlays/hifiberry-dacplus.dtbo \ + overlays/hifiberry-digi.dtbo \ + overlays/justboom-both.dtbo \ + overlays/justboom-dac.dtbo \ + overlays/justboom-digi.dtbo \ + overlays/i2c-rtc.dtbo \ + overlays/imx219.dtbo \ + overlays/imx477.dtbo \ + overlays/iqaudio-dac.dtbo \ + overlays/iqaudio-dacplus.dtbo \ + overlays/mcp2515-can0.dtbo \ + overlays/mcp2515-can1.dtbo \ + overlays/miniuart-bt.dtbo \ + overlays/pitft22.dtbo \ + overlays/pitft28-capacitive.dtbo \ + overlays/pitft28-resistive.dtbo \ + overlays/pitft35-resistive.dtbo \ + overlays/pps-gpio.dtbo \ + overlays/rpi-ft5406.dtbo \ + overlays/rpi-poe.dtbo \ + overlays/vc4-fkms-v3d.dtbo \ + overlays/vc4-kms-v3d.dtbo \ + overlays/vc4-kms-v3d-pi4.dtbo \ + overlays/vc4-kms-dsi-7inch.dtbo \ + overlays/w1-gpio.dtbo \ + overlays/w1-gpio-pullup.dtbo \ + " + +RPI_KERNEL_DEVICETREE ?= " \ + bcm2708-rpi-zero.dtb \ + bcm2708-rpi-zero-w.dtb \ + bcm2708-rpi-b.dtb \ + bcm2708-rpi-b-rev1.dtb \ + bcm2708-rpi-b-plus.dtb \ + bcm2709-rpi-2-b.dtb \ + bcm2710-rpi-2-b.dtb \ + bcm2710-rpi-3-b.dtb \ + bcm2710-rpi-3-b-plus.dtb \ + bcm2711-rpi-4-b.dtb \ + bcm2711-rpi-400.dtb \ + bcm2708-rpi-cm.dtb \ + bcm2710-rpi-cm3.dtb \ + bcm2711-rpi-cm4.dtb \ + " + +KERNEL_DEVICETREE ??= " \ + ${RPI_KERNEL_DEVICETREE} \ + ${RPI_KERNEL_DEVICETREE_OVERLAYS} \ + " + +# By default: +# +# * When u-boot is disabled use the "Image" format which can be directly loaded +# by the rpi firmware. +# +# * When u-boot is enabled use the "uImage" format and the "bootm" command +# within u-boot to load the kernel. +KERNEL_BOOTCMD ??= "bootm" +KERNEL_IMAGETYPE_UBOOT ??= "uImage" +KERNEL_IMAGETYPE_DIRECT ??= "zImage" +KERNEL_IMAGETYPE ?= "${@bb.utils.contains('RPI_USE_U_BOOT', '1', \ + '${KERNEL_IMAGETYPE_UBOOT}', '${KERNEL_IMAGETYPE_DIRECT}', d)}" + +MACHINE_FEATURES += "apm usbhost keyboard vfat ext2 screen touchscreen alsa bluetooth wifi sdio ${@bb.utils.contains('DISABLE_VC4GRAPHICS', '1', '', 'vc4graphics', d)}" + +# Raspberry Pi has no hardware clock +MACHINE_FEATURES_BACKFILL_CONSIDERED = "rtc" + +MACHINE_EXTRA_RRECOMMENDS += "kernel-modules udev-rules-rpi" +MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "${@oe.utils.conditional('ENABLE_I2C', '1', 'kernel-module-i2c-dev kernel-module-i2c-bcm2708', '', d)}" +MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "${@oe.utils.conditional('ENABLE_IR', '1', 'kernel-module-gpio-ir kernel-module-gpio-ir-tx', '', d)}" + +SERIAL_CONSOLES_CHECK ??= "${SERIAL_CONSOLES}" + +# The name of the deploy directory for raspberry pi boot files. +# This variable is referred to by recipes fetching / generating the files. +BOOTFILES_DIR_NAME ?= "bootfiles" + +# Set Raspberrypi splash image +SPLASH ?= "psplash-raspberrypi" + +def make_dtb_boot_files(d): + # Generate IMAGE_BOOT_FILES entries for device tree files listed in + # KERNEL_DEVICETREE. + alldtbs = d.getVar('KERNEL_DEVICETREE') + imgtyp = d.getVar('KERNEL_IMAGETYPE') + + def transform(dtb): + base = os.path.basename(dtb) + if dtb.endswith('dtbo') or base == 'overlay_map.dtb': + # overlay dtb: + # eg: overlays/hifiberry-amp.dtbo has: + # DEPLOYDIR file: hifiberry-amp.dtbo + # destination: overlays/hifiberry-amp.dtbo + return '{};{}'.format(base, dtb) + elif dtb.endswith('dtb'): + # eg: whatever/bcm2708-rpi-b.dtb has: + # DEPLOYDIR file: bcm2708-rpi-b.dtb + # destination: bcm2708-rpi-b.dtb + return base + + return ' '.join([transform(dtb) for dtb in alldtbs.split(' ') if dtb]) + + +IMAGE_BOOT_FILES ?= "${BOOTFILES_DIR_NAME}/* \ + ${@make_dtb_boot_files(d)} \ + ${@bb.utils.contains('RPI_USE_U_BOOT', '1', \ + '${KERNEL_IMAGETYPE} u-boot.bin;${SDIMG_KERNELIMAGE} boot.scr', \ + '${KERNEL_IMAGETYPE};${SDIMG_KERNELIMAGE}', d)} \ + " +do_image_wic[depends] += " \ + rpi-bootfiles:do_deploy \ + ${@bb.utils.contains('RPI_USE_U_BOOT', '1', 'u-boot:do_deploy', '',d)} \ + " + +do_image_wic[recrdeps] = "do_build" + +# The kernel image is installed into the FAT32 boot partition and does not need +# to also be installed into the rootfs. +RDEPENDS_${KERNEL_PACKAGE_NAME}-base = "" diff --git a/bsp/meta-raspberrypi/conf/machine/include/rpi-default-providers.inc b/bsp/meta-raspberrypi/conf/machine/include/rpi-default-providers.inc new file mode 100644 index 00000000000..c02d24879e6 --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/include/rpi-default-providers.inc @@ -0,0 +1,15 @@ +# RaspberryPi BSP default providers + +PREFERRED_PROVIDER_virtual/kernel ??= "linux-raspberrypi" +PREFERRED_PROVIDER_virtual/xserver ?= "xserver-xorg" +PREFERRED_PROVIDER_virtual/egl ?= "${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "mesa", "userland", d)}" +PREFERRED_PROVIDER_virtual/libgles2 ?= "${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "mesa", "userland", d)}" +PREFERRED_PROVIDER_virtual/libgl ?= "${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "mesa", "mesa-gl", d)}" +PREFERRED_PROVIDER_virtual/mesa ?= "${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "mesa", "mesa-gl", d)}" +PREFERRED_PROVIDER_virtual/libgbm ?= "${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "mesa", "mesa-gl", d)}" +PREFERRED_PROVIDER_jpeg ?= "jpeg" + +PREFERRED_PROVIDER_virtual/libomxil ?= "userland" +VIRTUAL-RUNTIME_libomxil = "userland" + +PREFERRED_PROVIDER_u-boot-default-script ??= "rpi-u-boot-scr" diff --git a/bsp/meta-raspberrypi/conf/machine/include/rpi-default-settings.inc b/bsp/meta-raspberrypi/conf/machine/include/rpi-default-settings.inc new file mode 100644 index 00000000000..bb18496c9d4 --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/include/rpi-default-settings.inc @@ -0,0 +1,9 @@ +# RaspberryPi BSP default settings + +IMAGE_CLASSES += "sdcard_image-rpi" + +# RPI kernel has errors of its own which should be filtered +# therefore use parselogs_rpi test instead of parselogs from oe-core +# +DEFAULT_TEST_SUITES_append_rpi = " parselogs_rpi" +DEFAULT_TEST_SUITES_remove_rpi = " parselogs" diff --git a/bsp/meta-raspberrypi/conf/machine/include/rpi-default-versions.inc b/bsp/meta-raspberrypi/conf/machine/include/rpi-default-versions.inc new file mode 100644 index 00000000000..17d5bd6d59f --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/include/rpi-default-versions.inc @@ -0,0 +1,3 @@ +# RaspberryPi BSP default versions + +PREFERRED_VERSION_linux-raspberrypi ??= "5.10.%" diff --git a/bsp/meta-raspberrypi/conf/machine/include/tune-arm1176jzf-s.inc b/bsp/meta-raspberrypi/conf/machine/include/tune-arm1176jzf-s.inc new file mode 100644 index 00000000000..b9e0377fda4 --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/include/tune-arm1176jzf-s.inc @@ -0,0 +1,17 @@ +DEFAULTTUNE ?= "arm1176jzfshf" + +require conf/machine/include/arm/arch-armv6.inc + +TUNEVALID[arm1176jzfs] = "Enable arm1176jzfs specific processor optimizations" +TUNE_CCARGS .= "${@bb.utils.contains('TUNE_FEATURES', 'arm1176jzfs', ' -mcpu=arm1176jzf-s', '', d)}" +MACHINEOVERRIDES =. "${@bb.utils.contains('TUNE_FEATURES', 'arm1176jzfs', 'armv6:', '', d)}" + +AVAILTUNES += "arm1176jzfs" +ARMPKGARCH_tune-arm1176jzfs = "arm1176jzfs" +TUNE_FEATURES_tune-arm1176jzfs = "arm thumb vfp arm1176jzfs" +PACKAGE_EXTRA_ARCHS_tune-arm1176jzfs = "${PACKAGE_EXTRA_ARCHS_tune-armv6} arm1176jzfs" + +AVAILTUNES += "arm1176jzfshf" +ARMPKGARCH_tune-arm1176jzfshf = "${ARMPKGARCH_tune-arm1176jzfs}" +TUNE_FEATURES_tune-arm1176jzfshf = "${TUNE_FEATURES_tune-arm1176jzfs} callconvention-hard" +PACKAGE_EXTRA_ARCHS_tune-arm1176jzfshf = "${PACKAGE_EXTRA_ARCHS_tune-armv6thf} arm1176jzfshf-vfp" diff --git a/bsp/meta-raspberrypi/conf/machine/raspberrypi-cm.conf b/bsp/meta-raspberrypi/conf/machine/raspberrypi-cm.conf new file mode 100644 index 00000000000..f9371df6fb2 --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/raspberrypi-cm.conf @@ -0,0 +1,8 @@ +#@TYPE: Machine +#@NAME: RaspberryPi Compute Module (CM1) +#@DESCRIPTION: Machine configuration for the RaspberryPi Compute Module (CM1) + +MACHINEOVERRIDES = "raspberrypi:${MACHINE}" +include conf/machine/raspberrypi.conf + +ARMSTUB ?= "armstub.bin" diff --git a/bsp/meta-raspberrypi/conf/machine/raspberrypi-cm3.conf b/bsp/meta-raspberrypi/conf/machine/raspberrypi-cm3.conf new file mode 100644 index 00000000000..f1b81519f8d --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/raspberrypi-cm3.conf @@ -0,0 +1,13 @@ +#@TYPE: Machine +#@NAME: RaspberryPi Compute Module 3 (CM3) +#@DESCRIPTION: Machine configuration for the RaspberryPi Compute Module 3 (CM3) + +DEFAULTTUNE ?= "cortexa7thf-neon-vfpv4" +require conf/machine/include/tune-cortexa7.inc +include conf/machine/include/rpi-base.inc + +SDIMG_KERNELIMAGE ?= "kernel7.img" +UBOOT_MACHINE = "rpi_3_32b_config" +SERIAL_CONSOLES ?= "115200;ttyAMA0" + +ARMSTUB ?= "armstub.bin" diff --git a/bsp/meta-raspberrypi/conf/machine/raspberrypi.conf b/bsp/meta-raspberrypi/conf/machine/raspberrypi.conf new file mode 100644 index 00000000000..b23687b24a8 --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/raspberrypi.conf @@ -0,0 +1,14 @@ +#@TYPE: Machine +#@NAME: RaspberryPi Development Board +#@DESCRIPTION: Machine configuration for the RaspberryPi http://www.raspberrypi.org/ Board + +DEFAULTTUNE ?= "arm1176jzfshf" + +require conf/machine/include/tune-arm1176jzf-s.inc +include conf/machine/include/rpi-base.inc + +SERIAL_CONSOLES ?= "115200;ttyAMA0" + +UBOOT_MACHINE = "rpi_config" + +ARMSTUB ?= "armstub.bin" diff --git a/bsp/meta-raspberrypi/conf/machine/raspberrypi0-wifi.conf b/bsp/meta-raspberrypi/conf/machine/raspberrypi0-wifi.conf new file mode 100644 index 00000000000..8689bca93f2 --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/raspberrypi0-wifi.conf @@ -0,0 +1,18 @@ +#@TYPE: Machine +#@NAME: RaspberryPi Zero WiFi Development Board +#@DESCRIPTION: Machine configuration for the RaspberryPi Zero WiFi board (https://www.raspberrypi.org/blog/raspberry-pi-zero-w-joins-family/) + +DEFAULTTUNE ?= "arm1176jzfshf" +require conf/machine/include/tune-arm1176jzf-s.inc +include conf/machine/include/rpi-base.inc + +MACHINE_EXTRA_RRECOMMENDS += "\ + linux-firmware-rpidistro-bcm43430 \ + bluez-firmware-rpidistro-bcm43430a1-hcd \ +" + +SDIMG_KERNELIMAGE ?= "kernel.img" +UBOOT_MACHINE ?= "rpi_0_w_defconfig" +SERIAL_CONSOLES ?= "115200;ttyS0" + +ARMSTUB ?= "armstub.bin" diff --git a/bsp/meta-raspberrypi/conf/machine/raspberrypi0.conf b/bsp/meta-raspberrypi/conf/machine/raspberrypi0.conf new file mode 100644 index 00000000000..80297b563ce --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/raspberrypi0.conf @@ -0,0 +1,8 @@ +#@TYPE: Machine +#@NAME: RaspberryPi Zero Development Board +#@DESCRIPTION: Machine configuration for the RaspberryPi Zero board (https://www.raspberrypi.org/blog/raspberry-pi-zero) + +MACHINEOVERRIDES = "raspberrypi:${MACHINE}" +include conf/machine/raspberrypi.conf + +SERIAL_CONSOLES ?= "115200;ttyAMA0" diff --git a/bsp/meta-raspberrypi/conf/machine/raspberrypi2.conf b/bsp/meta-raspberrypi/conf/machine/raspberrypi2.conf new file mode 100644 index 00000000000..505c6f2ff1b --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/raspberrypi2.conf @@ -0,0 +1,14 @@ +#@TYPE: Machine +#@NAME: RaspberryPi 2 Development Board +#@DESCRIPTION: Machine configuration for the RaspberryPi 2 + +DEFAULTTUNE ?= "cortexa7thf-neon-vfpv4" + +require conf/machine/include/tune-cortexa7.inc +include conf/machine/include/rpi-base.inc + +SERIAL_CONSOLES ?= "115200;ttyAMA0" + +UBOOT_MACHINE = "rpi_2_config" + +ARMSTUB ?= "armstub7.bin" diff --git a/bsp/meta-raspberrypi/conf/machine/raspberrypi3-64.conf b/bsp/meta-raspberrypi/conf/machine/raspberrypi3-64.conf new file mode 100644 index 00000000000..5394132195e --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/raspberrypi3-64.conf @@ -0,0 +1,36 @@ +#@TYPE: Machine +#@NAME: RaspberryPi 3 Development Board +#@DESCRIPTION: Machine configuration for the RaspberryPi 3 in 64 bits mode + +MACHINEOVERRIDES = "raspberrypi3:${MACHINE}" + +MACHINE_EXTRA_RRECOMMENDS += "\ + linux-firmware-rpidistro-bcm43430 \ + linux-firmware-rpidistro-bcm43455 \ + bluez-firmware-rpidistro-bcm43430a1-hcd \ + bluez-firmware-rpidistro-bcm4345c0-hcd \ +" + +require conf/machine/include/tune-cortexa53.inc +include conf/machine/include/rpi-base.inc + +RPI_KERNEL_DEVICETREE = " \ + broadcom/bcm2710-rpi-3-b.dtb \ + broadcom/bcm2710-rpi-3-b-plus.dtb \ + broadcom/bcm2837-rpi-3-b.dtb \ + broadcom/bcm2710-rpi-cm3.dtb \ + " + +SERIAL_CONSOLES ?= "115200;ttyS0" + +UBOOT_MACHINE = "rpi_arm64_config" + +# When u-boot is enabled we need to use the "Image" format and the "booti" +# command to load the kernel +KERNEL_IMAGETYPE_UBOOT ?= "Image" +# "zImage" not supported on arm64 and ".gz" images not supported by bootloader yet +KERNEL_IMAGETYPE_DIRECT ?= "Image" +KERNEL_BOOTCMD ?= "booti" + +VC4DTBO ?= "vc4-fkms-v3d" +ARMSTUB ?= "armstub8.bin" diff --git a/bsp/meta-raspberrypi/conf/machine/raspberrypi3.conf b/bsp/meta-raspberrypi/conf/machine/raspberrypi3.conf new file mode 100644 index 00000000000..dafb66e5a09 --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/raspberrypi3.conf @@ -0,0 +1,21 @@ +#@TYPE: Machine +#@NAME: RaspberryPi 3 Development Board (32bit) +#@DESCRIPTION: Machine configuration for the RaspberryPi 3 in 32 bits mode + +DEFAULTTUNE ?= "cortexa7thf-neon-vfpv4" +require conf/machine/include/tune-cortexa7.inc +include conf/machine/include/rpi-base.inc + +MACHINE_EXTRA_RRECOMMENDS += "\ + linux-firmware-rpidistro-bcm43430 \ + linux-firmware-rpidistro-bcm43455 \ + bluez-firmware-rpidistro-bcm43430a1-hcd \ + bluez-firmware-rpidistro-bcm4345c0-hcd \ +" + +SDIMG_KERNELIMAGE ?= "kernel7.img" +UBOOT_MACHINE = "rpi_3_32b_config" +SERIAL_CONSOLES ?= "115200;ttyS0" + +VC4DTBO ?= "vc4-fkms-v3d" +ARMSTUB ?= "armstub7.bin" diff --git a/bsp/meta-raspberrypi/conf/machine/raspberrypi4-64.conf b/bsp/meta-raspberrypi/conf/machine/raspberrypi4-64.conf new file mode 100644 index 00000000000..12c8954d946 --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/raspberrypi4-64.conf @@ -0,0 +1,36 @@ +#@TYPE: Machine +#@NAME: RaspberryPi 4 Development Board (64bit) +#@DESCRIPTION: Machine configuration for the RaspberryPi 4 in 64 bits mode + +MACHINEOVERRIDES = "raspberrypi4:${MACHINE}" + +MACHINE_FEATURES += "pci" +MACHINE_EXTRA_RRECOMMENDS += "\ + linux-firmware-rpidistro-bcm43455 \ + bluez-firmware-rpidistro-bcm4345c0-hcd \ +" + +require conf/machine/include/tune-cortexa72.inc +include conf/machine/include/rpi-base.inc + +RPI_KERNEL_DEVICETREE = " \ + broadcom/bcm2711-rpi-4-b.dtb \ + broadcom/bcm2711-rpi-400.dtb \ + broadcom/bcm2711-rpi-cm4.dtb \ +" + +SDIMG_KERNELIMAGE ?= "kernel8.img" +SERIAL_CONSOLES ?= "115200;ttyS0" + +UBOOT_MACHINE = "rpi_arm64_config" + +VC4DTBO ?= "vc4-fkms-v3d" + +# When u-boot is enabled we need to use the "Image" format and the "booti" +# command to load the kernel +KERNEL_IMAGETYPE_UBOOT ?= "Image" +# "zImage" not supported on arm64 and ".gz" images not supported by bootloader yet +KERNEL_IMAGETYPE_DIRECT ?= "Image" +KERNEL_BOOTCMD ?= "booti" + +ARMSTUB ?= "armstub8-gic.bin" diff --git a/bsp/meta-raspberrypi/conf/machine/raspberrypi4.conf b/bsp/meta-raspberrypi/conf/machine/raspberrypi4.conf new file mode 100644 index 00000000000..d6b1d1bd0ec --- /dev/null +++ b/bsp/meta-raspberrypi/conf/machine/raspberrypi4.conf @@ -0,0 +1,21 @@ +#@TYPE: Machine +#@NAME: RaspberryPi 4 Development Board (32bit) +#@DESCRIPTION: Machine configuration for the RaspberryPi 4 in 32 bit mode + +DEFAULTTUNE ?= "cortexa7thf-neon-vfpv4" +require conf/machine/include/tune-cortexa7.inc +include conf/machine/include/rpi-base.inc + +MACHINE_FEATURES += "pci" +MACHINE_EXTRA_RRECOMMENDS += "\ + linux-firmware-rpidistro-bcm43455 \ + bluez-firmware-rpidistro-bcm4345c0-hcd \ +" + +# 'l' stands for LPAE +SDIMG_KERNELIMAGE ?= "kernel7l.img" +UBOOT_MACHINE = "rpi_4_32b_config" +SERIAL_CONSOLES ?= "115200;ttyS0" + +VC4DTBO ?= "vc4-fkms-v3d" +ARMSTUB ?= "armstub7.bin" diff --git a/bsp/meta-raspberrypi/docs/Makefile b/bsp/meta-raspberrypi/docs/Makefile new file mode 100644 index 00000000000..d0de87ff7b6 --- /dev/null +++ b/bsp/meta-raspberrypi/docs/Makefile @@ -0,0 +1,225 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " epub3 to make an epub3" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + @echo " dummy to check syntax errors of document sources" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/meta-raspberrypi.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/meta-raspberrypi.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/meta-raspberrypi" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/meta-raspberrypi" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: epub3 +epub3: + $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 + @echo + @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." + +.PHONY: dummy +dummy: + $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy + @echo + @echo "Build finished. Dummy builder generates no files." diff --git a/bsp/meta-raspberrypi/docs/conf.py b/bsp/meta-raspberrypi/docs/conf.py new file mode 100644 index 00000000000..fcebbf19532 --- /dev/null +++ b/bsp/meta-raspberrypi/docs/conf.py @@ -0,0 +1,343 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# meta-raspberrypi documentation build configuration file, created by +# sphinx-quickstart on Tue May 23 09:51:24 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = ['.rst', '.md'] + +# The encoding of source files. +# +# source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'meta-raspberrypi' +copyright = '2017, meta-raspberrypi contributors' +author = 'meta-raspberrypi contributors' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = 'master' +# The full version, including alpha/beta/rc tags. +release = 'master' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# +# today = '' +# +# Else, today_fmt is used as the format for a strftime call. +# +# today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +# +# default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +# +# add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +# +# add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +# +# show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +# modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +# keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +# html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +# html_theme_path = [] + +# The name for this set of Sphinx documents. +# " v documentation" by default. +# +# html_title = 'meta-raspberrypi vmaster' + +# A shorter title for the navigation bar. Default is the same as html_title. +# +# html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# +# html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# +# html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +# +# html_extra_path = [] + +# If not None, a 'Last updated on:' timestamp is inserted at every page +# bottom, using the given strftime format. +# The empty string is equivalent to '%b %d, %Y'. +# +# html_last_updated_fmt = None + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +# +# html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# +# html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# +# html_additional_pages = {} + +# If false, no module index is generated. +# +# html_domain_indices = True + +# If false, no index is generated. +# +# html_use_index = True + +# If true, the index is split into individual pages for each letter. +# +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +# +# html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +# +# html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +# +# html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# +# html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr', 'zh' +# +# html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# 'ja' uses this config value. +# 'zh' user can custom change `jieba` dictionary path. +# +# html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +# +# html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'meta-raspberrypidoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'meta-raspberrypi.tex', 'meta-raspberrypi Documentation', + 'meta-raspberrypi contributors', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# +# latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# +# latex_use_parts = False + +# If true, show page references after internal links. +# +# latex_show_pagerefs = False + +# If true, show URL addresses after external links. +# +# latex_show_urls = False + +# Documents to append as an appendix to all manuals. +# +# latex_appendices = [] + +# It false, will not define \strong, \code, itleref, \crossref ... but only +# \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added +# packages. +# +# latex_keep_old_macro_names = True + +# If false, no module index is generated. +# +# latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'meta-raspberrypi', 'meta-raspberrypi Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +# +# man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'meta-raspberrypi', 'meta-raspberrypi Documentation', + author, 'meta-raspberrypi', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +# +# texinfo_appendices = [] + +# If false, no module index is generated. +# +# texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +# +# texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +# +# texinfo_no_detailmenu = False + +source_parsers = { + '.md': 'recommonmark.parser.CommonMarkParser', +} diff --git a/bsp/meta-raspberrypi/docs/contributing.md b/bsp/meta-raspberrypi/docs/contributing.md new file mode 100644 index 00000000000..7d18400d473 --- /dev/null +++ b/bsp/meta-raspberrypi/docs/contributing.md @@ -0,0 +1,109 @@ +# Contributing + +## Mailing list + +The main communication tool in use is the Yocto Project mailing list: + +* +* + +Feel free to ask any kind of questions but please always prepend your email +subject with `[meta-raspberrypi]` as this is the global *Yocto* mailing +list and not a dedicated *meta-raspberrypi* mailing list. + +## Formatting patches + +First and foremost, all of the contributions to the layer must be compliant +with the standard openembedded patch guidelines: + +* + +In summary, your commit log messages should be formatted as follows: + + : + + (Optional pointers to external resources, such as defect tracking) + + The intent of your change. + + (Optional: if it's not clear from above, how your change resolves + the issues in the first part) + + Signed-off-by: Your Name + +The `` is the layer component name that your changes affect. +It is important that you choose it correctly. A simple guide for selecting a +a good component name is the following: + +* For changes that affect *layer recipes*, please just use the **base names** + of the affected recipes, separated by commas (`,`), as the component name. + For example: use `omxplayer` instead of `omxplayer_git.bb`. If you are + adding new recipe(s), just use the new recipe(s) base name(s). An example + for changes to multiple recipes would be `userland,vc-graphics,wayland`. +* For changes that affect the *layer documentation*, please just use `docs` + as the component name. +* For changes that affect *other files*, i.e. under the `conf` directory, + please use the full path as the component name, e.g. `conf/layer.conf`. +* For changes that affect the *layer itself* and do not fall into any of + the above cases, please use `meta-raspberrypi` as the component name. + +A full example of a suitable commit log message is below: + + foobar: Adjusted the foo setting in bar + + When using foobar on systems with less than a gigabyte of RAM common + usage patterns often result in an Out-of-memory condition causing + slowdowns and unexpected application termination. + + Low-memory systems should continue to function without running into + memory-starvation conditions with minimal cost to systems with more + available memory. High-memory systems will be less able to use the + full extent of the system, a dynamically tunable option may be best, + long-term. + + The foo setting in bar was decreased from X to X-50% in order to + ensure we don't exhaust all system memory with foobar threads. + + Signed-off-by: Joe Developer + +A common issue during patch reviewing is commit log formatting, please review +the above formatting guidelines carefully before sending your patches. + +## Sending patches + +The preferred method to contribute to this project is to send pull +requests to the GitHub mirror of the layer: + +* + +**In addition**, you may send patches for review to the above specified +mailing list. In this case, when creating patches using `git` please make +sure to use the following formatting for the message subject: + + git format-patch -s --subject-prefix='meta-raspberrypi][PATCH' origin + +Then, for sending patches to the mailing list, you may use this command: + + git send-email --to yocto@yoctoproject.org + +## GitHub issues + +In order to manage and track the layer issues more efficiently, the +GitHub issues facility is used by this project: + +* + +If you submit patches that have a GitHub issue associated, please make sure to +use standard GitHub keywords, e.g. `closes`, `resolves` or `fixes`, before the +"Signed-off-by" tag to close the relevant issues automatically: + + foobar: Adjusted the foo setting in bar + + Fixes: #324 + + Signed-off-by: Joe Developer + +More information on the available GitHub close keywords can be found here: + +* + diff --git a/bsp/meta-raspberrypi/docs/extra-apps.md b/bsp/meta-raspberrypi/docs/extra-apps.md new file mode 100644 index 00000000000..53007dc1f02 --- /dev/null +++ b/bsp/meta-raspberrypi/docs/extra-apps.md @@ -0,0 +1,9 @@ +# Extra apps + +## omxplayer + +omxplayer depends on libav which has a commercial license. So in order to be +able to compile omxplayer you will need to whiteflag the commercial +license in your local.conf: + + LICENSE_FLAGS_WHITELIST = "commercial" diff --git a/bsp/meta-raspberrypi/docs/extra-build-config.md b/bsp/meta-raspberrypi/docs/extra-build-config.md new file mode 100644 index 00000000000..1caf904fd57 --- /dev/null +++ b/bsp/meta-raspberrypi/docs/extra-build-config.md @@ -0,0 +1,351 @@ +# Optional build configuration + +There are a set of ways in which a user can influence different parameters of +the build. We list here the ones that are closely related to this BSP or +specific to it. For the rest please check: + + +## Compressed deployed files + +1. Overwrite IMAGE_FSTYPES in local.conf + * `IMAGE_FSTYPES = "tar.bz2 ext3.xz"` + +2. Overwrite SDIMG_ROOTFS_TYPE in local.conf + * `SDIMG_ROOTFS_TYPE = "ext3.xz"` + +Accommodate the values above to your own needs (ex: ext3 / ext4). + +## GPU memory + +* `GPU_MEM`: GPU memory in megabyte. Sets the memory split between the ARM and + GPU. ARM gets the remaining memory. Min 16. Default 64. + +* `GPU_MEM_256`: GPU memory in megabyte for the 256MB Raspberry Pi. Ignored by + the 512MB RP. Overrides gpu_mem. Max 192. Default not set. + +* `GPU_MEM_512`: GPU memory in megabyte for the 512MB Raspberry Pi. Ignored by + the 256MB RP. Overrides gpu_mem. Max 448. Default not set. + +* `GPU_MEM_1024`: GPU memory in megabyte for the 1024MB Raspberry Pi. Ignored by + the 256MB/512MB RP. Overrides gpu_mem. Max 944. Default not set. + +See: + +## VC4 + +By default, each machine uses `vc4` for graphics. This will in turn sets mesa as provider for `gl` libraries. `DISABLE_VC4GRAPHICS` can be set to `1` to disable this behaviour falling back to using `userland`. Be aware that `userland` has not support for 64-bit arch. If you disable `vc4` on a 64-bit Raspberry Pi machine, expect build breakage. + +## Add purchased license codecs + +To add your own licenses use variables `KEY_DECODE_MPG2` and `KEY_DECODE_WVC1` in +local.conf. Example: + + KEY_DECODE_MPG2 = "12345678" + KEY_DECODE_WVC1 = "12345678" + +You can supply more licenses separated by comma. Example: + + KEY_DECODE_WVC1 = "0x12345678,0xabcdabcd,0x87654321" + +See: + +## Disable overscan + +By default the GPU adds a black border around the video output to compensate for +TVs which cut off part of the image. To disable this set this variable in +local.conf: + + DISABLE_OVERSCAN = "1" + +## Disable splash screen + +By default a rainbow splash screen is shown after the GPU firmware is loaded. +To disable this set this variable in local.conf: + + DISABLE_SPLASH = "1" + +## Boot delay + +The Raspberry Pi waits a number of seconds after loading the GPU firmware and +before loading the kernel. By default it is one second. This is useful if your +SD card needs a while to get ready before Linux is able to boot from it. +To remove (or adjust) this delay set these variables in local.conf: + + BOOT_DELAY = "0" + BOOT_DELAY_MS = "0" + +## Set overclocking options + +The Raspberry Pi can be overclocked. As of now overclocking up to the "Turbo +Mode" is officially supported by the Raspberry Pi and does not void warranty. Check +the config.txt for a detailed description of options and modes. The following +variables are supported in local.conf: `ARM_FREQ`, `GPU_FREQ`, `CORE_FREQ`, +`SDRAM_FREQ` and `OVER_VOLTAGE`. + +Example official settings for Turbo Mode in Raspberry Pi 2: + + ARM_FREQ = "1000" + CORE_FREQ = "500" + SDRAM_FREQ = "500" + OVER_VOLTAGE = "6" + +See: + +## HDMI and composite video options + +The Raspberry Pi can output video over HDMI or SDTV composite (the RCA connector). +By default the video mode for these is autodetected on boot: the HDMI mode is +selected according to the connected monitor's EDID information and the composite +mode is defaulted to NTSC using a 4:3 aspect ratio. Check the config.txt for a +detailed description of options and modes. The following variables are supported in +local.conf: `HDMI_FORCE_HOTPLUG`, `HDMI_DRIVE`, `HDMI_GROUP`, `HDMI_MODE`, +`CONFIG_HDMI_BOOST`, `SDTV_MODE`, `SDTV_ASPECT` and `DISPLAY_ROTATE`. + +Example to force HDMI output to 720p in CEA mode: + + HDMI_GROUP = "1" + HDMI_MODE = "4" + +See: + +## Video camera support with V4L2 drivers + +Set this variable to enable support for the video camera (Linux 3.12.4+ +required): + + VIDEO_CAMERA = "1" + +## Enable offline compositing support + +Set this variable to enable support for dispmanx offline compositing: + + DISPMANX_OFFLINE = "1" + +This will enable the firmware to fall back to off-line compositing of Dispmanx +elements. Normally the compositing is done on-line, during scanout, but cannot +handle too many elements. With off-line enabled, an off-screen buffer is +allocated for compositing. When scene complexity (number and sizes +of elements) is high, compositing will happen off-line into the buffer. + +Heavily recommended for Wayland/Weston. + +See: + +## Enable kgdb over console support + +To add the kdbg over console (kgdboc) parameter to the kernel command line, set +this variable in local.conf: + + ENABLE_KGDB = "1" + +## Disable rpi boot logo + +To disable rpi boot logo, set this variable in local.conf: + + DISABLE_RPI_BOOT_LOGO = "1" + +## Boot to U-Boot + +To have u-boot load kernel image, set in your local.conf: + + RPI_USE_U_BOOT = "1" + +This will select the appropriate image format for use with u-boot automatically. +For further customisation the KERNEL_IMAGETYPE and KERNEL_BOOTCMD variables can +be overridden to select the exact kernel image type (eg. zImage) and u-boot +command (eg. bootz) to be used. + +## Image with Initramfs + +To build an initramfs image: + +* Set this 3 kernel variables (in kernel's do_configure_prepend in linux-raspberrypi.inc after the line kernel_configure_variable LOCALVERSION "\"\"" +) + - kernel_configure_variable BLK_DEV_INITRD y + - kernel_configure_variable INITRAMFS_SOURCE "" + - kernel_configure_variable RD_GZIP y + +* Set the yocto variables (e.g. in local.conf) + - `INITRAMFS_IMAGE = ""` + - `INITRAMFS_IMAGE_BUNDLE = "1"` + - `BOOT_SPACE = "1073741"` + - `INITRAMFS_MAXSIZE = "315400"` + - `IMAGE_FSTYPES_pn-${INITRAMFS_IMAGE} = "${INITRAMFS_FSTYPES}"` + +## Including additional files in the SD card image boot partition + +The SD card image class supports adding extra files into the boot +partition, where the files are copied from either the image root +partition or from the build image deploy directory. + +To copy files that are present in the root partition into boot, +FATPAYLOAD is a simple space-separated list of files to be copied: + + FATPAYLOAD = "/boot/example1 /boot/example2" + +To copy files from the image deploy directory, the files should be +listed in the DEPLOYPAYLOAD as a space-separated list of entries. +Each entry lists a file to be copied, and an optional destination +filename can be specified by supplying it after a colon separator. + + DEPLOYPAYLOAD = "example1-${MACHINE}:example1 example2" + +Files that are to be included from the deploy directory will be produced +by tasks that image building task must depend upon, to ensure that the +files are available when they are needed, so these component deploy +tasks must be added to: RPI_SDIMG_EXTRA_DEPENDS. + + RPI_SDIMG_EXTRA_DEPENDS_append = " example:do_deploy" + +## Enable SPI bus + +When using device tree kernels, set this variable to enable the SPI bus: + + ENABLE_SPI_BUS = "1" + +## Enable I2C + +When using device tree kernels, set this variable to enable I2C: + + ENABLE_I2C = "1" + +Furthermore, to auto-load I2C kernel modules set: + + KERNEL_MODULE_AUTOLOAD_rpi += "i2c-dev i2c-bcm2708" + +## Enable PiTFT support + +Basic support for using PiTFT screens can be enabled by adding below in +local.conf: + +* `MACHINE_FEATURES += "pitft"` + - This will enable SPI bus and i2c device-trees, it will also setup + framebuffer for console and x server on PiTFT. + +NOTE: To get this working the overlay for the PiTFT model must be build, added +and specified as well (dtoverlay= in config.txt). + +Below is a list of currently supported PiTFT models in meta-raspberrypi, the +modelname should be added as a MACHINE_FEATURES in local.conf like below: + + MACHINE_FEATURES += "pitft " + +List of currently supported models: +* pitft22 +* pitft28r +* pitft28c +* pitft35r + +## Misc. display + +If you would like to use the Waveshare "C" 1024×600, 7 inch Capacitive Touch +Screen LCD, HDMI interface () Rev +2.1, please set the following in your local.conf: + + WAVESHARE_1024X600_C_2_1 = "1" + +## Enable UART + +RaspberryPi 0, 1, 2 and CM will have UART console enabled by default. + +RaspberryPi 0 WiFi and 3 does not have the UART enabled by default because this +needs a fixed core frequency and enable_uart will set it to the minimum. Certain +operations - 60fps h264 decode, high quality deinterlace - which aren't +performed on the ARM may be affected, and we wouldn't want to do that to users +who don't want to use the serial port. Users who want serial console support on +RaspberryPi 0 Wifi or 3 will have to explicitly set in local.conf: + + ENABLE_UART = "1" + +Ref.: +* +* + +## Enable USB Peripheral (Gadget) support + +The standard USB driver only supports host mode operations. Users who +want to use gadget modules like g_ether should set the following in +local.conf: + + ENABLE_DWC2_PERIPHERAL = "1" + +## Enable USB host support + +By default in case of the Compute Module 4 IO Board the standard USB driver +that usually supports host mode operations is disabled for power saving reasons. +Users who want to use the 2 USB built-in ports or the other ports provided via +the header extension should set the following in local.conf: + + ENABLE_DWC2_HOST = "1" + +## Enable Openlabs 802.15.4 radio module + +When using device tree kernels, set this variable to enable the 802.15.4 hat: + + ENABLE_AT86RF = "1" + +See: + +## Enable CAN + +In order to use CAN with an MCP2515-based module, set the following variables: + + ENABLE_SPI_BUS = "1" + ENABLE_CAN = "1" + +In case of dual CAN module (e.g. PiCAN2 Duo), set following variables instead: + + ENABLE_SPI_BUS = "1" + ENABLE_DUAL_CAN = "1" + +Some modules may require setting the frequency of the crystal oscillator used on the particular board. The frequency is usually marked on the package of the crystal. By default, it is set to 16 MHz. To change that to 8 MHz, the following variable also has to be set: + + CAN_OSCILLATOR="8000000" + +Tested modules: + +* PiCAN2 (16 MHz crystal): +* WaveShare RS485 CAN HAT (8 MHz or 12 MHz crystal): +* PiCAN2 Duo (16 MHz crystal): + +## Enable infrared + +Users who want to enable infrared support, for example for using LIRC (Linux +Infrared Remote Control), have to explicitly set in local.conf: + + ENABLE_IR = "1" + +This will add device tree overlays gpio-ir and gpio-ir-tx to config.txt. +Appropriate kernel modules will be also included in the image. By default the +GPIO pin for gpio-ir is set to 18 and the pin for gpio-ir-tx is 17. Both pins +can be easily changed by modifying variables `GPIO_IR` and `GPIO_IR_TX`. + +## Manual additions to config.txt + +The `RPI_EXTRA_CONFIG` variable can be used to manually add additional lines to +the `config.txt` file if there is not a specific option above for the +configuration you need. To add multiple lines you must include `\n` separators. +If double-quotes are needed in the lines you are adding you can use single +quotes around the whole string. + +For example, to add a comment containing a double-quote and a configuration +option: + + RPI_EXTRA_CONFIG = ' \n \ + # Raspberry Pi 7\" display/touch screen \n \ + lcd_rotate=2 \n \ + ' +## Enable Raspberrypi Camera V2 + +RaspberryPi does not have the unicam device ( RaspberryPi Camera ) enabled by default. +Because this unicam device ( bcm2835-unicam ) as of now is used by libcamera opensource. +So we have to explicitly set in local.conf. + + RASPBERRYPI_CAMERA_V2 = "1" + +This will add the device tree overlays imx219 ( RaspberryPi Camera sensor V2 driver ) to config.txt. +Also, this will enable adding Contiguous Memory Allocation value in the cmdline.txt. + +Ref.: +* +* diff --git a/bsp/meta-raspberrypi/docs/index.rst b/bsp/meta-raspberrypi/docs/index.rst new file mode 100644 index 00000000000..0d7ee0755d1 --- /dev/null +++ b/bsp/meta-raspberrypi/docs/index.rst @@ -0,0 +1,26 @@ +.. meta-raspberrypi documentation master file, created by + sphinx-quickstart on Tue May 23 09:51:24 2017. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to meta-raspberrypi's documentation! +============================================ + +Contents: + +.. toctree:: + :maxdepth: 2 + + readme + layer-contents + extra-build-config + extra-apps + contributing + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/bsp/meta-raspberrypi/docs/layer-contents.md b/bsp/meta-raspberrypi/docs/layer-contents.md new file mode 100644 index 00000000000..5483708d835 --- /dev/null +++ b/bsp/meta-raspberrypi/docs/layer-contents.md @@ -0,0 +1,36 @@ +# Layer Contents + +## Supported Machines + +* raspberrypi +* raspberrypi0 +* raspberrypi0-wifi +* raspberrypi2 +* raspberrypi3 +* raspberrypi3-64 (64 bit kernel & userspace) +* raspberrypi4 +* raspberrypi4-64 (64 bit kernel & userspace) +* raspberrypi-cm (dummy alias for raspberrypi) +* raspberrypi-cm3 + +Note: The raspberrypi3 machines include support for Raspberry Pi 3B+. + +## Images + +* rpi-test-image + * Image based on core-image-base which includes most of the packages in this + layer and some media samples. + +For other uses it's recommended to base images on `core-image-minimal` or +`core-image-base` as appropriate. The old image names (`rpi-hwup-image` and +`rpi-basic-image`) are deprecated. + +## WiFi and Bluetooth Firmware + +Be aware that the WiFi and Bluetooth firmware for the supported boards +is not available in the base version of `linux-firmware` from OE-Core +(poky). The files are added from Raspbian repositories in this layer's +bbappends to that recipe. All machines define +`MACHINE_EXTRA_RRECOMMENDS` to include the required wireless firmware; +raspberrypi3 supports 3, 3B, and 3B+ and so include multiple firmware +packages. diff --git a/bsp/meta-raspberrypi/docs/readme.md b/bsp/meta-raspberrypi/docs/readme.md new file mode 120000 index 00000000000..32d46ee883b --- /dev/null +++ b/bsp/meta-raspberrypi/docs/readme.md @@ -0,0 +1 @@ +../README.md \ No newline at end of file diff --git a/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-connectivity/lirc/lirc/lirc-gpio-ir-0.10.patch b/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-connectivity/lirc/lirc/lirc-gpio-ir-0.10.patch new file mode 100644 index 00000000000..c0fdd189be4 --- /dev/null +++ b/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-connectivity/lirc/lirc/lirc-gpio-ir-0.10.patch @@ -0,0 +1,175 @@ +diff -ruN lirc-0.10.1.orig/lib/config_file.c lirc-0.10.1/lib/config_file.c +--- lirc-0.10.1.orig/lib/config_file.c 2017-09-10 17:52:19.000000000 +0900 ++++ lirc-0.10.1/lib/config_file.c 2019-06-26 00:39:45.734320696 +0900 +@@ -71,7 +71,7 @@ + typedef void* (*array_guest_func)(void* item, void* arg); + + +-#define LINE_LEN 1024 ++#define LINE_LEN 4096 + #define MAX_INCLUDES 10 + + const char* whitespace = " \t"; +diff -ruN lirc-0.10.1.orig/lib/ir_remote.h lirc-0.10.1/lib/ir_remote.h +--- lirc-0.10.1.orig/lib/ir_remote.h 2017-09-10 17:52:19.000000000 +0900 ++++ lirc-0.10.1/lib/ir_remote.h 2019-06-26 00:39:45.714321224 +0900 +@@ -110,12 +110,17 @@ + + static inline int is_pulse(lirc_t data) + { +- return data & PULSE_BIT ? 1 : 0; ++ return ((data & LIRC_MODE2_MASK)==LIRC_MODE2_PULSE) ? 1 : 0; + } + + static inline int is_space(lirc_t data) + { +- return !is_pulse(data); ++ return ((data & LIRC_MODE2_MASK)==LIRC_MODE2_SPACE) ? 1 : 0; ++} ++ ++static inline int is_timeout(lirc_t data) ++{ ++ return ((data & LIRC_MODE2_MASK)==LIRC_MODE2_TIMEOUT) ? 1 : 0; + } + + static inline int has_repeat(const struct ir_remote* remote) +diff -ruN lirc-0.10.1.orig/lib/irrecord.c lirc-0.10.1/lib/irrecord.c +--- lirc-0.10.1.orig/lib/irrecord.c 2017-09-10 17:52:19.000000000 +0900 ++++ lirc-0.10.1/lib/irrecord.c 2019-06-26 00:39:45.724320960 +0900 +@@ -1398,9 +1398,16 @@ + state->retval = 0; + return STS_LEN_TIMEOUT; + } ++ if (is_timeout(state->data)) { ++ return STS_LEN_AGAIN; ++ } + state->count++; + if (state->mode == MODE_GET_GAP) { +- state->sum += state->data & PULSE_MASK; ++ if (state->sum != 0 || is_pulse(state->data)) { ++ state->sum += state->data & PULSE_MASK; ++ }else{ ++ return STS_LEN_AGAIN; ++ } + if (state->average == 0 && is_space(state->data)) { + if (state->data > 100000) { + state->sum = 0; +@@ -1472,6 +1479,10 @@ + state->keypresses = lastmaxcount; + return STS_LEN_AGAIN; + } else if (state->mode == MODE_HAVE_GAP) { ++ if (state->count==1 && is_space(state->data)) { ++ state->count = 0; ++ return STS_LEN_AGAIN; ++ } + if (state->count <= MAX_SIGNALS) { + signals[state->count - 1] = state->data & PULSE_MASK; + } else { +@@ -1510,7 +1521,7 @@ + /* such long pulses may appear with + * crappy hardware (receiver? / remote?) + */ +- else { ++ else if(is_pulse(state->data)) { + remote->gap = 0; + return STS_LEN_NO_GAP_FOUND; + } +@@ -1811,22 +1822,24 @@ + + static int raw_data_ok(struct button_state* btn_state) + { +- int r; ++ int r = 0; + int ref; + +- if (!is_space(btn_state->data)) { ++ if (is_pulse(btn_state->data)) { + r = 0; +- } else if (is_const(&remote)) { +- if (remote.gap > btn_state->sum) { +- ref = (remote.gap - btn_state->sum); +- ref *= (100 - remote.eps); +- ref /= 100; ++ } else if (is_space(btn_state->data)) { ++ if (is_const(&remote)) { ++ if (remote.gap > btn_state->sum) { ++ ref = (remote.gap - btn_state->sum); ++ ref *= (100 - remote.eps); ++ ref /= 100; ++ } else { ++ ref = 0; ++ } ++ r = btn_state->data > ref; + } else { +- ref = 0; ++ r = btn_state->data > (remote.gap * (100 - remote.eps)) / 100; + } +- r = btn_state->data > ref; +- } else { +- r = btn_state->data > (remote.gap * (100 - remote.eps)) / 100; + } + return r; + } +@@ -1970,7 +1983,7 @@ + btn_state->data = remote.gap; + } + if (btn_state->count == 0) { +- if (!is_space(btn_state->data) ++ if (is_pulse(btn_state->data) + || btn_state->data < + remote.gap - remote.gap * remote.eps / + 100) { +diff -ruN lirc-0.10.1.orig/lib/lirc/ir_remote.h lirc-0.10.1/lib/lirc/ir_remote.h +--- lirc-0.10.1.orig/lib/lirc/ir_remote.h 2017-09-10 17:52:58.000000000 +0900 ++++ lirc-0.10.1/lib/lirc/ir_remote.h 2019-06-26 00:39:45.724320960 +0900 +@@ -110,12 +110,17 @@ + + static inline int is_pulse(lirc_t data) + { +- return data & PULSE_BIT ? 1 : 0; ++ return ((data & LIRC_MODE2_MASK)==LIRC_MODE2_PULSE) ? 1 : 0; + } + + static inline int is_space(lirc_t data) + { +- return !is_pulse(data); ++ return ((data & LIRC_MODE2_MASK)==LIRC_MODE2_SPACE) ? 1 : 0; ++} ++ ++static inline int is_timeout(lirc_t data) ++{ ++ return ((data & LIRC_MODE2_MASK)==LIRC_MODE2_TIMEOUT) ? 1 : 0; + } + + static inline int has_repeat(const struct ir_remote* remote) +diff -ruN lirc-0.10.1.orig/tools/mode2.cpp lirc-0.10.1/tools/mode2.cpp +--- lirc-0.10.1.orig/tools/mode2.cpp 2017-09-10 17:52:19.000000000 +0900 ++++ lirc-0.10.1/tools/mode2.cpp 2019-06-26 00:45:38.840404976 +0900 +@@ -326,12 +326,24 @@ + void print_mode2_data(unsigned int data) + { + static int bitno = 1; ++ static bool leading_space = true; ++ unsigned int msg = data & LIRC_MODE2_MASK; + + switch (opt_dmode) { + case 0: +- printf("%s %u\n", ( +- data & PULSE_BIT) ? "pulse" : "space", +- (uint32_t)(data & PULSE_MASK)); ++ if (leading_space && msg == LIRC_MODE2_SPACE ) { ++ break; ++ } else { ++ leading_space = false; ++ } ++ if (msg == LIRC_MODE2_PULSE) { ++ printf("pulse %u\n", (__u32)(data & PULSE_MASK)); ++ } else if (msg == LIRC_MODE2_SPACE) { ++ printf("space %u\n", (__u32)(data & PULSE_MASK)); ++ } else if (msg == LIRC_MODE2_TIMEOUT) { ++ printf("timeout %u\n", (__u32)(data & PULSE_MASK)); ++ leading_space = true; ++ } + break; + case 1: { + /* print output like irrecord raw config file data */ diff --git a/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-connectivity/lirc/lirc/lircd.service b/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-connectivity/lirc/lirc/lircd.service new file mode 100644 index 00000000000..03ecbb065f9 --- /dev/null +++ b/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-connectivity/lirc/lirc/lircd.service @@ -0,0 +1,11 @@ +[Unit] +Description=LIRC Infrared Signal Decoder +Wants=lircd-setup.service +After=network.target lircd-setup.service + +[Service] +Type=simple +ExecStart=/usr/sbin/lircd --nodaemon + +[Install] +WantedBy=multi-user.target diff --git a/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-connectivity/lirc/lirc_0.10.1.bbappend b/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-connectivity/lirc/lirc_0.10.1.bbappend new file mode 100644 index 00000000000..5d3ab4dfd3b --- /dev/null +++ b/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-connectivity/lirc/lirc_0.10.1.bbappend @@ -0,0 +1,6 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +SRC_URI_append_rpi = " \ + file://lirc-gpio-ir-0.10.patch \ + file://lircd.service \ +" diff --git a/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-core/packagegroups/packagegroup-rpi-test.bbappend b/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-core/packagegroups/packagegroup-rpi-test.bbappend new file mode 100644 index 00000000000..63fedbb5422 --- /dev/null +++ b/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-core/packagegroups/packagegroup-rpi-test.bbappend @@ -0,0 +1,4 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +RDEPENDS_${PN} += "python3-sense-hat" + diff --git a/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-devtools/python/python3-sense-hat_2.2.0.bb b/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-devtools/python/python3-sense-hat_2.2.0.bb new file mode 100644 index 00000000000..6195d284bc6 --- /dev/null +++ b/bsp/meta-raspberrypi/dynamic-layers/meta-python/recipes-devtools/python/python3-sense-hat_2.2.0.bb @@ -0,0 +1,24 @@ +SUMMARY = "Python module to control the Raspberry Pi Sense HAT used in the Astro Pi mission" +HOMEPAGE = "https://github.com/RPi-Distro/python-sense-hat" +SECTION = "devel/python" +LICENSE = "BSD" +LIC_FILES_CHKSUM = "file://LICENCE.txt;md5=d80fe312e1ff5fbd97369b093bf21cda" + +inherit setuptools3 pypi + +PYPI_PACKAGE = "sense-hat" + +SRC_URI[md5sum] = "69929250cb72349a8a82edf2584b1d83" +SRC_URI[sha256sum] = "f000998d042d96ed722d459312e1bebd0107f9f3015cd34b3e4fabcab9c800af" + +DEPENDS += " \ + jpeg \ + zlib \ + freetype \ + " + +RDEPENDS_${PN} += " \ + ${PYTHON_PN}-numpy \ + ${PYTHON_PN}-rtimu \ + ${PYTHON_PN}-pillow \ + " diff --git a/bsp/meta-raspberrypi/dynamic-layers/multimedia-layer/recipes-multimedia/libcamera/libcamera.bbappend b/bsp/meta-raspberrypi/dynamic-layers/multimedia-layer/recipes-multimedia/libcamera/libcamera.bbappend new file mode 100644 index 00000000000..8076ac79e8f --- /dev/null +++ b/bsp/meta-raspberrypi/dynamic-layers/multimedia-layer/recipes-multimedia/libcamera/libcamera.bbappend @@ -0,0 +1,2 @@ +PACKAGECONFIG[raspberrypi] = "-Dpipelines=raspberrypi" +PACKAGECONFIG_append_rpi = " raspberrypi" diff --git a/bsp/meta-raspberrypi/dynamic-layers/networking-layer/recipes-support/drbd/drbd_%.bbappend b/bsp/meta-raspberrypi/dynamic-layers/networking-layer/recipes-support/drbd/drbd_%.bbappend new file mode 100644 index 00000000000..933aaf6c429 --- /dev/null +++ b/bsp/meta-raspberrypi/dynamic-layers/networking-layer/recipes-support/drbd/drbd_%.bbappend @@ -0,0 +1,3 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +COMPATIBLE_MACHINE_rpi = "(null)" diff --git a/bsp/meta-raspberrypi/dynamic-layers/openembedded-layer/recipes-core/packagegroups/packagegroup-meta-oe.bbappend b/bsp/meta-raspberrypi/dynamic-layers/openembedded-layer/recipes-core/packagegroups/packagegroup-meta-oe.bbappend new file mode 100644 index 00000000000..25423d08884 --- /dev/null +++ b/bsp/meta-raspberrypi/dynamic-layers/openembedded-layer/recipes-core/packagegroups/packagegroup-meta-oe.bbappend @@ -0,0 +1 @@ +RDEPENDS_packagegroup-meta-oe-kernel_remove_rpi = "bpftool" diff --git a/bsp/meta-raspberrypi/dynamic-layers/qt5-layer/recipes-qt/qt5/qtbase_%.bbappend b/bsp/meta-raspberrypi/dynamic-layers/qt5-layer/recipes-qt/qt5/qtbase_%.bbappend new file mode 100644 index 00000000000..e48f31d1175 --- /dev/null +++ b/bsp/meta-raspberrypi/dynamic-layers/qt5-layer/recipes-qt/qt5/qtbase_%.bbappend @@ -0,0 +1,19 @@ +PACKAGECONFIG_GL_rpi = "${@bb.utils.contains('DISTRO_FEATURES', 'x11 opengl', 'gl', \ + bb.utils.contains('DISTRO_FEATURES', 'opengl', 'eglfs gles2', \ + '', d), d)}" +PACKAGECONFIG_GL_append_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', ' kms', '', d)}" +PACKAGECONFIG_GL_append_rpi = " gbm" +PACKAGECONFIG_FONTS_rpi = "fontconfig" +PACKAGECONFIG_append_rpi = " libinput examples tslib xkbcommon" +PACKAGECONFIG_remove_rpi = "tests" + +OE_QTBASE_EGLFS_DEVICE_INTEGRATION_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', 'eglfs_brcm', d)}" + +do_configure_prepend_rpi() { + # Add the appropriate EGLFS_DEVICE_INTEGRATION + if [ "${@d.getVar('OE_QTBASE_EGLFS_DEVICE_INTEGRATION')}" != "" ]; then + echo "EGLFS_DEVICE_INTEGRATION = ${OE_QTBASE_EGLFS_DEVICE_INTEGRATION}" >> ${S}/mkspecs/oe-device-extra.pri + fi +} +RDEPENDS_${PN}_append_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', ' userland', d)}" +DEPENDS_append_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', ' userland', d)}" diff --git a/bsp/meta-raspberrypi/files/custom-licenses/Broadcom-RPi b/bsp/meta-raspberrypi/files/custom-licenses/Broadcom-RPi new file mode 100644 index 00000000000..6f3baa0ca2b --- /dev/null +++ b/bsp/meta-raspberrypi/files/custom-licenses/Broadcom-RPi @@ -0,0 +1,29 @@ +Copyright (c) 2006, Broadcom Corporation. +Copyright (c) 2015, Raspberry Pi (Trading) Ltd +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* This software may only be used for the purposes of developing for, + running or using a Raspberry Pi device. +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Broadcom Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. diff --git a/bsp/meta-raspberrypi/img/balena.png b/bsp/meta-raspberrypi/img/balena.png new file mode 100644 index 0000000000000000000000000000000000000000..a872ce9b81d127bbd0a588fc84b7d10be73bf175 GIT binary patch literal 7307 zcmV;69CYJ}P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/bsp/meta-raspberrypi/kas-poky-rpi.yml b/bsp/meta-raspberrypi/kas-poky-rpi.yml new file mode 100644 index 00000000000..d629e817f1e --- /dev/null +++ b/bsp/meta-raspberrypi/kas-poky-rpi.yml @@ -0,0 +1,61 @@ +header: + version: 8 + +machine: raspberrypi4 +distro: poky +target: + - core-image-base + +repos: + meta-raspberry: + + poky: + url: https://git.yoctoproject.org/git/poky + path: layers/poky + refspec: master + layers: + meta: + meta-poky: + meta-yocto-bsp: + + meta-openembedded: + url: http://git.openembedded.org/meta-openembedded + path: layers/meta-openembedded + refspec: master + layers: + meta-oe: + meta-python: + meta-networking: + meta-perl: + + meta-qt5: + url: https://github.com/meta-qt5/meta-qt5/ + path: layers/meta-qt5 + refspec: master + +bblayers_conf_header: + standard: | + POKY_BBLAYERS_CONF_VERSION = "2" + BBPATH = "${TOPDIR}" + BBFILES ?= "" +local_conf_header: + reduce_diskspace: | + INHERIT += "rm_work_and_downloads" + standard: | + CONF_VERSION = "1" + PACKAGE_CLASSES = "package_rpm" + SDKMACHINE = "x86_64" + USER_CLASSES = "buildstats image-mklibs image-prelink" + PATCHRESOLVE = "noop" + debug-tweaks: | + EXTRA_IMAGE_FEATURES = "debug-tweaks" + diskmon: | + BB_DISKMON_DIRS = "\ + STOPTASKS,${TMPDIR},1G,100K \ + STOPTASKS,${DL_DIR},1G,100K \ + STOPTASKS,${SSTATE_DIR},1G,100K \ + STOPTASKS,/tmp,100M,100K \ + ABORT,${TMPDIR},100M,1K \ + ABORT,${DL_DIR},100M,1K \ + ABORT,${SSTATE_DIR},100M,1K \ + ABORT,/tmp,10M,1K" diff --git a/bsp/meta-raspberrypi/lib/oeqa/runtime/cases/parselogs_rpi.py b/bsp/meta-raspberrypi/lib/oeqa/runtime/cases/parselogs_rpi.py new file mode 100644 index 00000000000..4a943103454 --- /dev/null +++ b/bsp/meta-raspberrypi/lib/oeqa/runtime/cases/parselogs_rpi.py @@ -0,0 +1,18 @@ +from oeqa.runtime.cases.parselogs import * + +rpi_errors = [ + 'bcmgenet fd580000.genet: failed to get enet-eee clock', + 'bcmgenet fd580000.genet: failed to get enet-wol clock', + 'bcmgenet fd580000.genet: failed to get enet clock', + 'bcmgenet fd580000.ethernet: failed to get enet-eee clock', + 'bcmgenet fd580000.ethernet: failed to get enet-wol clock', + 'bcmgenet fd580000.ethernet: failed to get enet clock', +] + +ignore_errors['raspberrypi4'] = rpi_errors + common_errors +ignore_errors['raspberrypi4-64'] = rpi_errors + common_errors +ignore_errors['raspberrypi3'] = rpi_errors + common_errors +ignore_errors['raspberrypi3-64'] = rpi_errors + common_errors + +class ParseLogsTestRpi(ParseLogsTest): + pass diff --git a/bsp/meta-raspberrypi/recipes-bsp/armstubs/armstubs.bb b/bsp/meta-raspberrypi/recipes-bsp/armstubs/armstubs.bb new file mode 100644 index 00000000000..7e389dff58f --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-bsp/armstubs/armstubs.bb @@ -0,0 +1,38 @@ +DESCRIPTION = "Boot strap code that the GPU puts on memory to start running the boot loader" +LICENSE = "BSD-3-Clause" + +LIC_FILES_CHKSUM = "file://armstub.S;beginline=1;endline=26;md5=9888f34ac06a676129416c952a6a521e" + +inherit deploy nopackages + +include recipes-bsp/common/raspberrypi-tools.inc + +COMPATIBLE_MACHINE = "^rpi$" + +S = "${RPITOOLS_S}/armstubs" + +export CC7="${CC}" +export LD7="${LD}" +export OBJCOPY7="${OBJCOPY}" +export OBJDUMP7="${OBJDUMP}" +export CC8="${CC}" +export LD8="${LD}" +export OBJCOPY8="${OBJCOPY}" +export OBJDUMP8="${OBJDUMP} -maarch64" + +do_compile() { + [ -z "${ARMSTUB}" ] && bbfatal "No ARMSTUB defined for your machine." + oe_runmake ${ARMSTUB} +} + +do_deploy() { + install -d ${DEPLOYDIR}/${PN} + cp ${S}/armstub*.bin ${DEPLOYDIR}/${PN} +} + +addtask deploy before do_build after do_install +do_deploy[dirs] += "${DEPLOYDIR}/${PN}" + +PACKAGE_ARCH = "${MACHINE_ARCH}" + +TOOLCHAIN = "gcc" diff --git a/bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-bootfiles.bb b/bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-bootfiles.bb new file mode 100644 index 00000000000..f1248eed10f --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-bootfiles.bb @@ -0,0 +1,43 @@ +DESCRIPTION = "Closed source binary files to help boot all raspberry pi devices." +LICENSE = "Broadcom-RPi" + +LIC_FILES_CHKSUM = "file://LICENCE.broadcom;md5=c403841ff2837657b2ed8e5bb474ac8d" + +inherit deploy nopackages + +include recipes-bsp/common/raspberrypi-firmware.inc + +INHIBIT_DEFAULT_DEPS = "1" + +DEPENDS = "rpi-config rpi-cmdline" + +COMPATIBLE_MACHINE = "^rpi$" + +S = "${RPIFW_S}/boot" + +PR = "r3" + +do_deploy() { + install -d ${DEPLOYDIR}/${BOOTFILES_DIR_NAME} + + for i in ${S}/*.elf ; do + cp $i ${DEPLOYDIR}/${BOOTFILES_DIR_NAME} + done + for i in ${S}/*.dat ; do + cp $i ${DEPLOYDIR}/${BOOTFILES_DIR_NAME} + done + for i in ${S}/*.bin ; do + cp $i ${DEPLOYDIR}/${BOOTFILES_DIR_NAME} + done + + # Add stamp in deploy directory + touch ${DEPLOYDIR}/${BOOTFILES_DIR_NAME}/${PN}-${PV}.stamp +} + +do_deploy[depends] += "rpi-config:do_deploy rpi-cmdline:do_deploy" + +addtask deploy before do_build after do_install +do_deploy[dirs] += "${DEPLOYDIR}/${BOOTFILES_DIR_NAME}" + +PACKAGE_ARCH = "${MACHINE_ARCH}" + diff --git a/bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-cmdline.bb b/bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-cmdline.bb new file mode 100644 index 00000000000..3ebd1e61c24 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-cmdline.bb @@ -0,0 +1,51 @@ +SUMMARY = "cmdline.txt file used to boot the kernel on a Raspberry Pi device" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +COMPATIBLE_MACHINE = "^rpi$" +INHIBIT_DEFAULT_DEPS = "1" +inherit deploy nopackages + +CMDLINE_DWC_OTG ?= "dwc_otg.lpm_enable=0" +CMDLINE_ROOTFS ?= "root=/dev/mmcblk0p2 rootfstype=ext4 rootwait" + +CMDLINE_SERIAL ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=serial0,115200", "", d)}" + +CMDLINE_CMA ?= "${@oe.utils.conditional("RASPBERRYPI_CAMERA_V2", "1", "cma=64M", "", d)}" + +CMDLINE_CMA ?= "${@oe.utils.conditional("RASPBERRYPI_HD_CAMERA", "1", "cma=64M", "", d)}" + +CMDLINE_PITFT ?= "${@bb.utils.contains("MACHINE_FEATURES", "pitft", "fbcon=map:10 fbcon=font:VGA8x8", "", d)}" + +# Add the kernel debugger over console kernel command line option if enabled +CMDLINE_KGDB ?= '${@oe.utils.conditional("ENABLE_KGDB", "1", "kgdboc=serial0,115200", "", d)}' + +# Disable rpi logo on boot +CMDLINE_LOGO ?= '${@oe.utils.conditional("DISABLE_RPI_BOOT_LOGO", "1", "logo.nologo", "", d)}' + +# You can define CMDLINE_DEBUG as "debug" in your local.conf or distro.conf +# to enable kernel debugging. +CMDLINE_DEBUG ?= "" + +CMDLINE = " \ + ${CMDLINE_DWC_OTG} \ + ${CMDLINE_SERIAL} \ + ${CMDLINE_ROOTFS} \ + ${CMDLINE_CMA} \ + ${CMDLINE_KGDB} \ + ${CMDLINE_LOGO} \ + ${CMDLINE_PITFT} \ + ${CMDLINE_DEBUG} \ + " + +do_compile() { + echo "${@' '.join('${CMDLINE}'.split())}" > "${WORKDIR}/cmdline.txt" +} + +do_deploy() { + install -d "${DEPLOYDIR}/${BOOTFILES_DIR_NAME}" + install -m 0644 "${WORKDIR}/cmdline.txt" "${DEPLOYDIR}/${BOOTFILES_DIR_NAME}" +} + +addtask deploy before do_build after do_install +do_deploy[dirs] += "${DEPLOYDIR}/${BOOTFILES_DIR_NAME}" diff --git a/bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bb b/bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bb new file mode 100644 index 00000000000..1e48ca3a438 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bb @@ -0,0 +1,267 @@ +DESCRIPTION = "Commented config.txt file for the Raspberry Pi. \ + The Raspberry Pi config.txt file is read by the GPU before \ + the ARM core is initialised. It can be used to set various \ + system configuration parameters." +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +COMPATIBLE_MACHINE = "^rpi$" + +SRCREV = "648ffc470824c43eb0d16c485f4c24816b32cd6f" +SRC_URI = "git://github.com/Evilpaul/RPi-config.git;protocol=https;branch=master \ + " + +S = "${WORKDIR}/git" + +PR = "r5" + +INHIBIT_DEFAULT_DEPS = "1" + +PITFT="${@bb.utils.contains("MACHINE_FEATURES", "pitft", "1", "0", d)}" +PITFT22="${@bb.utils.contains("MACHINE_FEATURES", "pitft22", "1", "0", d)}" +PITFT28r="${@bb.utils.contains("MACHINE_FEATURES", "pitft28r", "1", "0", d)}" +PITFT28c="${@bb.utils.contains("MACHINE_FEATURES", "pitft28c", "1", "0", d)}" +PITFT35r="${@bb.utils.contains("MACHINE_FEATURES", "pitft35r", "1", "0", d)}" + +VC4GRAPHICS="${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "1", "0", d)}" +VC4DTBO ?= "vc4-kms-v3d" +GPIO_IR ?= "18" +GPIO_IR_TX ?= "17" + +CAN_OSCILLATOR ?= "16000000" + +inherit deploy nopackages + +do_deploy() { + install -d ${DEPLOYDIR}/${BOOTFILES_DIR_NAME} + CONFIG=${DEPLOYDIR}/${BOOTFILES_DIR_NAME}/config.txt + + cp ${S}/config.txt $CONFIG + + if [ -n "${KEY_DECODE_MPG2}" ]; then + sed -i '/#decode_MPG2=/ c\decode_MPG2=${KEY_DECODE_MPG2}' $CONFIG + fi + if [ -n "${KEY_DECODE_WVC1}" ]; then + sed -i '/#decode_WVC1=/ c\decode_WVC1=${KEY_DECODE_WVC1}' $CONFIG + fi + if [ -n "${DISABLE_OVERSCAN}" ]; then + sed -i '/#disable_overscan=/ c\disable_overscan=${DISABLE_OVERSCAN}' $CONFIG + fi + if [ "${DISABLE_SPLASH}" = "1" ]; then + sed -i '/#disable_splash=/ c\disable_splash=${DISABLE_SPLASH}' $CONFIG + fi + + # Set overclocking options + if [ -n "${ARM_FREQ}" ]; then + sed -i '/#arm_freq=/ c\arm_freq=${ARM_FREQ}' $CONFIG + fi + if [ -n "${GPU_FREQ}" ]; then + sed -i '/#gpu_freq=/ c\gpu_freq=${GPU_FREQ}' $CONFIG + fi + if [ -n "${CORE_FREQ}" ]; then + sed -i '/#core_freq=/ c\core_freq=${CORE_FREQ}' $CONFIG + fi + if [ -n "${SDRAM_FREQ}" ]; then + sed -i '/#sdram_freq=/ c\sdram_freq=${SDRAM_FREQ}' $CONFIG + fi + if [ -n "${OVER_VOLTAGE}" ]; then + sed -i '/#over_voltage=/ c\over_voltage=${OVER_VOLTAGE}' $CONFIG + fi + + # GPU memory + if [ -n "${GPU_MEM}" ]; then + sed -i '/#gpu_mem=/ c\gpu_mem=${GPU_MEM}' $CONFIG + fi + if [ -n "${GPU_MEM_256}" ]; then + sed -i '/#gpu_mem_256=/ c\gpu_mem_256=${GPU_MEM_256}' $CONFIG + fi + if [ -n "${GPU_MEM_512}" ]; then + sed -i '/#gpu_mem_512=/ c\gpu_mem_512=${GPU_MEM_512}' $CONFIG + fi + if [ -n "${GPU_MEM_1024}" ]; then + sed -i '/#gpu_mem_1024=/ c\gpu_mem_1024=${GPU_MEM_1024}' $CONFIG + fi + + # Set boot delay + if [ -n "${BOOT_DELAY}" ]; then + sed -i '/#boot_delay=/ c\boot_delay=${BOOT_DELAY}' $CONFIG + fi + if [ -n "${BOOT_DELAY_MS}" ]; then + sed -i '/#boot_delay_ms=/ c\boot_delay_ms=${BOOT_DELAY_MS}' $CONFIG + fi + + # Set HDMI and composite video options + if [ -n "${HDMI_FORCE_HOTPLUG}" ]; then + sed -i '/#hdmi_force_hotplug=/ c\hdmi_force_hotplug=${HDMI_FORCE_HOTPLUG}' $CONFIG + fi + if [ -n "${HDMI_DRIVE}" ]; then + sed -i '/#hdmi_drive=/ c\hdmi_drive=${HDMI_DRIVE}' $CONFIG + fi + if [ -n "${HDMI_GROUP}" ]; then + sed -i '/#hdmi_group=/ c\hdmi_group=${HDMI_GROUP}' $CONFIG + fi + if [ -n "${HDMI_MODE}" ]; then + sed -i '/#hdmi_mode=/ c\hdmi_mode=${HDMI_MODE}' $CONFIG + fi + if [ -n "${CONFIG_HDMI_BOOST}" ]; then + sed -i '/#config_hdmi_boost=/ c\config_hdmi_boost=${CONFIG_HDMI_BOOST}' $CONFIG + fi + if [ -n "${SDTV_MODE}" ]; then + sed -i '/#sdtv_mode=/ c\sdtv_mode=${SDTV_MODE}' $CONFIG + fi + if [ -n "${SDTV_ASPECT}" ]; then + sed -i '/#sdtv_aspect=/ c\sdtv_aspect=${SDTV_ASPECT}' $CONFIG + fi + if [ -n "${DISPLAY_ROTATE}" ]; then + sed -i '/#display_rotate=/ c\display_rotate=${DISPLAY_ROTATE}' $CONFIG + fi + + # Video camera support + if [ "${VIDEO_CAMERA}" = "1" ]; then + # It has been observed that Raspberry Pi 4B 4GB may fail to enable the + # camera if "start_x=1" is at the end of the file. Therefore, + # "start_x=1" has been set to replace the original occurrence in + # config.txt, which is at the middle of the file. + # The exact underlying cause is unknown. There are similar issues + # reported in the raspberrypi/firware repo and the conclusion reached + # was that there could be a file size limitation affecting certain + # variables. It was commented that this limitation could be 4k but + # not proved. + sed -i '/#start_x=/ c\start_x=1' $CONFIG + fi + + # Offline compositing support + if [ "${DISPMANX_OFFLINE}" = "1" ]; then + echo "# Enable offline compositing" >>$CONFIG + echo "dispmanx_offline=1" >>$CONFIG + fi + + # SPI bus support + if [ "${ENABLE_SPI_BUS}" = "1" ] || [ "${PITFT}" = "1" ]; then + echo "# Enable SPI bus" >>$CONFIG + echo "dtparam=spi=on" >>$CONFIG + fi + + # I2C support + if [ "${ENABLE_I2C}" = "1" ] || [ "${PITFT}" = "1" ]; then + echo "# Enable I2C" >>$CONFIG + echo "dtparam=i2c1=on" >>$CONFIG + echo "dtparam=i2c_arm=on" >>$CONFIG + fi + + # PiTFT22 display support + if [ "${PITFT22}" = "1" ]; then + echo "# Enable PITFT22 display" >>$CONFIG + echo "dtoverlay=pitft22,rotate=270,speed=32000000,txbuflen=32768" >>$CONFIG + fi + if [ "${PITFT28r}" = "1" ]; then + echo "# Enable PITFT28r display" >>$CONFIG + echo "dtoverlay=pitft28-resistive,rotate=90,speed=32000000,txbuflen=32768" >>$CONFIG + fi + if [ "${PITFT28c}" = "1" ]; then + echo "# Enable PITFT28c display" >>$CONFIG + echo "dtoverlay=pitft28-capacitive,rotate=90,speed=32000000,txbuflen=32768" >>$CONFIG + echo "dtoverlay=pitft28-capacitive,touch-swapxy,touch-invx" >>$CONFIG + fi + if [ "${PITFT35r}" = "1" ]; then + echo "# Enable PITFT35r display" >>$CONFIG + echo "dtoverlay=pitft35-resistive,rotate=90,speed=42000000,fps=20" >>$CONFIG + fi + + # UART support + if [ "${ENABLE_UART}" = "1" ]; then + echo "# Enable UART" >>$CONFIG + echo "enable_uart=1" >>$CONFIG + fi + + # Infrared support + if [ "${ENABLE_IR}" = "1" ]; then + echo "# Enable infrared" >>$CONFIG + echo "dtoverlay=gpio-ir,gpio_pin=${GPIO_IR}" >>$CONFIG + echo "dtoverlay=gpio-ir-tx,gpio_pin=${GPIO_IR_TX}" >>$CONFIG + fi + + # VC4 Graphics support + if [ "${VC4GRAPHICS}" = "1" ]; then + echo "# Enable VC4 Graphics" >> $CONFIG + echo "dtoverlay=${VC4DTBO}" >> $CONFIG + fi + + # Choose Camera Sensor to be used, default imx219 sensor + if [ "${RASPBERRYPI_CAMERA_V2}" = "1" ]; then + echo "# Enable Sony RaspberryPi Camera(imx219)" >> $CONFIG + echo "dtoverlay=imx219" >> $CONFIG + fi + + # Choose Camera Sensor to be used, default imx477 sensor + #if [ "${RASPBERRYPI_HD_CAMERA}" = "1" ]; then + # echo "# Enable Sony RaspberryPi Camera(imx477)" >> $CONFIG + # echo "dtoverlay=imx477" >> $CONFIG + #fi + + # Waveshare "C" 1024x600 7" Rev2.1 IPS capacitive touch (http://www.waveshare.com/7inch-HDMI-LCD-C.htm) + if [ "${WAVESHARE_1024X600_C_2_1}" = "1" ]; then + echo "# Waveshare \"C\" 1024x600 7\" Rev2.1 IPS capacitive touch screen" >> $CONFIG + echo "max_usb_current=1" >> $CONFIG + echo "hdmi_group=2" >> $CONFIG + echo "hdmi_mode=87" >> $CONFIG + echo "hdmi_cvt 1024 600 60 6 0 0 0" >> $CONFIG + echo "hdmi_drive=1" >> $CONFIG + fi + + # DWC2 USB peripheral support + if [ "${ENABLE_DWC2_PERIPHERAL}" = "1" ]; then + echo "# Enable USB peripheral mode" >> $CONFIG + echo "dtoverlay=dwc2,dr_mode=peripheral" >> $CONFIG + fi + + # DWC2 USB host mode support + if [ "${ENABLE_DWC2_HOST}" = "1" ]; then + echo "# Enable USB host mode" >> $CONFIG + echo "dtoverlay=dwc2,dr_mode=host" >> $CONFIG + fi + + # AT86RF23X support + if [ "${ENABLE_AT86RF}" = "1" ]; then + echo "# Enable AT86RF23X" >>$CONFIG + echo "dtoverlay=at86rf233,speed=3000000" >>$CONFIG + fi + + # ENABLE DUAL CAN + if [ "${ENABLE_DUAL_CAN}" = "1" ]; then + echo "# Enable DUAL CAN" >>$CONFIG + echo "dtoverlay=mcp2515-can0,oscillator=${CAN_OSCILLATOR},interrupt=25" >>$CONFIG + echo "dtoverlay=mcp2515-can1,oscillator=${CAN_OSCILLATOR},interrupt=24" >>$CONFIG + # ENABLE CAN + elif [ "${ENABLE_CAN}" = "1" ]; then + echo "# Enable CAN" >>$CONFIG + echo "dtoverlay=mcp2515-can0,oscillator=${CAN_OSCILLATOR},interrupt=25" >>$CONFIG + fi + + # Append extra config if the user has provided any + printf "${RPI_EXTRA_CONFIG}\n" >> $CONFIG + + # Handle setup with armstub file + if [ "${@bb.utils.contains("MACHINE_FEATURES", "armstub", "1", "0", d)}" = "1" ]; then + echo "\n# ARM stub configuration" >> $CONFIG + echo "armstub=${ARMSTUB}" >> $CONFIG + case "${ARMSTUB}" in + *-gic.bin) + echo "enable_gic=1" >> $CONFIG + ;; + esac + fi +} + +do_deploy_append_raspberrypi3-64() { + echo "# have a properly sized image" >> $CONFIG + echo "disable_overscan=1" >> $CONFIG + + echo "# Enable audio (loads snd_bcm2835)" >> $CONFIG + echo "dtparam=audio=on" >> $CONFIG +} + +addtask deploy before do_build after do_install +do_deploy[dirs] += "${DEPLOYDIR}/${BOOTFILES_DIR_NAME}" + +PACKAGE_ARCH = "${MACHINE_ARCH}" diff --git a/bsp/meta-raspberrypi/recipes-bsp/common/raspberrypi-firmware.inc b/bsp/meta-raspberrypi/recipes-bsp/common/raspberrypi-firmware.inc new file mode 100644 index 00000000000..6358fba4f52 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-bsp/common/raspberrypi-firmware.inc @@ -0,0 +1,9 @@ +RPIFW_DATE ?= "20210421" +SRCREV ?= "2ac4de4eaac5c1d1b25acec4a5e0a9fdb16f0c91" +RPIFW_SRC_URI ?= "https://github.com/raspberrypi/firmware/archive/${SRCREV}.tar.gz;downloadfilename=raspberrypi-firmware-${SRCREV}.tar.gz" +RPIFW_S ?= "${WORKDIR}/firmware-${SRCREV}" + +SRC_URI = "${RPIFW_SRC_URI}" +SRC_URI[sha256sum] = "c687aa1b5127a8dc0773e8aefb1f009f24bf71ccb4c9e8b40a1d46cbbb7bee0c" + +PV = "${RPIFW_DATE}" diff --git a/bsp/meta-raspberrypi/recipes-bsp/common/raspberrypi-tools.inc b/bsp/meta-raspberrypi/recipes-bsp/common/raspberrypi-tools.inc new file mode 100644 index 00000000000..7879c0af5f7 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-bsp/common/raspberrypi-tools.inc @@ -0,0 +1,9 @@ +RPITOOLS_DATE ?= "20201008" +SRCREV ?= "fc0e73c13865450e95edd046200e42a6e52d8256" +RPITOOLS_SRC_URI ?= "https://github.com/raspberrypi/tools/archive/${SRCREV}.tar.gz;downloadfilename=raspberrypi-tools-${SRCREV}.tar.gz" +RPITOOLS_S ?= "${WORKDIR}/tools-${SRCREV}" + +SRC_URI = "${RPITOOLS_SRC_URI}" +SRC_URI[sha256sum] = "05217b942150830225e8ee04a8f16b8ecc2ffbbe5dd815541b15333f783e805e" + +PV = "${RPITOOLS_DATE}" diff --git a/bsp/meta-raspberrypi/recipes-bsp/formfactor/formfactor/rpi/machconfig b/bsp/meta-raspberrypi/recipes-bsp/formfactor/formfactor/rpi/machconfig new file mode 100644 index 00000000000..bef4ce3c9b9 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-bsp/formfactor/formfactor/rpi/machconfig @@ -0,0 +1,6 @@ +HAVE_TOUCHSCREEN=0 +HAVE_KEYBOARD=1 + +DISPLAY_CAN_ROTATE=0 +DISPLAY_ORIENTATION=0 +DISPLAY_DPI=133 diff --git a/bsp/meta-raspberrypi/recipes-bsp/formfactor/formfactor_%.bbappend b/bsp/meta-raspberrypi/recipes-bsp/formfactor/formfactor_%.bbappend new file mode 100644 index 00000000000..72d991c7e59 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-bsp/formfactor/formfactor_%.bbappend @@ -0,0 +1 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" diff --git a/bsp/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/files/boot.cmd.in b/bsp/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/files/boot.cmd.in new file mode 100644 index 00000000000..627d1815663 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/files/boot.cmd.in @@ -0,0 +1,4 @@ +fdt addr ${fdt_addr} && fdt get value bootargs /chosen bootargs +fatload mmc 0:1 ${kernel_addr_r} @@KERNEL_IMAGETYPE@@ +if test ! -e mmc 0:1 uboot.env; then saveenv; fi; +@@KERNEL_BOOTCMD@@ ${kernel_addr_r} - ${fdt_addr} diff --git a/bsp/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/rpi-u-boot-scr.bb b/bsp/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/rpi-u-boot-scr.bb new file mode 100644 index 00000000000..9108f713942 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/rpi-u-boot-scr.bb @@ -0,0 +1,28 @@ +SUMMARY = "U-boot boot scripts for Raspberry Pi" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" +COMPATIBLE_MACHINE = "^rpi$" + +DEPENDS = "u-boot-mkimage-native" + +INHIBIT_DEFAULT_DEPS = "1" + +SRC_URI = "file://boot.cmd.in" + +do_compile() { + sed -e 's/@@KERNEL_IMAGETYPE@@/${KERNEL_IMAGETYPE}/' \ + -e 's/@@KERNEL_BOOTCMD@@/${KERNEL_BOOTCMD}/' \ + "${WORKDIR}/boot.cmd.in" > "${WORKDIR}/boot.cmd" + mkimage -A ${UBOOT_ARCH} -T script -C none -n "Boot script" -d "${WORKDIR}/boot.cmd" boot.scr +} + +inherit kernel-arch deploy nopackages + +do_deploy() { + install -d ${DEPLOYDIR} + install -m 0644 boot.scr ${DEPLOYDIR} +} + +addtask do_deploy after do_compile before do_build + +PROVIDES += "u-boot-default-script" diff --git a/bsp/meta-raspberrypi/recipes-bsp/u-boot/files/0001-dm-core-Move-ofdata_to_platdata-call-earlier.patch b/bsp/meta-raspberrypi/recipes-bsp/u-boot/files/0001-dm-core-Move-ofdata_to_platdata-call-earlier.patch new file mode 100644 index 00000000000..996ad10740f --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-bsp/u-boot/files/0001-dm-core-Move-ofdata_to_platdata-call-earlier.patch @@ -0,0 +1,51 @@ +From 336d86ebd146905cf4384912f4f27699b6e37c72 Mon Sep 17 00:00:00 2001 +From: Simon Glass +Date: Sun, 29 Dec 2019 21:19:17 -0700 +Subject: [PATCH] dm: core: Move ofdata_to_platdata() call earlier + +This method is supposed to extract platform data from the device tree. It +should be done before the device itself is probed. Move it earlier in the +device_probe() function. + +Upstream-Status: Backport + +Signed-off-by: Simon Glass +--- + drivers/core/device.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/drivers/core/device.c b/drivers/core/device.c +index 4e03708..291ff4c 100644 +--- a/drivers/core/device.c ++++ b/drivers/core/device.c +@@ -375,6 +375,13 @@ int device_probe(struct udevice *dev) + return 0; + } + ++ if (drv->ofdata_to_platdata && ++ (CONFIG_IS_ENABLED(OF_PLATDATA) || dev_has_of_node(dev))) { ++ ret = drv->ofdata_to_platdata(dev); ++ if (ret) ++ goto fail; ++ } ++ + seq = uclass_resolve_seq(dev); + if (seq < 0) { + ret = seq; +@@ -411,13 +418,6 @@ int device_probe(struct udevice *dev) + goto fail; + } + +- if (drv->ofdata_to_platdata && +- (CONFIG_IS_ENABLED(OF_PLATDATA) || dev_has_of_node(dev))) { +- ret = drv->ofdata_to_platdata(dev); +- if (ret) +- goto fail; +- } +- + /* Only handle devices that have a valid ofnode */ + if (dev_of_valid(dev)) { + /* +-- +2.7.4 + diff --git a/bsp/meta-raspberrypi/recipes-bsp/u-boot/files/fw_env.config b/bsp/meta-raspberrypi/recipes-bsp/u-boot/files/fw_env.config new file mode 100644 index 00000000000..d00df0cb394 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-bsp/u-boot/files/fw_env.config @@ -0,0 +1 @@ +/boot/uboot.env 0x0000 0x4000 diff --git a/bsp/meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend b/bsp/meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend new file mode 100644 index 00000000000..cdfe5bb8ba8 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend @@ -0,0 +1,15 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" + +SRC_URI_append_rpi = " \ + file://fw_env.config \ +" + +# special fix for raspberrypi-cm3 +SRC_URI_append_raspberrypi-cm3 = " file://0001-dm-core-Move-ofdata_to_platdata-call-earlier.patch" + +DEPENDS_append_rpi = " u-boot-default-script" + +do_install_append_rpi () { + install -d ${D}${sysconfdir} + install -m 0644 ${WORKDIR}/fw_env.config ${D}${sysconfdir}/fw_env.config +} diff --git a/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0001-bcm43xx-Add-bcm43xx-3wire-variant.patch b/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0001-bcm43xx-Add-bcm43xx-3wire-variant.patch new file mode 100644 index 00000000000..3bc02c49e23 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0001-bcm43xx-Add-bcm43xx-3wire-variant.patch @@ -0,0 +1,26 @@ +From b4f2b77472aeb967d3a7595e8a965785c7a37c87 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Tue, 16 Feb 2016 16:40:46 +0000 +Subject: [PATCH 1/4] bcm43xx: Add bcm43xx-3wire variant + +--- + tools/hciattach.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/tools/hciattach.c b/tools/hciattach.c +index 59a76a7..5861d33 100644 +--- a/tools/hciattach.c ++++ b/tools/hciattach.c +@@ -1144,6 +1144,9 @@ struct uart_t uart[] = { + { "bcm43xx", 0x0000, 0x0000, HCI_UART_H4, 115200, 3000000, + FLOW_CTL, DISABLE_PM, NULL, bcm43xx, NULL }, + ++ { "bcm43xx-3wire", 0x0000, 0x0000, HCI_UART_3WIRE, 115200, 3000000, ++ 0, DISABLE_PM, NULL, bcm43xx, NULL }, ++ + { "ath3k", 0x0000, 0x0000, HCI_UART_ATH3K, 115200, 115200, + FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm }, + +-- +1.9.1 + diff --git a/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch b/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch new file mode 100644 index 00000000000..5a0a434a30f --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch @@ -0,0 +1,37 @@ +From e145c9621f976063e5c573db1f2053d906f63427 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Tue, 16 Feb 2016 16:39:09 +0000 +Subject: [PATCH 2/4] bcm43xx: The UART speed must be reset after the firmware download + +--- + tools/hciattach_bcm43xx.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/tools/hciattach_bcm43xx.c b/tools/hciattach_bcm43xx.c +index 81f38cb..0b792e0 100644 +--- a/tools/hciattach_bcm43xx.c ++++ b/tools/hciattach_bcm43xx.c +@@ -366,11 +366,8 @@ int bcm43xx_init(int fd, int def_speed, int speed, struct termios *ti, + return -1; + + if (bcm43xx_locate_patch(FIRMWARE_DIR, chip_name, fw_path)) { +- fprintf(stderr, "Patch not found, continue anyway\n"); ++ fprintf(stderr, "Patch not found for %s, continue anyway\n", chip_name); + } else { +- if (bcm43xx_set_speed(fd, ti, speed)) +- return -1; +- + if (bcm43xx_load_firmware(fd, fw_path)) + return -1; + +@@ -380,6 +377,7 @@ int bcm43xx_init(int fd, int def_speed, int speed, struct termios *ti, + return -1; + } + ++ sleep(1); + if (bcm43xx_reset(fd)) + return -1; + } +-- +1.9.1 + diff --git a/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0003-Increase-firmware-load-timeout-to-30s.patch b/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0003-Increase-firmware-load-timeout-to-30s.patch new file mode 100644 index 00000000000..f9f09ebb09a --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0003-Increase-firmware-load-timeout-to-30s.patch @@ -0,0 +1,25 @@ +From d41dc2046dd08d8c95197f677e224506f5b39bdd Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Wed, 20 Jan 2016 16:00:37 +0000 +Subject: [PATCH 3/4] Increase firmware load timeout to 30s + +--- + tools/hciattach.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/hciattach.c b/tools/hciattach.c +index 5861d33..4141796 100644 +--- a/tools/hciattach.c ++++ b/tools/hciattach.c +@@ -1293,7 +1293,7 @@ int main(int argc, char *argv[]) + { + struct uart_t *u = NULL; + int detach, printpid, raw, opt, i, n, ld, err; +- int to = 10; ++ int to = 30; + int init_speed = 0; + int send_break = 0; + pid_t pid; +-- +1.9.1 + diff --git a/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0004-Move-the-43xx-firmware-into-lib-firmware.patch b/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0004-Move-the-43xx-firmware-into-lib-firmware.patch new file mode 100644 index 00000000000..dadce354e9a --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0004-Move-the-43xx-firmware-into-lib-firmware.patch @@ -0,0 +1,25 @@ +From 76681284b0ea49852041fdb97a35175089a08781 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Tue, 23 Feb 2016 17:52:29 +0000 +Subject: [PATCH 4/4] Move the 43xx firmware into /lib/firmware + +--- + tools/hciattach_bcm43xx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/hciattach_bcm43xx.c b/tools/hciattach_bcm43xx.c +index 0b792e0..207f668 100644 +--- a/tools/hciattach_bcm43xx.c ++++ b/tools/hciattach_bcm43xx.c +@@ -43,7 +43,7 @@ + #include "hciattach.h" + + #ifndef FIRMWARE_DIR +-#define FIRMWARE_DIR "/etc/firmware" ++#define FIRMWARE_DIR "/lib/firmware" + #endif + + #define FW_EXT ".hcd" +-- +1.9.1 + diff --git a/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5_%.bbappend b/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5_%.bbappend new file mode 100644 index 00000000000..d1a07a46128 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-connectivity/bluez5/bluez5_%.bbappend @@ -0,0 +1,10 @@ +FILESEXTRAPATHS_prepend_rpi := "${THISDIR}/${PN}:" + +SRC_URI_append_rpi = "\ + file://0001-bcm43xx-Add-bcm43xx-3wire-variant.patch \ + file://0002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch \ + file://0003-Increase-firmware-load-timeout-to-30s.patch \ + file://0004-Move-the-43xx-firmware-into-lib-firmware.patch \ +" + +RDEPENDS_${PN}_append_rpi = " pi-bluetooth" diff --git a/bsp/meta-raspberrypi/recipes-connectivity/pi-bluetooth/pi-bluetooth/0001-bthelper-correct-path-for-hciconfig-under-Yocto.patch b/bsp/meta-raspberrypi/recipes-connectivity/pi-bluetooth/pi-bluetooth/0001-bthelper-correct-path-for-hciconfig-under-Yocto.patch new file mode 100644 index 00000000000..45b43c725e9 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-connectivity/pi-bluetooth/pi-bluetooth/0001-bthelper-correct-path-for-hciconfig-under-Yocto.patch @@ -0,0 +1,27 @@ +From a73bbed89fb049ac424c211629935b26013e2573 Mon Sep 17 00:00:00 2001 +From: "Peter A. Bigot" +Date: Wed, 14 Nov 2018 09:19:51 -0600 +Subject: [PATCH] bthelper: correct path for hciconfig under Yocto + +Upstream-Status: Inapproprate [OE-specific] +Signed-off-by: Peter A. Bigot +Signed-off-by: Andrei Gherzan + +--- + usr/bin/bthelper | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/usr/bin/bthelper b/usr/bin/bthelper +index af597e5..5de84f6 100755 +--- a/usr/bin/bthelper ++++ b/usr/bin/bthelper +@@ -10,7 +10,7 @@ fi + + dev="$1" + # Need to bring hci up before looking at MAC as it can be all zeros during init +-/bin/hciconfig "$dev" up +-/bin/hciconfig "$dev" | grep -qE "BD Address: (B8:27:EB|DC:A6:32):" || exit 0 ++/usr/bin/hciconfig "$dev" up ++/usr/bin/hciconfig "$dev" | grep -qE "BD Address: (B8:27:EB|DC:A6:32):" || exit 0 + /usr/bin/hcitool -i "$dev" cmd 0x3f 0x1c 0x01 0x02 0x00 0x01 0x01 > /dev/null + diff --git a/bsp/meta-raspberrypi/recipes-connectivity/pi-bluetooth/pi-bluetooth_0.1.12.bb b/bsp/meta-raspberrypi/recipes-connectivity/pi-bluetooth/pi-bluetooth_0.1.12.bb new file mode 100644 index 00000000000..6ad81c4c7ef --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-connectivity/pi-bluetooth/pi-bluetooth_0.1.12.bb @@ -0,0 +1,47 @@ +SUMMARY = "Script to properly configure BT-HCI on Raspberry Pi" +HOMEPAGE = "https://github.com/RPi-Distro/pi-bluetooth" +SECTION = "kernel" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "\ + file://debian/copyright;md5=6af8de3c8ee71f8e91e9b22f84ff2022 \ +" + +SRC_URI = "\ + git://github.com/RPi-Distro/pi-bluetooth;branch=master;protocol=https \ + file://0001-bthelper-correct-path-for-hciconfig-under-Yocto.patch \ +" +SRCREV = "cbdbcb66bcc5b9af05f1a9fffe2254c872bb0ace" + +S = "${WORKDIR}/git" + +# hciuart.service replaces what was brcm43438.service +inherit systemd +SYSTEMD_SERVICE_${PN} = "\ + hciuart.service \ + bthelper@.service \ +" + +do_install() { + install -d ${D}${sysconfdir}/udev/rules.d + install -m 0644 ${S}/lib/udev/rules.d/* ${D}${sysconfdir}/udev/rules.d + + install -d ${D}${bindir} + install -m 0755 ${S}/usr/bin/bthelper ${D}${bindir} + install -m 0755 ${S}/usr/bin/btuart ${D}${bindir} + + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + install -d ${D}${systemd_system_unitdir} + install -m 0644 ${S}/debian/pi-bluetooth.bthelper@.service ${D}${systemd_system_unitdir}/bthelper@.service + install -m 0644 ${S}/debian/pi-bluetooth.hciuart.service ${D}${systemd_system_unitdir}/hciuart.service + fi +} + +FILES_${PN} = "\ + ${bindir} \ + ${sysconfdir} \ + ${systemd_unitdir}/system \ +" + +RDEPENDS_${PN} += " \ + udev-rules-rpi \ +" diff --git a/bsp/meta-raspberrypi/recipes-core/images/rpi-basic-image.bb b/bsp/meta-raspberrypi/recipes-core/images/rpi-basic-image.bb new file mode 100644 index 00000000000..77a3d7b2b4d --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-core/images/rpi-basic-image.bb @@ -0,0 +1,15 @@ +# Base this image on core-image-minimal +include recipes-core/images/core-image-minimal.bb + +# Include modules in rootfs +IMAGE_INSTALL += " \ + kernel-modules \ + " + +SPLASH = "psplash-raspberrypi" + +IMAGE_FEATURES += "ssh-server-dropbear splash" + +do_image_prepend() { + bb.warn("The image 'rpi-basic-image' is deprecated, please use 'core-image-base' instead") +} diff --git a/bsp/meta-raspberrypi/recipes-core/images/rpi-hwup-image.bb b/bsp/meta-raspberrypi/recipes-core/images/rpi-hwup-image.bb new file mode 100644 index 00000000000..86e9b6daf78 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-core/images/rpi-hwup-image.bb @@ -0,0 +1,11 @@ +# Base this image on core-image-minimal +include recipes-core/images/core-image-minimal.bb + +# Include modules in rootfs +IMAGE_INSTALL += " \ + kernel-modules \ + " + +do_image_prepend() { + bb.warn("The image 'rpi-hwup-image' is deprecated, please use 'core-image-base' instead") +} diff --git a/bsp/meta-raspberrypi/recipes-core/images/rpi-test-image.bb b/bsp/meta-raspberrypi/recipes-core/images/rpi-test-image.bb new file mode 100644 index 00000000000..c2f5f732095 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-core/images/rpi-test-image.bb @@ -0,0 +1,6 @@ +# Base this image on core-image-base +include recipes-core/images/core-image-base.bb + +COMPATIBLE_MACHINE = "^rpi$" + +IMAGE_INSTALL_append = " packagegroup-rpi-test" diff --git a/bsp/meta-raspberrypi/recipes-core/packagegroups/packagegroup-core-tools-testapps.bbappend b/bsp/meta-raspberrypi/recipes-core/packagegroups/packagegroup-core-tools-testapps.bbappend new file mode 100644 index 00000000000..500d871e4bb --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-core/packagegroups/packagegroup-core-tools-testapps.bbappend @@ -0,0 +1,2 @@ +# mesa-demos needs gles1 and userland driver does not have it, works ok with vc4 graphics driver +X11GLTOOLS_remove_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', 'mesa-demos', d)}" diff --git a/bsp/meta-raspberrypi/recipes-core/packagegroups/packagegroup-rpi-test.bb b/bsp/meta-raspberrypi/recipes-core/packagegroups/packagegroup-rpi-test.bb new file mode 100644 index 00000000000..a3f4ac9ae93 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-core/packagegroups/packagegroup-rpi-test.bb @@ -0,0 +1,29 @@ +DESCRIPTION = "RaspberryPi Test Packagegroup" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +PACKAGE_ARCH = "${MACHINE_ARCH}" + +inherit packagegroup + +COMPATIBLE_MACHINE = "^rpi$" + +OMXPLAYER = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', 'omxplayer', d)}" + +RDEPENDS_${PN} = "\ + ${OMXPLAYER} \ + bcm2835-tests \ + rpio \ + rpi-gpio \ + pi-blaster \ + python3-rtimu \ + connman \ + connman-client \ + wireless-regdb-static \ + bluez5 \ +" + +RRECOMMENDS_${PN} = "\ + ${@bb.utils.contains("BBFILE_COLLECTIONS", "meta-multimedia", "bigbuckbunny-1080p bigbuckbunny-480p bigbuckbunny-720p", "", d)} \ + ${MACHINE_EXTRA_RRECOMMENDS} \ +" diff --git a/bsp/meta-raspberrypi/recipes-core/psplash/files/psplash-raspberrypi-img.h b/bsp/meta-raspberrypi/recipes-core/psplash/files/psplash-raspberrypi-img.h new file mode 100644 index 00000000000..de29ee91656 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-core/psplash/files/psplash-raspberrypi-img.h @@ -0,0 +1,3210 @@ +/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ + +#define POKY_IMG_ROWSTRIDE (2280) +#define POKY_IMG_WIDTH (570) +#define POKY_IMG_HEIGHT (720) +#define POKY_IMG_BYTES_PER_PIXEL (4) /* 3:RGB, 4:RGBA */ +#define POKY_IMG_RLE_PIXEL_DATA ((uint8*) \ + "\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\332\0\0\0" \ + "\0\7\0\0\0\7\0\0\0$\0\0\0C\0\0\0U\0\0\0O\0\0\0C\0\0\0\37\377\0\0\0\0" \ + "\372\0\0\0\0\3\0\0\0\4\0\0\0)\0\0\0F\202\0\0\0U\2\0\0\0G\0\0\0\37\377" \ + "\0\0\0\0\377\0\0\0\0\262\0\0\0\0\4\0\0\0\27\0\0\0g\0\0\0\264\0\0\0\366" \ + "\206\0\0\0\377\4\0\0\0\356\0\0\0\271\0\0\0t\0\0\0-\377\0\0\0\0\363\0" \ + "\0\0\0\4\0\0\0-\0\0\0|\0\0\0\311\0\0\0\371\206\0\0\0\377\4\0\0\0\356" \ + "\0\0\0\250\0\0\0\\\0\0\0\10\377\0\0\0\0\377\0\0\0\0\223\0\0\0\0\5\0\0" \ + "\0\10\0\0\0\77\0\0\0i\0\0\0\214\0\0\0\240\202\0\0\0\252\6\0\0\0\241\0" \ + "\0\0\231\0\0\0\214\0\0\0c\0\0\0""7\0\0\0\15\214\0\0\0\0\3\0\0\0\30\0" \ + "\0\0\220\0\0\0\366\215\0\0\0\377\3\0\0\0\320\0\0\0l\0\0\0\17\377\0\0" \ + "\0\0\355\0\0\0\0\3\0\0\0\35\0\0\0\202\0\0\0\335\215\0\0\0\377\3\0\0\0" \ + "\352\0\0\0\204\0\0\0\17\214\0\0\0\0\6\0\0\0\26\0\0\0B\0\0\0l\0\0\0\223" \ + "\0\0\0\231\0\0\0\245\202\0\0\0\252\5\0\0\0\234\0\0\0\205\0\0\0a\0\0\0" \ + "1\0\0\0\2\377\0\0\0\0\364\0\0\0\0\4\0\0\0\12\0\0\0]\0\0\0\267\0\0\0\367" \ + "\214\0\0\0\377\4\0\0\0\333\0\0\0\232\0\0\0V\0\0\0\24\206\0\0\0\0\3\0" \ + "\0\0\6\0\0\0\204\0\0\0\366\221\0\0\0\377\3\0\0\0\363\0\0\0\226\0\0\0" \ + ")\377\0\0\0\0\350\0\0\0\0\4\0\0\0\1\0\0\0F\0\0\0\257\0\0\0\374\221\0" \ + "\0\0\377\3\0\0\0\350\0\0\0a\0\0\0\1\206\0\0\0\0\4\0\0\0!\0\0\0e\0\0\0" \ + "\251\0\0\0\351\214\0\0\0\377\4\0\0\0\357\0\0\0\242\0\0\0G\0\0\0\2\377" \ + "\0\0\0\0\357\0\0\0\0\3\0\0\0\16\0\0\0|\0\0\0\352\222\0\0\0\377\4\0\0" \ + "\0\375\0\0\0\311\0\0\0r\0\0\0\34\202\0\0\0\0\2\0\0\0/\0\0\0\321\225\0" \ + "\0\0\377\4\0\0\0\376\0\0\0\272\0\0\0M\0\0\0\2\213\0\0\0\0\2\0\0\0\17" \ + "\0\0\0\37\202\0\0\0\"\1\0\0\0\12\377\0\0\0\0\303\0\0\0\0\1\0\0\0\23\202" \ + "\0\0\0\"\2\0\0\0\33\0\0\0\13\213\0\0\0\0\3\0\0\0\14\0\0\0j\0\0\0\327" \ + "\226\0\0\0\377\2\0\0\0\271\0\0\0\32\202\0\0\0\0\3\0\0\0.\0\0\0\206\0" \ + "\0\0\334\223\0\0\0\377\3\0\0\0\326\0\0\0_\0\0\0\3\377\0\0\0\0\353\0\0" \ + "\0\0\3\0\0\0\2\0\0\0i\0\0\0\351\227\0\0\0\377\4\0\0\0\375\0\0\0\301\0" \ + "\0\0\223\0\0\0\371\231\0\0\0\377\3\0\0\0\334\0\0\0r\0\0\0\22\203\0\0" \ + "\0\0\6\0\0\0\3\0\0\0""4\0\0\0k\0\0\0\241\0\0\0\313\0\0\0\360\204\0\0" \ + "\0\377\5\0\0\0\376\0\0\0\341\0\0\0\251\0\0\0f\0\0\0\30\377\0\0\0\0\273" \ + "\0\0\0\0\4\0\0\0*\0\0\0w\0\0\0\270\0\0\0\353\205\0\0\0\377\5\0\0\0\350" \ + "\0\0\0\302\0\0\0\224\0\0\0^\0\0\0&\204\0\0\0\0\3\0\0\0""3\0\0\0\222\0" \ + "\0\0\357\231\0\0\0\377\3\0\0\0\354\0\0\0\215\0\0\0\325\230\0\0\0\377" \ + "\2\0\0\0\323\0\0\0F\377\0\0\0\0\351\0\0\0\0\2\0\0\0\34\0\0\0\275\270" \ + "\0\0\0\377\5\0\0\0\372\0\0\0\266\0\0\0r\0\0\0\245\0\0\0\353\215\0\0\0" \ + "\377\3\0\0\0\375\0\0\0\255\0\0\0""5\377\0\0\0\0\266\0\0\0\0\3\0\0\0\2" \ + "\0\0\0Q\0\0\0\311\216\0\0\0\377\4\0\0\0\335\0\0\0\224\0\0\0{\0\0\0\324" \ + "\270\0\0\0\377\3\0\0\0\376\0\0\0\225\0\0\0\11\377\0\0\0\0\346\0\0\0\0" \ + "\2\0\0\0""7\0\0\0\351\316\0\0\0\377\2\0\0\0\272\0\0\0""1\377\0\0\0\0" \ + "\263\0\0\0\0\2\0\0\0P\0\0\0\326\316\0\0\0\377\2\0\0\0\314\0\0\0\31\377" \ + "\0\0\0\0\326\0\0\0\0\6\0\0\0\22\0\0\0V\0\0\0\216\0\0\0\260\0\0\0\323" \ + "\0\0\0\365\203\0\0\0\377\7\0\0\0\372\0\0\0\344\0\0\0\314\0\0\0\264\0" \ + "\0\0\236\0\0\0\217\0\0\0\366\320\0\0\0\377\3\0\0\0\375\0\0\0\240\0\0" \ + "\0\33\377\0\0\0\0\257\0\0\0\0\2\0\0\0""3\0\0\0\300\321\0\0\0\377\7\0" \ + "\0\0\341\0\0\0\214\0\0\0\242\0\0\0\271\0\0\0\322\0\0\0\350\0\0\0\376" \ + "\203\0\0\0\377\6\0\0\0\355\0\0\0\313\0\0\0\250\0\0\0\205\0\0\0E\0\0\0" \ + "\10\377\0\0\0\0\304\0\0\0\0\4\0\0\0\3\0\0\0Y\0\0\0\305\0\0\0\374\341" \ + "\0\0\0\377\3\0\0\0\363\0\0\0y\0\0\0\7\377\0\0\0\0\253\0\0\0\0\3\0\0\0" \ + "\26\0\0\0\233\0\0\0\375\341\0\0\0\377\3\0\0\0\365\0\0\0\261\0\0\0<\377" \ + "\0\0\0\0\301\0\0\0\0\2\0\0\0J\0\0\0\332\346\0\0\0\377\3\0\0\0\337\0\0" \ + "\0o\0\0\0\15\202\0\0\0\0\5\0\0\0\7\0\0\0-\0\0\0G\0\0\0^\0\0\0t\202\0" \ + "\0\0w\4\0\0\0u\0\0\0f\0\0\0H\0\0\0\31\377\0\0\0\0\214\0\0\0\0\4\0\0\0" \ + "\1\0\0\0$\0\0\0T\0\0\0h\203\0\0\0w\5\0\0\0q\0\0\0Z\0\0\0\77\0\0\0&\0" \ + "\0\0\3\202\0\0\0\0\3\0\0\0\34\0\0\0\211\0\0\0\360\346\0\0\0\377\2\0\0" \ + "\0\277\0\0\0)\377\0\0\0\0\275\0\0\0\0\3\0\0\0\6\0\0\0\217\0\0\0\376\351" \ + "\0\0\0\377\4\0\0\0\360\0\0\0\262\0\0\0\327\0\0\0\373\212\0\0\0\377\4" \ + "\0\0\0\342\0\0\0\236\0\0\0O\0\0\0\4\377\0\0\0\0\205\0\0\0\0\4\0\0\0\16" \ + "\0\0\0e\0\0\0\256\0\0\0\357\212\0\0\0\377\4\0\0\0\367\0\0\0\314\0\0\0" \ + "\267\0\0\0\372\351\0\0\0\377\2\0\0\0\365\0\0\0c\377\0\0\0\0\273\0\0\0" \ + "\0\2\0\0\0\11\0\0\0\265\374\0\0\0\377\3\0\0\0\345\0\0\0w\0\0\0\14\377" \ + "\0\0\0\0\4\0\0\0\0\0\0\0\34\0\0\0\225\0\0\0\364\374\0\0\0\377\1\0\0\0" \ + "\203\377\0\0\0\0\271\0\0\0\0\2\0\0\0\6\0\0\0\274\377\0\0\0\377\3\0\0" \ + "\0\351\0\0\0_\0\0\0\1\374\0\0\0\0\3\0\0\0\11\0\0\0\204\0\0\0\370\377" \ + "\0\0\0\377\1\0\0\0\207\377\0\0\0\0\253\0\0\0\0\4\0\0\0\15\0\0\0#\0\0" \ + "\0""8\0\0\0M\203\0\0\0U\7\0\0\0P\0\0\0@\0\0\0""0\0\0\0\37\0\0\0\17\0" \ + "\0\0\0\0\0\0\235\377\0\0\0\377\203\0\0\0\377\2\0\0\0\271\0\0\0\27\372" \ + "\0\0\0\0\2\0\0\0""3\0\0\0\332\377\0\0\0\377\203\0\0\0\377\7\0\0\0c\0" \ + "\0\0\2\0\0\0\22\0\0\0#\0\0\0""3\0\0\0D\0\0\0T\203\0\0\0U\4\0\0\0I\0\0" \ + "\0""2\0\0\0\35\0\0\0\11\377\0\0\0\0\227\0\0\0\0\6\0\0\0\22\0\0\0L\0\0" \ + "\0\202\0\0\0\260\0\0\0\336\0\0\0\367\377\0\0\0\377\222\0\0\0\377\2\0" \ + "\0\0\347\0\0\0""5\370\0\0\0\0\2\0\0\0`\0\0\0\370\377\0\0\0\377\222\0" \ + "\0\0\377\6\0\0\0\363\0\0\0\324\0\0\0\246\0\0\0v\0\0\0>\0\0\0\11\377\0" \ + "\0\0\0\216\0\0\0\0\4\0\0\0*\0\0\0\177\0\0\0\322\0\0\0\376\377\0\0\0\377" \ + "\230\0\0\0\377\2\0\0\0\364\0\0\0I\366\0\0\0\0\2\0\0\0{\0\0\0\376\377" \ + "\0\0\0\377\230\0\0\0\377\4\0\0\0\371\0\0\0\277\0\0\0k\0\0\0\30\377\0" \ + "\0\0\0\210\0\0\0\0\3\0\0\0\3\0\0\0T\0\0\0\307\377\0\0\0\377\235\0\0\0" \ + "\377\2\0\0\0\373\0\0\0`\363\0\0\0\0\2\0\0\0\2\0\0\0\225\377\0\0\0\377" \ + "\235\0\0\0\377\3\0\0\0\374\0\0\0\253\0\0\0""9\377\0\0\0\0\205\0\0\0\0" \ + "\2\0\0\0R\0\0\0\333\332\0\0\0\377\1\5\7\2\377\304\0\0\0\377\2\0\0\0\376" \ + "\0\0\0e\361\0\0\0\0\2\0\0\0\2\0\0\0\236\306\0\0\0\377\1\5\7\2\377\331" \ + "\0\0\0\377\2\0\0\0\300\0\0\0""1\377\0\0\0\0\3\0\0\0\0\0\0\0$\0\0\0\276" \ + "\334\0\0\0\377\4\21\31\6\377V|\35\377/D\20\377\5\7\2\377\302\0\0\0\377" \ + "\2\0\0\0\375\0\0\0_\357\0\0\0\0\2\0\0\0\1\0\0\0\230\304\0\0\0\377\4\0" \ + "\1\0\377\37-\13\377Nq\33\377)<\16\377\332\0\0\0\377\3\0\0\0\375\0\0\0" \ + "\232\0\0\0\16\375\0\0\0\0\2\0\0\0d\0\0\0\366\300\0\0\0\377\6\4\6\1\377" \ + "Dc\27\377Ec\30\377-@\17\377\24\34\7\377\1\2\0\377\230\0\0\0\377\5#3\14" \ + "\377t\250(\377j\231$\377=W\25\377\13\20\4\377\301\0\0\0\377\2\0\0\0\376" \ + "\0\0\0g\355\0\0\0\0\2\0\0\0\2\0\0\0\235\303\0\0\0\377\5\3\4\1\377-B\20" \ + "\377^\207\40\377u\251(\377Fe\30\377\231\0\0\0\377\5\14\22\4\377%5\15" \ + "\377=Y\25\377Or\33\377\21\31\6\377\277\0\0\0\377\2\0\0\0\342\0\0\0""9" \ + "\373\0\0\0\0\1\0\0\0\206\303\0\0\0\377\2\7\13\3\377^\207\40\377\202u" \ + "\251(\377\5o\240&\377X\177\36\377:T\24\377\32&\11\377\2\3\1\377\225\0" \ + "\0\0\377\1""7P\23\377\202u\251(\377\3q\243'\377C`\27\377\14\22\4\377" \ + "\300\0\0\0\377\2\0\0\0\373\0\0\0U\354\0\0\0\0\1\0\0\0\213\302\0\0\0\377" \ + "\3\4\5\1\3771G\21\377h\226#\377\202u\251(\377\2X\177\36\377\2\3\1\377" \ + "\225\0\0\0\377\4\21\30\6\3770F\20\377Or\33\377i\227$\377\202u\251(\377" \ + "\2o\240&\377\32%\11\377\301\0\0\0\377\2\0\0\0\367\0\0\0S\370\0\0\0\0" \ + "\2\0\0\0\2\0\0\0\232\305\0\0\0\377\2\6\11\2\377X\177\36\377\205u\251" \ + "(\377\4n\237&\377Pt\33\3771F\21\377\15\23\5\377\222\0\0\0\377\2\0\1\0" \ + "\377Nq\33\377\203u\251(\377\3r\244'\377Ec\30\377\14\21\4\377\222\0\0" \ + "\0\377\2\10\13\3\377\5\7\2\377\253\0\0\0\377\2\0\0\0\374\0\0\0Z\352\0" \ + "\0\0\0\1\0\0\0\217\256\0\0\0\377\1\14\22\4\377\222\0\0\0\377\3\3\4\1" \ + "\3773J\21\377i\230$\377\203u\251(\377\2h\226$\377\12\16\3\377\222\0\0" \ + "\0\377\4\5\7\2\377'8\15\377Gf\30\377f\224#\377\205u\251(\377\2k\232%" \ + "\377\26\40\10\377\303\0\0\0\377\2\0\0\0\374\0\0\0a\367\0\0\0\0\1\0\0" \ + "\0\212\307\0\0\0\377\2\4\5\1\377Ps\33\377\207u\251(\377\4u\250(\377Z" \ + "\202\37\3772H\21\377\13\21\4\377\220\0\0\0\377\2\6\11\2\377d\220\"\377" \ + "\204u\251(\377\3o\241&\3779R\23\377\4\6\1\377\220\0\0\0\377\3\2\3\1\377" \ + "W}\36\377#3\14\377\253\0\0\0\377\2\0\0\0\371\0\0\0\\\202\0\0\0""3\1\0" \ + "\0\0""7\202\0\0\0D\1\0\0\0F\203\0\0\0U\1\0\0\0\37\324\0\0\0\0\1\0\0\0" \ + "2\202\0\0\0U\1\0\0\0S\203\0\0\0D\1\0\0\0""4\202\0\0\0""3\1\0\0\0\203" \ + "\255\0\0\0\377\3\21\30\6\377Tz\35\377\27!\10\377\221\0\0\0\377\2%6\15" \ + "\377d\221\"\377\204u\251(\377\2t\247(\377\32&\11\377\220\0\0\0\377\4" \ + "\4\6\1\377&6\15\377Np\33\377p\242&\377\207u\251(\377\2e\222#\377\21\31" \ + "\6\377\305\0\0\0\377\2\0\0\0\374\0\0\0Q\365\0\0\0\0\1\0\0\0^\311\0\0" \ + "\0\377\2\1\2\0\377Dc\27\377\211u\251(\377\4t\250(\377W}\36\377)<\16\377" \ + "\4\5\1\377\216\0\0\0\377\1#3\14\377\206u\251(\377\2g\225#\377(:\16\377" \ + "\220\0\0\0\377\4.C\20\377u\251(\377Ps\33\377\14\22\4\377\264\0\0\0\377" \ + "\3\0\0\0\367\0\0\0\200\0\0\0\6\320\0\0\0\0\2\0\0\0\23\0\0\0\252\266\0" \ + "\0\0\377\4\2\3\1\377:T\24\377q\244'\377Rv\34\377\220\0\0\0\377\2\25\36" \ + "\7\377X\177\36\377\206u\251(\377\1Gg\30\377\217\0\0\0\377\3\34(\11\377" \ + "Ij\31\377o\240&\377\211u\251(\377\2^\207\40\377\13\20\4\377\307\0\0\0" \ + "\377\2\0\0\0\364\0\0\0+\351\0\0\0\0\3\0\0\0\20\0\0\0""6\0\0\0]\204\0" \ + "\0\0f\5\0\0\0]\0\0\0M\0\0\0=\0\0\0D\0\0\0\361\256\0\0\0\377\3\15\23\5" \ + "\377\26\40\10\377\4\5\1\377\232\0\0\0\377\1B_\27\377\213u\251(\377\3" \ + "m\236%\377Ca\27\377\24\34\7\377\215\0\0\0\377\1\\\205\40\377\207u\251" \ + "(\377\2Qu\34\377\13\21\4\377\216\0\0\0\377\5\3\4\1\377n\237&\377u\251" \ + "(\377m\236%\377*=\16\377\265\0\0\0\377\2\0\0\0\307\0\0\0+\316\0\0\0\0" \ + "\2\0\0\0K\0\0\0\342\266\0\0\0\377\2\25\36\7\377_\211\40\377\202u\251" \ + "(\377\1\37-\13\377\216\0\0\0\377\3\2\3\1\377:T\24\377r\245'\377\206u" \ + "\251(\377\2t\247(\377\14\22\4\377\214\0\0\0\377\3\10\14\3\3775L\22\377" \ + "b\216\"\377\213u\251(\377\2^\210\40\377\7\12\2\377\231\0\0\0\377\3\1" \ + "\1\0\377\20\27\5\377\26\40\10\377\255\0\0\0\377\5\0\0\0\322\0\0\0""5" \ + "\0\0\0A\0\0\0Q\0\0\0a\204\0\0\0f\3\0\0\0U\0\0\0/\0\0\0\10\332\0\0\0\0" \ + "\4\0\0\0\30\0\0\0d\0\0\0\257\0\0\0\351\272\0\0\0\377\11\2\3\1\377Ij\31" \ + "\377t\247(\377d\221\"\377Qu\34\377>Z\25\377+>\17\377\30\"\10\377\6\10" \ + "\2\377\224\0\0\0\377\2\0\1\0\377Ii\31\377\214u\251(\377\3u\250(\377P" \ + "t\33\377\30\"\10\377\213\0\0\0\377\1""4K\22\377\210u\251(\377\2m\235" \ + "%\377*<\16\377\216\0\0\0\377\1Or\33\377\203u\251(\377\2Ps\33\377\12\17" \ + "\3\377\264\0\0\0\377\3\0\0\0\371\0\0\0~\0\0\0\3\312\0\0\0\0\2\0\0\0\21" \ + "\0\0\0\246\266\0\0\0\377\3\1\2\0\3778P\23\377r\245'\377\202u\251(\377" \ + "\2o\240&\377\3\4\1\377\215\0\0\0\377\2\25\36\7\377^\210\40\377\210u\251" \ + "(\377\1W~\36\377\213\0\0\0\377\3\13\17\4\377\77[\25\377o\240&\377\214" \ + "u\251(\377\2d\220\"\377\11\15\3\377\224\0\0\0\377\11\2\3\1\377\22\32" \ + "\6\377&6\15\3778Q\23\377Lm\32\377_\211\40\377q\243'\377b\216\"\377\16" \ + "\24\5\377\270\0\0\0\377\5\0\0\0\375\0\0\0\337\0\0\0\235\0\0\0R\0\0\0" \ + "\14\323\0\0\0\0\4\0\0\0\2\0\0\0N\0\0\0\275\0\0\0\376\276\0\0\0\377\2" \ + "\0\1\0\377=Y\25\377\205u\251(\377\6t\250(\377`\213!\377Fe\30\377,@\17" \ + "\377\22\33\6\377\0\1\0\377\220\0\0\0\377\2\4\6\1\377b\215!\377\216u\251" \ + "(\377\2Ty\35\377\30\"\10\377\211\0\0\0\377\1\32%\11\377\212u\251(\377" \ + "\2Ln\32\377\6\11\2\377\214\0\0\0\377\1""0F\20\377\204u\251(\377\2i\230" \ + "$\377\35*\12\377\265\0\0\0\377\2\0\0\0\276\0\0\0\27\310\0\0\0\0\2\0\0" \ + "\0""3\0\0\0\336\266\0\0\0\377\2\13\21\4\377W~\36\377\204u\251(\377\1" \ + "Ty\35\377\214\0\0\0\377\3\0\1\0\3772H\21\377r\244'\377\211u\251(\377" \ + "\1=W\25\377\211\0\0\0\377\3\12\17\3\377B_\27\377q\243'\377\215u\251(" \ + "\377\2r\245'\377\27!\10\377\221\0\0\0\377\5\13\17\4\377$4\14\377>Z\25" \ + "\377Y\200\36\377p\242&\377\205u\251(\377\2Z\202\37\377\10\14\3\377\275" \ + "\0\0\0\377\3\0\0\0\370\0\0\0\244\0\0\0""4\320\0\0\0\0\2\0\0\0M\0\0\0" \ + "\333\303\0\0\0\377\2""2H\21\377t\250(\377\210u\251(\377\5m\235%\377S" \ + "x\34\3779S\24\377\35*\12\377\3\4\1\377\215\0\0\0\377\1\33&\11\377\217" \ + "u\251(\377\3u\250(\377Np\33\377\21\31\6\377\207\0\0\0\377\1\33&\11\377" \ + "\213u\251(\377\2e\222#\377\30#\10\377\213\0\0\0\377\1&7\15\377\205u\251" \ + "(\377\3t\247(\3779R\23\377\1\1\0\377\216\0\0\0\377\2,@\17\377\20\27\5" \ + "\377\244\0\0\0\377\2\0\0\0\346\0\0\0>\306\0\0\0\0\2\0\0\0h\0\0\0\370" \ + "\245\0\0\0\377\2\3\5\1\3779R\23\377\217\0\0\0\377\2\40.\13\377j\232$" \ + "\377\205u\251(\377\1Ii\31\377\213\0\0\0\377\2\11\15\3\377Qu\34\377\213" \ + "u\251(\377\1>Y\25\377\207\0\0\0\377\3\6\10\2\377:T\24\377o\240&\377\217" \ + "u\251(\377\1=Y\25\377\216\0\0\0\377\4\24\34\7\3771G\21\377Kl\32\377e" \ + "\222#\377\211u\251(\377\2Pt\33\377\4\6\1\377\301\0\0\0\377\2\0\0\0\300" \ + "\0\0\0,\314\0\0\0\0\2\0\0\0\24\0\0\0\247\306\0\0\0\377\2.B\20\377u\250" \ + "(\377\213u\251(\377\4o\241&\377Rv\34\3771F\21\377\20\27\5\377\213\0\0" \ + "\0\377\1d\220\"\377\220u\251(\377\3s\246'\377@]\26\377\6\11\2\377\205" \ + "\0\0\0\377\1""4L\22\377\214u\251(\377\2r\245'\3770F\20\377\212\0\0\0" \ + "\377\1%5\15\377\207u\251(\377\2Rw\34\377\6\11\2\377\215\0\0\0\377\3""6" \ + "N\23\377l\234%\377\33'\11\377\244\0\0\0\377\3\0\0\0\373\0\0\0v\0\0\0" \ + "\1\302\0\0\0\0\2\0\0\0\13\0\0\0\243\246\0\0\0\377\3\11\15\3\377Y\201" \ + "\37\377Z\203\37\377\216\0\0\0\377\2""6N\23\377t\250(\377\206u\251(\377" \ + "\1Hh\31\377\212\0\0\0\377\2\27\"\10\377h\226#\377\214u\251(\377\1W~\36" \ + "\377\205\0\0\0\377\3\0\1\0\377*=\16\377j\231$\377\221u\251(\377\1\21" \ + "\31\6\377\212\0\0\0\377\4\10\13\3\377'8\15\377Hg\30\377h\226$\377\214" \ + "u\251(\377\2Pt\33\377\2\3\1\377\303\0\0\0\377\3\0\0\0\371\0\0\0\200\0" \ + "\0\0\5\311\0\0\0\0\2\0\0\0$\0\0\0\337\310\0\0\0\377\1""8P\23\377\217" \ + "u\251(\377\4d\221\"\377Db\27\377\"2\14\377\3\5\1\377\207\0\0\0\377\1" \ + "Y\200\36\377\222u\251(\377\2i\227$\377'9\15\377\203\0\0\0\377\2\4\5\1" \ + "\377e\222#\377\216u\251(\377\2Gf\30\377\3\4\1\377\210\0\0\0\377\1:T\24" \ + "\377\210u\251(\377\2a\215!\377\20\27\5\377\214\0\0\0\377\4.B\20\377u" \ + "\251(\377r\244'\377)<\16\377\245\0\0\0\377\2\0\0\0\256\0\0\0\11\300\0" \ + "\0\0\0\2\0\0\0\36\0\0\0\324\246\0\0\0\377\4\22\33\6\377e\222#\377u\251" \ + "(\377Rv\34\377\214\0\0\0\377\2\4\5\1\377Jk\31\377\210u\251(\377\1^\210" \ + "\40\377\211\0\0\0\377\2*=\16\377q\243'\377\215u\251(\377\2u\250(\377" \ + "\30\"\10\377\203\0\0\0\377\2\24\34\7\377X\177\36\377\223u\251(\377\1" \ + "\6\11\2\377\207\0\0\0\377\4\30\"\10\377:T\24\377Z\203\37\377t\247(\377" \ + "\216u\251(\377\2X\177\36\377\3\5\1\377\306\0\0\0\377\2\0\0\0\276\0\0" \ + "\0\15\307\0\0\0\0\2\0\0\0#\0\0\0\341\311\0\0\0\377\2\0\1\0\377Tz\35\377" \ + "\221u\251(\377\4n\236%\377Hh\31\377\37,\13\377\1\2\0\377\203\0\0\0\377" \ + "\2\6\10\2\377o\240&\377\224u\251(\377\4V|\35\377\22\32\6\377\0\0\0\377" \ + "Ca\27\377\220u\251(\377\2Z\203\37\377\12\16\3\377\206\0\0\0\377\2\0\1" \ + "\0\377a\214!\377\211u\251(\377\2l\234%\377\31$\11\377\213\0\0\0\377\1" \ + "%6\15\377\202u\251(\377\2u\250(\3773J\22\377\245\0\0\0\377\2\0\0\0\274" \ + "\0\0\0\16\276\0\0\0\0\2\0\0\0(\0\0\0\337\246\0\0\0\377\2\30#\10\377l" \ + "\234%\377\202u\251(\377\1Ii\31\377\213\0\0\0\377\2\7\13\3\377Z\202\37" \ + "\377\211u\251(\377\2t\250(\377\21\31\6\377\206\0\0\0\377\2\1\1\0\377" \ + "\77[\26\377\220u\251(\377\5a\215!\377\6\11\2\377\6\10\2\377@\\\26\377" \ + "s\246'\377\224u\251(\377\1\"1\14\377\204\0\0\0\377\3\22\33\6\377;U\24" \ + "\377d\220\"\377\221u\251(\377\2m\235%\377\14\22\4\377\310\0\0\0\377\2" \ + "\0\0\0\276\0\0\0\11\305\0\0\0\0\2\0\0\0\16\0\0\0\331\313\0\0\0\377\2" \ + "\16\25\5\377s\246'\377\223u\251(\377\5j\230$\377B_\26\377\31$\10\377" \ + "\0\0\0\377Ca\27\377\226u\251(\377\2r\244'\377Sw\34\377\222u\251(\377" \ + "\2e\222#\377\22\32\6\377\205\0\0\0\377\1(:\16\377\213u\251(\377\2o\241" \ + "&\377\36,\12\377\212\0\0\0\377\1\33'\11\377\204u\251(\377\1:T\24\377" \ + "\245\0\0\0\377\2\0\0\0\326\0\0\0\37\274\0\0\0\0\2\0\0\0G\0\0\0\363\246" \ + "\0\0\0\377\2\34)\12\377o\240&\377\203u\251(\377\1\77[\25\377\212\0\0" \ + "\0\377\2\13\17\4\377_\212!\377\213u\251(\377\1Km\32\377\205\0\0\0\377" \ + "\2\4\6\1\377Or\33\377\222u\251(\377\2\\\205\40\377h\226$\377\226u\251" \ + "(\377\5`\213!\377\6\11\2\377\15\23\4\3775L\22\377^\210\40\377\224u\251" \ + "(\377\1""1F\21\377\312\0\0\0\377\1\0\0\0\250\305\0\0\0\0\1\0\0\0\242" \ + "\251\0\0\0\377\10\21\30\6\377&7\15\3779R\23\377Kl\32\377Ty\35\377_\211" \ + "\40\377h\226$\377q\244'\377\202u\251(\377\1s\246'\377\202m\236%\377\7" \ + "d\221\"\377U{\35\377Gf\30\3778Q\23\377)<\16\377\27!\10\377\4\5\1\377" \ + "\220\0\0\0\377\1Or\33\377\226u\251(\377\1i\230$\377\254u\251(\377\2m" \ + "\235%\377\35*\12\377\203\0\0\0\377\2\15\23\5\377l\234%\377\214u\251(" \ + "\377\2q\244'\377#2\14\377\211\0\0\0\377\1\24\34\7\377\205u\251(\377\2" \ + "@]\26\377\0\1\0\377\244\0\0\0\377\2\0\0\0\341\0\0\0'\272\0\0\0\0\2\0" \ + "\0\0O\0\0\0\367\246\0\0\0\377\2!0\13\377p\242&\377\204u\251(\377\1""7" \ + "P\23\377\211\0\0\0\377\2\15\23\5\377d\220\"\377\215u\251(\377\1(:\16" \ + "\377\203\0\0\0\377\2\12\17\3\377[\204\37\377\254u\251(\377\2j\231$\377" \ + "t\250(\377\225u\251(\377\2m\236%\377\5\7\2\377\217\0\0\0\377\12\1\1\0" \ + "\377\21\30\6\377$4\14\3773J\22\377B_\27\377Qu\34\377`\213!\377l\234%" \ + "\377m\236%\377q\243'\377\202u\251(\377\11t\247(\377j\232$\377a\215!\377" \ + "X\177\36\377Nq\33\377\77[\25\377,@\17\377\27\"\10\377\2\3\1\377\247\0" \ + "\0\0\377\1\0\0\0h\303\0\0\0\0\1\0\0\0E\250\0\0\0\377\2\24\35\7\377j\232" \ + "$\377\223u\251(\377\6t\247(\377d\220\"\377Nq\33\3779S\24\377\35*\12\377" \ + "\4\6\1\377\213\0\0\0\377\1:T\24\377\304u\251(\377\5r\245'\377*=\16\377" \ + "\0\0\0\377\3\5\1\377\\\205\37\377\216u\251(\377\2r\244'\377!/\13\377" \ + "\210\0\0\0\377\1\23\33\6\377\206u\251(\377\1@]\26\377\245\0\0\0\377\2" \ + "\0\0\0\352\0\0\0+\270\0\0\0\0\2\0\0\0X\0\0\0\374\246\0\0\0\377\2\40." \ + "\13\377r\244'\377\205u\251(\377\1""7P\23\377\210\0\0\0\377\2\13\20\4" \ + "\377d\220\"\377\216u\251(\377\5o\241&\377\24\34\7\377\0\0\0\377\22\33" \ + "\6\377e\222#\377\304u\251(\377\1X\177\36\377\213\0\0\0\377\6\1\1\0\377" \ + "\25\36\7\3772H\21\377Hi\31\377]\207\40\377p\242&\377\223u\251(\377\2" \ + "q\244'\3772H\21\377\246\0\0\0\377\2\0\0\0\363\0\0\0\30\301\0\0\0\0\2" \ + "\0\0\0\2\0\0\0\320\251\0\0\0\377\2+>\17\377t\250(\377\227u\251(\377\5" \ + "r\245'\377Y\201\37\377=X\25\377\34)\12\377\1\2\0\377\207\0\0\0\377\1" \ + "=W\25\377\305u\251(\377\3u\250(\377:T\24\377Fe\30\377\220u\251(\377\2" \ + "p\242&\377\35*\12\377\207\0\0\0\377\1\34)\12\377\207u\251(\377\1;U\24" \ + "\377\245\0\0\0\377\2\0\0\0\351\0\0\0*\266\0\0\0\0\2\0\0\0P\0\0\0\372" \ + "\246\0\0\0\377\2\34(\11\377p\242&\377\206u\251(\377\1@]\26\377\207\0" \ + "\0\0\377\2\11\15\3\377a\214!\377\220u\251(\377\3d\220\"\377$4\14\377" \ + "m\236%\377\305u\251(\377\1`\213!\377\210\0\0\0\377\4\21\31\6\3774K\22" \ + "\377Qu\34\377m\235%\377\230u\251(\377\2Mo\32\377\1\2\0\377\247\0\0\0" \ + "\377\1\0\0\0\224\301\0\0\0\0\1\0\0\0>\253\0\0\0\377\2-B\20\377u\250(" \ + "\377\232u\251(\377\4l\234%\377Kl\32\377'8\15\377\6\11\2\377\203\0\0\0" \ + "\377\2\4\6\1\377f\223#\377\331u\251(\377\2o\240&\377\26\37\7\377\206" \ + "\0\0\0\377\1""1F\21\377\210u\251(\377\1""5L\22\377\245\0\0\0\377\2\0" \ + "\0\0\340\0\0\0\37\264\0\0\0\0\2\0\0\0E\0\0\0\367\246\0\0\0\377\2\27\"" \ + "\10\377n\237&\377\207u\251(\377\1Ty\35\377\206\0\0\0\377\2\5\7\2\377" \ + "\\\205\40\377\331u\251(\377\2u\250(\377\31$\10\377\203\0\0\0\377\4\1" \ + "\2\0\377\34)\12\377@\\\26\377c\217\"\377\233u\251(\377\2Os\33\377\2\3" \ + "\1\377\250\0\0\0\377\2\0\0\0\365\0\0\0\15\300\0\0\0\0\1\0\0\0\227\254" \ + "\0\0\0\377\2""0F\20\377u\250(\377\234u\251(\377\5r\245'\377V|\35\377" \ + "2I\21\377\22\32\6\377Or\33\377\333u\251(\377\2h\226$\377\14\22\4\377" \ + "\205\0\0\0\377\1Z\202\37\377\210u\251(\377\2u\250(\377/D\20\377\245\0" \ + "\0\0\377\2\0\0\0\335\0\0\0\30\262\0\0\0\0\2\0\0\0<\0\0\0\365\246\0\0" \ + "\0\377\2\24\34\7\377l\234%\377\210u\251(\377\2s\246'\377\13\20\4\377" \ + "\204\0\0\0\377\2\1\1\0\377Ps\33\377\333u\251(\377\5f\223#\377\26\40\10" \ + "\377'9\15\377Kl\32\377l\234%\377\235u\251(\377\2Rv\34\377\3\4\1\377\252" \ + "\0\0\0\377\1\0\0\0[\300\0\0\0\0\1\0\0\0\351\255\0\0\0\377\1""3J\21\377" \ + "\375u\251(\377\2_\211\40\377\5\7\2\377\203\0\0\0\377\1\40.\13\377\212" \ + "u\251(\377\2t\250(\377*<\16\377\245\0\0\0\377\2\0\0\0\314\0\0\0\14\260" \ + "\0\0\0\0\2\0\0\0(\0\0\0\355\246\0\0\0\377\2\21\30\6\377j\230$\377\212" \ + "u\251(\377\1Db\27\377\204\0\0\0\377\1@]\26\377\375u\251(\377\2Ty\35\377" \ + "\3\5\1\377\253\0\0\0\377\1\0\0\0\257\277\0\0\0\0\1\0\0\0\40\257\0\0\0" \ + "\377\1""6N\22\377\375u\251(\377\1Lm\32\377\202\0\0\0\377\2\16\24\5\377" \ + "k\232%\377\213u\251(\377\2s\246'\377%5\15\377\245\0\0\0\377\2\0\0\0\277" \ + "\0\0\0\7\256\0\0\0\0\2\0\0\0\35\0\0\0\345\246\0\0\0\377\2\15\23\5\377" \ + "g\224#\377\214u\251(\377\1'9\15\377\202\0\0\0\377\1(:\16\377\375u\251" \ + "(\377\2V}\35\377\4\6\1\377\254\0\0\0\377\1\0\0\0\343\277\0\0\0\0\1\0" \ + "\0\0N\260\0\0\0\377\1""8R\23\377\375u\251(\377\3""2H\21\377\31$\10\377" \ + "i\230$\377\215u\251(\377\2r\244'\377\34)\12\377\245\0\0\0\377\2\0\0\0" \ + "\246\0\0\0\1\254\0\0\0\0\2\0\0\0\20\0\0\0\324\246\0\0\0\377\2\10\14\3" \ + "\377b\216\"\377\215u\251(\377\4s\246'\3773J\21\377\23\33\6\377o\241&" \ + "\377\374u\251(\377\2X\177\36\377\5\7\2\377\256\0\0\0\377\1\0\0\0\23\276" \ + "\0\0\0\0\1\0\0\0l\261\0\0\0\377\1Z" \ + "\25\377\77[\25\377Jk\31\377X\177\36\377j\232$\377\377u\251(\377\217u" \ + "\251(\377\2_\211\40\377\6\11\2\377\212\0\0\0\377\3h\226#\377u\250(\377" \ + "1F\21\377\227\0\0\0\377\2\0\0\0\350\0\0\0\32\250\0\0\0\0\2\0\0\0E\0\0" \ + "\0\375\230\0\0\0\377\4\25\36\7\377l\234%\377u\251(\377\27!\10\377\212" \ + "\0\0\0\377\1A^\26\377\377u\251(\377\217u\251(\377\14p\242&\377\\\205" \ + "\37\377Nq\33\377A^\26\377>Z\25\377:T\24\3777O\23\3772I\21\377/D\20\377" \ + "+>\17\377'8\15\377$4\14\377\206\37-\13\377\1\36,\12\377\207\27\"\10\377" \ + "\1\21\31\6\377\206\20\27\5\377\1\6\11\2\377\220\0\0\0\377\1\0\0\0D\276" \ + "\0\0\0\0\1\0\0\0p\222\0\0\0\377\1Np\33\377\377u\251(\377\260u\251(\377" \ + "\2Y\200\36\377\3\5\1\377\210\0\0\0\377\1\16\25\5\377\202u\251(\377\2" \ + "u\250(\3771F\21\377\227\0\0\0\377\2\0\0\0\311\0\0\0\7\246\0\0\0\0\2\0" \ + "\0\0\"\0\0\0\356\230\0\0\0\377\2\27!\10\377n\236%\377\202u\251(\377\1" \ + "2H\21\377\211\0\0\0\377\1""7P\23\377\377u\251(\377\260u\251(\377\2j\230" \ + "$\377\11\15\3\377\220\0\0\0\377\1\0\0\0""5\276\0\0\0\0\1\0\0\0X\222\0" \ + "\0\0\377\2\13\17\4\377k\232%\377\377u\251(\377\260u\251(\377\2Ij\31\377" \ + "\0\1\0\377\207\0\0\0\377\1(:\16\377\203u\251(\377\2t\247(\377)<\16\377" \ + "\227\0\0\0\377\1\0\0\0\215\245\0\0\0\0\2\0\0\0\5\0\0\0\307\230\0\0\0" \ + "\377\2\21\30\6\377i\230$\377\203u\251(\377\1Ln\32\377\210\0\0\0\377\2" \ + "'8\15\377t\250(\377\377u\251(\377\260u\251(\377\1%5\15\377\221\0\0\0" \ + "\377\1\0\0\0\36\276\0\0\0\0\1\0\0\0>\223\0\0\0\377\1$4\14\377\377u\251" \ + "(\377\261u\251(\377\1\17" \ + "\377u\250(\377\211u\251(\377\4""6N\22\377\0\0\0\377\2\3\1\377Ty\35\377" \ + "\377u\251(\377\261u\251(\377\2d\220\"\377\4\6\1\377\222\0\0\0\377\2\0" \ + "\0\0\366\0\0\0\16\300\0\0\0\0\2\0\0\0\2\0\0\0\343\224\0\0\0\377\2\6\11" \ + "\2\377g\225#\377\377u\251(\377\261u\251(\377\3d\220\"\377\13\20\4\377" \ + "W}\36\377\213u\251(\377\1:T\24\377\226\0\0\0\377\1\0\0\0\264\235\0\0" \ + "\0\0\2\0\0\0\17\0\0\0\345\227\0\0\0\377\2\32&\11\377r\244'\377\212u\251" \ + "(\377\3n\236%\377\17\25\5\377Hg\30\377\377u\251(\377\261u\251(\377\2" \ + "t\250(\377\34(\11\377\223\0\0\0\377\1\0\0\0\254\302\0\0\0\0\1\0\0\0\215" \ + "\225\0\0\0\377\1%5\15\377\377u\251(\377\262u\251(\377\1o\240&\377\214" \ + "u\251(\377\2t\250(\377\40.\13\377\226\0\0\0\377\1\0\0\0N\234\0\0\0\0" \ + "\1\0\0\0\216\227\0\0\0\377\2\11\15\3\377h\226#\377\214u\251(\377\1o\240" \ + "&\377\377u\251(\377\262u\251(\377\1Gg\30\377\224\0\0\0\377\1\0\0\0R\302" \ + "\0\0\0\0\2\0\0\0\30\0\0\0\366\225\0\0\0\377\1Qu\34\377\377u\251(\377" \ + "\277u\251(\377\2m\236%\377\17\26\5\377\225\0\0\0\377\2\0\0\0\347\0\0" \ + "\0\21\232\0\0\0\0\2\0\0\0;\0\0\0\375\226\0\0\0\377\2\2\3\1\377X\177\36" \ + "\377\377u\251(\377\277u\251(\377\2k\233%\377\10\13\3\377\223\0\0\0\377" \ + "\2\0\0\0\324\0\0\0\1\303\0\0\0\0\1\0\0\0\233\225\0\0\0\377\2\21\31\6" \ + "\377r\244'\377\377u\251(\377\277u\251(\377\2[\203\37\377\2\3\1\377\225" \ + "\0\0\0\377\1\0\0\0\220\231\0\0\0\0\2\0\0\0\2\0\0\0\314\227\0\0\0\377" \ + "\1:T\24\377\377u\251(\377\300u\251(\377\1""1G\21\377\224\0\0\0\377\1" \ + "\0\0\0b\304\0\0\0\0\1\0\0\0D\226\0\0\0\377\1C`\27\377\377u\251(\377\300" \ + "u\251(\377\1Dc\27\377\225\0\0\0\377\2\0\0\0\372\0\0\0(\230\0\0\0\0\1" \ + "\0\0\0b\227\0\0\0\377\2%5\15\377u\250(\377\377u\251(\377\277u\251(\377" \ + "\2c\217\"\377\1\2\0\377\223\0\0\0\377\2\0\0\0\373\0\0\0\17\303\0\0\0" \ + "\0\2\0\0\0\3\0\0\0\311\226\0\0\0\377\2\13\20\4\377p\242&\377\377u\251" \ + "(\377\300u\251(\377\1+>\17\377\225\0\0\0\377\1\0\0\0\275\227\0\0\0\0" \ + "\2\0\0\0\20\0\0\0\352\226\0\0\0\377\2\17\26\5\377m\236%\377\377u\251" \ + "(\377\300u\251(\377\1+>\17\377\225\0\0\0\377\1\0\0\0\220\303\0\0\0\0" \ + "\1\0\0\0o\230\0\0\0\377\1Ca\27\377\377u\251(\377\300u\251(\377\2n\237" \ + "&\377\16\24\5\377\225\0\0\0\377\1\0\0\0L\226\0\0\0\0\1\0\0\0\215\226" \ + "\0\0\0\377\2\1\1\0\377X\177\36\377\377u\251(\377\300u\251(\377\2d\220" \ + "\"\377\2\3\1\377\225\0\0\0\377\2\0\0\0\375\0\0\0:\301\0\0\0\0\2\0\0\0" \ + "\27\0\0\0\361\230\0\0\0\377\2\14\21\4\377r\245'\377\377u\251(\377\300" \ + "u\251(\377\2Z\202\37\377\1\1\0\377\224\0\0\0\377\2\0\0\0\324\0\0\0\3" \ + "\224\0\0\0\0\2\0\0\0!\0\0\0\370\226\0\0\0\377\1""6N\22\377\377u\251(" \ + "\377\301u\251(\377\1-A\17\377\227\0\0\0\377\2\0\0\0\313\0\0\0\1\300\0" \ + "\0\0\0\1\0\0\0\233\232\0\0\0\377\1Km\32\377\377u\251(\377\301u\251(\377" \ + "\1""2I\21\377\225\0\0\0\377\1\0\0\0b\224\0\0\0\0\1\0\0\0\244\226\0\0" \ + "\0\377\2\24\34\7\377r\244'\377\377u\251(\377\300u\251(\377\2j\231$\377" \ + "\3\5\1\377\230\0\0\0\377\1\0\0\0`\277\0\0\0\0\2\0\0\0-\0\0\0\374\232" \ + "\0\0\0\377\1\27!\10\377\377u\251(\377\301u\251(\377\2p\242&\377\21\31" \ + "\6\377\224\0\0\0\377\2\0\0\0\340\0\0\0\7\222\0\0\0\0\2\0\0\0.\0\0\0\375" \ + "\225\0\0\0\377\2\2\3\1\377^\210\40\377\377u\251(\377\301u\251(\377\1" \ + ";U\24\377\231\0\0\0\377\2\0\0\0\344\0\0\0\12\276\0\0\0\0\1\0\0\0\246" \ + "\234\0\0\0\377\1\\\205\40\377\377u\251(\377\301u\251(\377\2X\177\36\377" \ + "\1\1\0\377\224\0\0\0\377\1\0\0\0f\222\0\0\0\0\1\0\0\0\250\226\0\0\0\377" \ + "\1""5L\22\377\377u\251(\377\301u\251(\377\2t\247(\377\14\22\4\377\232" \ + "\0\0\0\377\1\0\0\0k\275\0\0\0\0\2\0\0\0\26\0\0\0\371\234\0\0\0\377\1" \ + "1F\21\377\377u\251(\377\302u\251(\377\1""5L\22\377\224\0\0\0\377\2\0" \ + "\0\0\342\0\0\0\7\220\0\0\0\0\2\0\0\0/\0\0\0\375\225\0\0\0\377\2\25\36" \ + "\7\377r\245'\377\377u\251(\377\301u\251(\377\1Ty\35\377\233\0\0\0\377" \ + "\1\0\0\0\323\275\0\0\0\0\1\0\0\0|\235\0\0\0\377\2\12\17\3\377s\246'\377" \ + "\377u\251(\377\301u\251(\377\2p\242&\377\20\27\5\377\224\0\0\0\377\1" \ + "\0\0\0l\220\0\0\0\0\1\0\0\0\256\225\0\0\0\377\2\1\1\0\377[\204\37\377" \ + "\377u\251(\377\302u\251(\377\1,\77\17\377\234\0\0\0\377\1\0\0\0@\274" \ + "\0\0\0\0\1\0\0\0\327\236\0\0\0\377\1Rw\34\377\377u\251(\377\302u\251" \ + "(\377\1U{\35\377\224\0\0\0\377\2\0\0\0\335\0\0\0\4\216\0\0\0\0\2\0\0" \ + "\0(\0\0\0\375\225\0\0\0\377\1""1F\21\377\377u\251(\377\302u\251(\377" \ + "\2o\241&\377\5\7\2\377\234\0\0\0\377\1\0\0\0\233\273\0\0\0\0\1\0\0\0" \ + "\35\237\0\0\0\377\1-@\17\377\377u\251(\377\303u\251(\377\1\"2\14\377" \ + "\224\0\0\0\377\1\0\0\0\\\216\0\0\0\0\1\0\0\0\237\225\0\0\0\377\2\10\14" \ + "\3\377l\234%\377\377u\251(\377\302u\251(\377\1Qu\34\377\235\0\0\0\377" \ + "\1\0\0\0\340\273\0\0\0\0\1\0\0\0Q\237\0\0\0\377\2\13\20\4\377u\250(\377" \ + "\377u\251(\377\302u\251(\377\2g\225#\377\5\7\2\377\223\0\0\0\377\2\0" \ + "\0\0\330\0\0\0\2\214\0\0\0\0\2\0\0\0$\0\0\0\374\225\0\0\0\377\1Gg\30" \ + "\377\377u\251(\377\303u\251(\377\1/D\20\377\236\0\0\0\377\1\0\0\0\25" \ + "\272\0\0\0\0\1\0\0\0t\240\0\0\0\377\1`\213!\377\252u\251(\377\4q\244" \ + "'\377_\211\40\377\\\205\40\377u\250(\377\377u\251(\377\225u\251(\377" \ + "\1""8R\23\377\224\0\0\0\377\1\0\0\0L\214\0\0\0\0\1\0\0\0\217\225\0\0" \ + "\0\377\2\26\40\10\377t\247(\377\377u\251(\377\225u\251(\377\3g\225#\377" \ + "X\177\36\377l\234%\377\253u\251(\377\1\17\26\5\377\236\0\0\0\377\1\0" \ + "\0\0:\272\0\0\0\0\1\0\0\0\202\240\0\0\0\377\1>Y\25\377\254u\251(\377" \ + "\5g\225#\377;U\24\3774L\22\377Z\202\37\377u\250(\377\377u\251(\377\222" \ + "u\251(\377\2q\244'\377\20\27\5\377\223\0\0\0\377\1\0\0\0\277\213\0\0" \ + "\0\0\2\0\0\0\20\0\0\0\363\224\0\0\0\377\2\1\1\0\377^\207\40\377\377u" \ + "\251(\377\223u\251(\377\4f\224#\377;U\24\377,\77\17\377V|\35\377\254" \ + "u\251(\377\1c\216\"\377\237\0\0\0\377\1\0\0\0H\272\0\0\0\0\1\0\0\0\206" \ + "\222\0\0\0\377\7\31$\11\3778R\23\377-A\17\377$4\14\377\32&\11\377\21" \ + "\30\6\377\6\11\2\377\206\0\0\0\377\2\12\16\3\377Ca\27\377\256u\251(\377" \ + "\5]\207\40\377\40.\13\377\26\37\7\377\77[\25\377h\226#\377\377u\251(" \ + "\377\221u\251(\377\1Nq\33\377\223\0\0\0\377\2\0\0\0\376\0\0\0-\212\0" \ + "\0\0\0\1\0\0\0o\225\0\0\0\377\1,\77\17\377\377u\251(\377\221u\251(\377" \ + "\6p\242&\377Km\32\377\"2\14\377\22\32\6\377Kl\32\377t\250(\377\255u\251" \ + "(\377\3^\210\40\377\22\33\6\377\1\1\0\377\205\0\0\0\377\7\4\6\1\377\15" \ + "\23\5\377\26\40\10\377!0\13\377+>\17\3774L\22\377,@\17\377\221\0\0\0" \ + "\377\1\0\0\0K\272\0\0\0\0\1\0\0\0s\222\0\0\0\377\2\10\13\3\377n\236%" \ + "\377\205u\251(\377\2s\246'\377j\231$\377\202e\222#\377\2l\234%\377o\240" \ + "&\377\262u\251(\377\6X\177\36\377\32&\11\377\1\1\0\377\34)\12\377Fe\30" \ + "\377n\236%\377\377u\251(\377\217u\251(\377\1\34(\11\377\223\0\0\0\377" \ + "\1\0\0\0\240\211\0\0\0\0\2\0\0\0\4\0\0\0\340\224\0\0\0\377\2\4\6\1\377" \ + "j\230$\377\377u\251(\377\216u\251(\377\7t\247(\377Sx\34\377);\16\377" \ + "\5\7\2\377\13\21\4\377Dc\27\377s\246'\377\261u\251(\377\6q\244'\377m" \ + "\236%\377g\224#\377e\222#\377h\226#\377p\242&\377\206u\251(\377\1%5\15" \ + "\377\221\0\0\0\377\1\0\0\0""7\272\0\0\0\0\1\0\0\0U\223\0\0\0\377\1""8" \ + "Q\23\377\277u\251(\377\7Qu\34\377\25\36\7\377\0\0\0\377\4\5\1\377(:\16" \ + "\377Sx\34\377s\246'\377\377u\251(\377\214u\251(\377\1V}\35\377\223\0" \ + "\0\0\377\2\0\0\0\366\0\0\0\20\210\0\0\0\0\1\0\0\0I\225\0\0\0\377\1""3" \ + "J\22\377\377u\251(\377\215u\251(\377\7`\213!\3775L\22\377\13\20\4\377" \ + "\0\0\0\377\10\14\3\377>Z\25\377p\242&\377\276u\251(\377\2[\204\37\377" \ + "\0\1\0\377\221\0\0\0\377\1\0\0\0\32\272\0\0\0\0\1\0\0\0#\223\0\0\0\377" \ + "\2\3\4\1\377d\220\"\377\300u\251(\377\2V|\35\377\25\36\7\377\202\0\0" \ + "\0\377\4\7\13\3\377/D\20\377Z\202\37\377u\250(\377\377u\251(\377\212" \ + "u\251(\377\1\36+\12\377\223\0\0\0\377\1\0\0\0m\210\0\0\0\0\1\0\0\0\256" \ + "\224\0\0\0\377\2\6\10\2\377l\234%\377\377u\251(\377\212u\251(\377\3f" \ + "\223#\377;U\24\377\22\32\6\377\202\0\0\0\377\3\7\13\3\377>Z\25\377p\242" \ + "&\377\277u\251(\377\2t\247(\377\27!\10\377\221\0\0\0\377\1\0\0\0\345" \ + "\273\0\0\0\0\2\0\0\0\2\0\0\0\347\223\0\0\0\377\1$4\14\377\301u\251(\377" \ + "\3s\246'\377Ec\30\377\13\20\4\377\203\0\0\0\377\3\26\40\10\377B_\26\377" \ + "k\232%\377\377u\251(\377\210u\251(\377\1V}\35\377\223\0\0\0\377\1\0\0" \ + "\0\313\207\0\0\0\0\2\0\0\0\24\0\0\0\371\224\0\0\0\377\1""3J\22\377\377" \ + "u\251(\377\210u\251(\377\4r\244'\377Nq\33\377#3\14\377\2\3\1\377\202" \ + "\0\0\0\377\3\3\4\1\3772H\21\377j\232$\377\301u\251(\377\1Hg\30\377\222" \ + "\0\0\0\377\1\0\0\0\253\274\0\0\0\0\1\0\0\0\225\224\0\0\0\377\1Or\33\377" \ + "\302u\251(\377\3p\242&\377Z\25\377\22\33\6\377\204\0\0\0\377\3\0\1\0\377'8\15\377" \ + "c\216\"\377\303u\251(\377\2u\250(\377\37,\13\377\222\0\0\0\377\2\0\0" \ + "\0\363\0\0\0\20\275\0\0\0\0\1\0\0\0\312\224\0\0\0\377\2\37-\13\377s\246" \ + "'\377\304u\251(\377\3f\223#\377*<\16\377\1\1\0\377\204\0\0\0\377\4\0" \ + "\1\0\377\36+\12\377Km\32\377q\244'\377\377u\251(\377\202u\251(\377\1" \ + "\34(\12\377\222\0\0\0\377\2\0\0\0\355\0\0\0\7\204\0\0\0\0\1\0\0\0""7" \ + "\224\0\0\0\377\2\5\7\2\377j\231$\377\377u\251(\377\5u\251(\377u\250(" \ + "\377Y\201\36\377+>\17\377\5\7\2\377\205\0\0\0\377\2\27\"\10\377V|\35" \ + "\377\305u\251(\377\1A]\26\377\223\0\0\0\377\1\0\0\0\220\276\0\0\0\0\1" \ + "\0\0\0[\225\0\0\0\377\1""3J\21\377\306u\251(\377\2_\211\40\377!0\13\377" \ + "\206\0\0\0\377\3\10\13\3\3772H\21\377_\212!\377\377u\251(\377\1U{\35" \ + "\377\223\0\0\0\377\1\0\0\0S\204\0\0\0\0\1\0\0\0\225\224\0\0\0\377\1""2" \ + "H\21\377\377u\251(\377\3j\232$\377\77[\25\377\22\32\6\377\206\0\0\0\377" \ + "\3\21\30\6\377Mo\32\377u\250(\377\305u\251(\377\2Tz\35\377\1\2\0\377" \ + "\222\0\0\0\377\2\0\0\0\372\0\0\0#\276\0\0\0\0\2\0\0\0\2\0\0\0\321\225" \ + "\0\0\0\377\1=X\25\377\307u\251(\377\2\\\205\37\377\35*\12\377\207\0\0" \ + "\0\377\3\23\33\6\377>Z\25\377m\236%\377\375u\251(\377\1\26\40\10\377" \ + "\222\0\0\0\377\1\0\0\0\263\203\0\0\0\0\2\0\0\0\10\0\0\0\356\223\0\0\0" \ + "\377\2\2\3\1\377g\224#\377\374u\251(\377\4t\247(\377Nq\33\377\37-\13" \ + "\377\1\1\0\377\206\0\0\0\377\3\17\26\5\377Nq\33\377t\250(\377\306u\251" \ + "(\377\2Y\201\37\377\5\7\2\377\223\0\0\0\377\1\0\0\0\227\300\0\0\0\0\1" \ + "\0\0\0J\225\0\0\0\377\2\0\1\0\377Ii\31\377\307u\251(\377\3u\250(\377" \ + "Nq\33\377\21\31\6\377\207\0\0\0\377\3\10\14\3\3774L\22\377d\220\"\377" \ + "\373u\251(\377\1Hg\30\377\222\0\0\0\377\2\0\0\0\371\0\0\0\17\202\0\0" \ + "\0\0\1\0\0\0L\224\0\0\0\377\1&6\15\377\373u\251(\377\3n\236%\377B_\27" \ + "\377\23\33\6\377\207\0\0\0\377\3\6\11\2\377;U\24\377o\241&\377\307u\251" \ + "(\377\2c\216\"\377\12\16\3\377\223\0\0\0\377\2\0\0\0\364\0\0\0\32\301" \ + "\0\0\0\0\1\0\0\0\246\225\0\0\0\377\2\2\3\1\377Pt\33\377\310u\251(\377" \ + "\3s\246'\377Ca\27\377\12\16\3\377\207\0\0\0\377\4\0\1\0\377\37,\13\377" \ + "Nq\33\377s\246'\377\370u\251(\377\2q\244'\377\12\17\3\377\222\0\0\0\377" \ + "\1\0\0\0]\202\0\0\0\0\1\0\0\0\237\224\0\0\0\377\1Y\201\37\377\371u\251" \ + "(\377\3]\206\40\377-A\17\377\5\7\2\377\207\0\0\0\377\3\2\3\1\3770E\20" \ + "\377j\232$\377\310u\251(\377\2g\225#\377\15\23\5\377\224\0\0\0\377\1" \ + "\0\0\0l\302\0\0\0\0\2\0\0\0\24\0\0\0\352\225\0\0\0\377\2\3\5\1\377Ps" \ + "\33\377\311u\251(\377\3n\237&\3777P\23\377\4\6\1\377\210\0\0\0\377\3" \ + "\13\21\4\3779R\23\377h\226$\377\367u\251(\377\1""5M\22\377\222\0\0\0" \ + "\377\4\0\0\0\256\0\0\0\0\0\0\0\4\0\0\0\354\223\0\0\0\377\1\24\34\7\377" \ + "\367u\251(\377\3p\242&\377Hg\30\377\27\"\10\377\211\0\0\0\377\2$4\14" \ + "\377c\216\"\377\311u\251(\377\2e\222#\377\21\30\6\377\224\0\0\0\377\2" \ + "\0\0\0\303\0\0\0\2\303\0\0\0\0\1\0\0\0Z\226\0\0\0\377\2\0\1\0\377;U\24" \ + "\377\312u\251(\377\3l\234%\3773J\21\377\2\3\1\377\210\0\0\0\377\4\1\1" \ + "\0\377\37-\13\377Rw\34\377u\250(\377\364u\251(\377\2d\220\"\377\0\1\0" \ + "\377\221\0\0\0\377\3\0\0\0\363\0\0\0\10\0\0\0>\224\0\0\0\377\1B_\27\377" \ + "\365u\251(\377\3b\215!\377/D\20\377\6\11\2\377\211\0\0\0\377\2\35*\12" \ + "\377]\206\40\377\312u\251(\377\2Y\201\36\377\10\14\3\377\224\0\0\0\377" \ + "\2\0\0\0\365\0\0\0*\305\0\0\0\0\1\0\0\0\224\227\0\0\0\377\2""6N\22\377" \ + "u\250(\377\312u\251(\377\2_\211\40\377\37-\13\377\212\0\0\0\377\3\26" \ + "\40\10\377Hi\31\377q\244'\377\363u\251(\377\1\33&\11\377\222\0\0\0\377" \ + "\2\0\0\0P\0\0\0\221\223\0\0\0\377\2\2\3\1\377k\232%\377\363u\251(\377" \ + "\3X\177\36\377&6\15\377\1\2\0\377\211\0\0\0\377\3\17\26\5\377Mo\32\377" \ + "u\250(\377\312u\251(\377\2Ty\35\377\6\10\2\377\225\0\0\0\377\1\0\0\0" \ + "V\306\0\0\0\0\2\0\0\0\11\0\0\0\331\227\0\0\0\377\2&7\15\377p\242&\377" \ + "\313u\251(\377\2Ty\35\377\24\35\7\377\212\0\0\0\377\3\12\16\3\3778Q\23" \ + "\377h\226$\377\361u\251(\377\1Gg\30\377\222\0\0\0\377\2\0\0\0\236\0\0" \ + "\0\337\223\0\0\0\377\1%5\15\377\361u\251(\377\3q\243'\377Gg\30\377\25" \ + "\36\7\377\212\0\0\0\377\3\10\13\3\377@]\26\377r\244'\377\313u\251(\377" \ + "\2Ca\27\377\2\3\1\377\225\0\0\0\377\1\0\0\0\251\307\0\0\0\0\2\0\0\0\7" \ + "\0\0\0\353\230\0\0\0\377\2\27\"\10\377i\227$\377\313u\251(\377\3t\247" \ + "(\377Hg\30\377\14\21\4\377\212\0\0\0\377\3\2\3\1\377'9\15\377Z\203\37" \ + "\377\357u\251(\377\2m\235%\377\2\3\1\377\221\0\0\0\377\1\0\0\0\370\224" \ + "\0\0\0\377\1Mo\32\377\357u\251(\377\3h\226$\3777O\23\377\11\15\3\377" \ + "\212\0\0\0\377\3\3\5\1\3774L\22\377m\235%\377\313u\251(\377\2s\246'\377" \ + "1F\21\377\227\0\0\0\377\1\0\0\0\270\307\0\0\0\0\1\0\0\0Z\232\0\0\0\377" \ + "\2\14\22\4\377^\207\40\377\314u\251(\377\3p\242&\3779R\23\377\4\6\1\377" \ + "\213\0\0\0\377\3\34(\11\377Rv\34\377u\250(\377\355u\251(\377\1!0\13\377" \ + "\245\0\0\0\377\2\5\7\2\377p\242&\377\355u\251(\377\3a\215!\377,\77\17" \ + "\377\3\4\1\377\213\0\0\0\377\2%6\15\377e\222#\377\314u\251(\377\2n\236" \ + "%\377\40.\13\377\230\0\0\0\377\2\0\0\0\376\0\0\0#\306\0\0\0\0\1\0\0\0" \ + "\273\233\0\0\0\377\2\3\5\1\377Jk\31\377\315u\251(\377\3j\230$\377/D\20" \ + "\377\1\1\0\377\213\0\0\0\377\3\17\26\5\377C`\27\377p\242&\377\353u\251" \ + "(\377\1Kl\32\377\245\0\0\0\377\1(:\16\377\353u\251(\377\3u\250(\377R" \ + "w\34\377\34(\11\377\214\0\0\0\377\2\32&\11\377]\206\40\377\315u\251(" \ + "\377\2b\215!\377\20\27\5\377\232\0\0\0\377\1\0\0\0\177\305\0\0\0\0\2" \ + "\0\0\0\15\0\0\0\373\234\0\0\0\377\2\0\1\0\377A^\26\377\316u\251(\377" \ + "\2X\177\36\377\26\40\10\377\214\0\0\0\377\3\15\23\5\377A^\26\377o\241" \ + "&\377\351u\251(\377\2m\235%\377\2\3\1\377\244\0\0\0\377\1Ln\32\377\351" \ + "u\251(\377\3u\250(\377Rv\34\377\33'\11\377\214\0\0\0\377\3\11\15\3\377" \ + "Dc\27\377s\246'\377\315u\251(\377\2]\206\40\377\10\14\3\377\233\0\0\0" \ + "\377\1\0\0\0\314\305\0\0\0\0\1\0\0\0\77\236\0\0\0\377\2\0\1\0\377Ca\27" \ + "\377\316u\251(\377\3t\247(\377Fe\30\377\12\16\3\377\214\0\0\0\377\3\10" \ + "\13\3\3779R\23\377k\232%\377\350u\251(\377\1\34(\11\377\243\0\0\0\377" \ + "\2\1\2\0\377l\234%\377\347u\251(\377\3r\245'\377Ii\31\377\23\34\7\377" \ + "\214\0\0\0\377\3\2\3\1\3772H\21\377m\235%\377\316u\251(\377\2_\211\40" \ + "\377\10\13\3\377\234\0\0\0\377\2\0\0\0\373\0\0\0\10\304\0\0\0\0\1\0\0" \ + "\0d\237\0\0\0\377\2\0\1\0\377Jk\31\377\317u\251(\377\3n\236%\3774L\22" \ + "\377\2\3\1\377\214\0\0\0\377\3\4\6\1\3772H\21\377h\226#\377\346u\251" \ + "(\377\1=X\25\377\243\0\0\0\377\1\32&\11\377\346u\251(\377\3q\243'\377" \ + "Ca\27\377\15\23\5\377\215\0\0\0\377\2\40.\13\377a\215!\377\317u\251(" \ + "\377\2e\222#\377\12\16\3\377\236\0\0\0\377\1\0\0\0*\304\0\0\0\0\1\0\0" \ + "\0y\240\0\0\0\377\2\4\6\1\377d\220\"\377\320u\251(\377\2c\217\"\377\"" \ + "1\14\377\215\0\0\0\377\3\3\4\1\377-B\20\377d\220\"\377\344u\251(\377" \ + "\1_\211\40\377\243\0\0\0\377\1;U\24\377\344u\251(\377\3o\240&\377>Y\25" \ + "\377\12\17\3\377\215\0\0\0\377\2\21\30\6\377Qu\34\377\320u\251(\377\2" \ + "t\250(\377\27\"\10\377\237\0\0\0\377\1\0\0\0>\304\0\0\0\0\1\0\0\0\200" \ + "\222\0\0\0\377\2\15\23\4\377\2\3\1\377\215\0\0\0\377\1@]\26\377\322u" \ + "\251(\377\2Sw\34\377\20\27\5\377\215\0\0\0\377\3\1\2\0\377(:\16\377`" \ + "\213!\377\342u\251(\377\2t\250(\377\10\14\3\377\242\0\0\0\377\1Y\200" \ + "\36\377\342u\251(\377\3l\234%\3779S\24\377\7\13\3\377\215\0\0\0\377\3" \ + "\5\7\2\377=Y\25\377r\244'\377\321u\251(\377\2`\213!\377\4\6\1\377\215" \ + "\0\0\0\377\1\17\26\5\377\221\0\0\0\377\1\0\0\0D\304\0\0\0\0\1\0\0\0s" \ + "\222\0\0\0\377\5\34(\11\377n\236%\377Nq\33\377,@\17\377\13\17\4\377\207" \ + "\0\0\0\377\3\0\1\0\377\35*\12\377Ty\35\377\324u\251(\377\3q\244'\377" \ + ";U\24\377\4\6\1\377\215\0\0\0\377\3\0\1\0\377$4\14\377\\\205\37\377\341" \ + "u\251(\377\1#2\14\377\241\0\0\0\377\2\3\5\1\377q\244'\377\340u\251(\377" \ + "\3i\230$\3774L\22\377\5\7\2\377\216\0\0\0\377\2&7\15\377g\225#\377\324" \ + "u\251(\377\3e\222#\377+>\17\377\4\6\1\377\207\0\0\0\377\5\4\6\1\377!" \ + "0\13\377Db\27\377e\222#\377@\\\26\377\221\0\0\0\377\1\0\0\0""7\304\0" \ + "\0\0\0\1\0\0\0U\223\0\0\0\377\1Ps\33\377\203u\251(\377\10f\224#\377P" \ + "s\33\377B_\26\3778P\23\3777O\23\3779S\24\377Mo\32\377e\222#\377\330u" \ + "\251(\377\2f\223#\377$4\14\377\217\0\0\0\377\2\37-\13\377Z\202\37\377" \ + "\337u\251(\377\1>Y\25\377\241\0\0\0\377\1\33'\11\377\337u\251(\377\3" \ + "h\226$\3770F\20\377\3\5\1\377\216\0\0\0\377\2\22\32\6\377U{\35\377\330" \ + "u\251(\377\3m\236%\377Sx\34\377>Y\25\377\2027O\23\377\4>Y\25\377Kl\32" \ + "\377_\212!\377s\246'\377\202u\251(\377\2l\234%\377\7\13\3\377\221\0\0" \ + "\0\377\1\0\0\0\32\304\0\0\0\0\1\0\0\0!\223\0\0\0\377\2\21\31\6\377s\246" \ + "'\377\344u\251(\377\2Sx\34\377\20\27\5\377\217\0\0\0\377\2!/\13\377\\" \ + "\205\40\377\335u\251(\377\1X\177\36\377\241\0\0\0\377\1""5M\22\377\335" \ + "u\251(\377\3j\230$\3772I\21\377\4\5\1\377\216\0\0\0\377\3\5\7\2\377>" \ + "Y\25\377r\245'\377\344u\251(\377\1""2I\21\377\221\0\0\0\377\1\0\0\0\345" \ + "\306\0\0\0\0\1\0\0\0\354\223\0\0\0\377\1=Y\25\377\345u\251(\377\3q\244" \ + "'\377\17\377\0\1\0\377\217\0\0\0\377\2\37-\13\377\\\205\40\377\332u\251" \ + "(\377\1\14\22\4\377\240\0\0\0\377\1_\211\40\377\331u\251(\377\3i\230" \ + "$\377/D\20\377\3\4\1\377\217\0\0\0\377\2\25\36\7\377Y\201\36\377\346" \ + "u\251(\377\2o\240&\377\20\27\5\377\222\0\0\0\377\1\0\0\0z\306\0\0\0\0" \ + "\1\0\0\0T\224\0\0\0\377\2\20\27\5\377o\240&\377\347u\251(\377\2Rw\34" \ + "\377\17\25\5\377\217\0\0\0\377\3\1\1\0\377'9\15\377b\215!\377\330u\251" \ + "(\377\1\40.\13\377\237\0\0\0\377\2\1\2\0\377q\243'\377\327u\251(\377" \ + "\3n\236%\3779S\24\377\6\11\2\377\217\0\0\0\377\3\4\6\1\377=X\25\377r" \ + "\245'\377\347u\251(\377\1-A\17\377\222\0\0\0\377\2\0\0\0\374\0\0\0\33" \ + "\306\0\0\0\0\2\0\0\0\6\0\0\0\353\224\0\0\0\377\2(:\16\377u\250(\377\347" \ + "u\251(\377\3p\242&\3777P\23\377\2\3\1\377\217\0\0\0\377\3\1\2\0\377-" \ + "B\20\377h\226$\377\326u\251(\377\1""0F\20\377\237\0\0\0\377\1\15\23\5" \ + "\377\326u\251(\377\3r\244'\377@]\26\377\10\14\3\377\220\0\0\0\377\2\"" \ + "1\14\377e\222#\377\350u\251(\377\1Km\32\377\223\0\0\0\377\1\0\0\0\267" \ + "\310\0\0\0\0\1\0\0\0\225\225\0\0\0\377\1""6N\23\377\351u\251(\377\2e" \ + "\222#\377!0\13\377\220\0\0\0\377\3\2\3\1\377/D\20\377j\232$\377\324u" \ + "\251(\377\1=X\25\377\237\0\0\0\377\1\33&\11\377\324u\251(\377\3s\246" \ + "'\377C`\27\377\12\16\3\377\220\0\0\0\377\2\17\26\5\377Sw\34\377\351u" \ + "\251(\377\2U{\35\377\2\3\1\377\223\0\0\0\377\1\0\0\0X\310\0\0\0\0\2\0" \ + "\0\0\33\0\0\0\365\225\0\0\0\377\1Db\27\377\352u\251(\377\2Rw\34\377\15" \ + "\23\5\377\220\0\0\0\377\3\6\10\2\3777O\23\377o\240&\377\322u\251(\377" \ + "\1Ij\31\377\237\0\0\0\377\1'8\15\377\322u\251(\377\3u\250(\377Nq\33\377" \ + "\22\32\6\377\220\0\0\0\377\3\3\5\1\377;U\24\377q\243'\377\351u\251(\377" \ + "\2`\213!\377\6\11\2\377\223\0\0\0\377\2\0\0\0\323\0\0\0\3\311\0\0\0\0" \ + "\1\0\0\0\206\225\0\0\0\377\2\2\3\1\377Tz\35\377\352u\251(\377\3m\235" \ + "%\377.B\20\377\0\1\0\377\220\0\0\0\377\3\16\25\5\377Kl\32\377t\250(\377" \ + "\320u\251(\377\1U{\35\377\237\0\0\0\377\1""3J\21\377\321u\251(\377\2" \ + "]\206\40\377\36+\12\377\221\0\0\0\377\2\31$\11\377_\211\40\377\352u\251" \ + "(\377\2j\231$\377\20\27\5\377\224\0\0\0\377\1\0\0\0K\312\0\0\0\0\2\0" \ + "\0\0\15\0\0\0\351\225\0\0\0\377\2\4\6\1\377V}\35\377\353u\251(\377\2" \ + "Z\202\37\377\25\36\7\377\221\0\0\0\377\2\26\40\10\377U{\35\377\317u\251" \ + "(\377\1[\204\37\377\237\0\0\0\377\1""9S\24\377\317u\251(\377\3e\222#" \ + "\377'9\15\377\0\1\0\377\220\0\0\0\377\3\7\13\3\377Ed\30\377t\250(\377" \ + "\352u\251(\377\2j\232$\377\23\34\7\377\224\0\0\0\377\1\0\0\0\274\314" \ + "\0\0\0\0\1\0\0\0l\226\0\0\0\377\2\3\4\1\377Sw\34\377\353u\251(\377\3" \ + "t\250(\377Fe\30\377\6\10\2\377\221\0\0\0\377\2\36,\12\377`\213!\377\315" \ + "u\251(\377\1`\213!\377\237\0\0\0\377\1=Y\25\377\315u\251(\377\3l\234" \ + "%\377/D\20\377\2\3\1\377\221\0\0\0\377\2/D\20\377m\236%\377\353u\251" \ + "(\377\2i\230$\377\21\31\6\377\224\0\0\0\377\2\0\0\0\373\0\0\0""4\315" \ + "\0\0\0\0\1\0\0\0\262\226\0\0\0\377\2\5\7\2\377W~\36\377\354u\251(\377" \ + "\2c\217\"\377\34(\12\377\221\0\0\0\377\3\3\4\1\3775M\22\377n\237&\377" \ + "\313u\251(\377\1d\221\"\377\237\0\0\0\377\1B_\27\377\313u\251(\377\3" \ + "t\250(\377Hi\31\377\13\21\4\377\221\0\0\0\377\2\14\21\4\377Pt\33\377" \ + "\354u\251(\377\2k\232%\377\25\36\7\377\225\0\0\0\377\1\0\0\0y\316\0\0" \ + "\0\0\2\0\0\0\25\0\0\0\347\226\0\0\0\377\2\4\5\1\377Rv\34\377\354u\251" \ + "(\377\3u\250(\377Ed\30\377\7\12\2\377\221\0\0\0\377\3\12\17\3\377Fe\30" \ + "\377t\247(\377\311u\251(\377\1g\224#\377\237\0\0\0\377\1Db\27\377\312" \ + "u\251(\377\2Z\202\37\377\30\"\10\377\221\0\0\0\377\3\0\1\0\377/D\20\377" \ + "n\237&\377\354u\251(\377\2g\225#\377\21\31\6\377\225\0\0\0\377\2\0\0" \ + "\0\277\0\0\0\2\317\0\0\0\0\2\0\0\0H\0\0\0\376\226\0\0\0\377\2\1\2\0\377" \ + "Gf\30\377\355u\251(\377\2k\232%\377+>\17\377\222\0\0\0\377\2\21\31\6" \ + "\377Rw\34\377\310u\251(\377\1b\216\"\377\237\0\0\0\377\1@\\\26\377\310" \ + "u\251(\377\2b\215!\377\37-\13\377\222\0\0\0\377\2\27!\10\377_\211\40" \ + "\377\355u\251(\377\2_\212!\377\13\20\4\377\225\0\0\0\377\2\0\0\0\356" \ + "\0\0\0\34\321\0\0\0\0\1\0\0\0\217\227\0\0\0\377\2\1\1\0\377Db\27\377" \ + "\356u\251(\377\2Nq\33\377\13\20\4\377\222\0\0\0\377\2&7\15\377g\224#" \ + "\377\306u\251(\377\1^\207\40\377\237\0\0\0\377\1Z\25\377s\246'\377\357u\251(\377" \ + "\2C`\27\377\0\1\0\377\227\0\0\0\377\1\0\0\0\234\327\0\0\0\0\2\0\0\0\11" \ + "\0\0\0\373\232\0\0\0\377\2\34(\12\377n\236%\377\357u\251(\377\2j\232" \ + "$\377%6\15\377\223\0\0\0\377\2\22\32\6\377V}\35\377\276u\251(\377\1\"" \ + "1\14\377\237\0\0\0\377\2\3\4\1\377r\244'\377\275u\251(\377\2g\224#\377" \ + "#3\14\377\223\0\0\0\377\2\21\31\6\377[\203\37\377\360u\251(\377\2Ca\27" \ + "\377\0\1\0\377\230\0\0\0\377\1\0\0\0\311\327\0\0\0\0\1\0\0\0+\234\0\0" \ + "\0\377\2\26\40\10\377l\234%\377\360u\251(\377\2Kl\32\377\10\13\3\377" \ + "\222\0\0\0\377\3\0\1\0\377,\77\17\377l\234%\377\274u\251(\377\1\12\16" \ + "\3\377\240\0\0\0\377\1\\\205\40\377\273u\251(\377\3t\247(\377B_\26\377" \ + "\6\10\2\377\222\0\0\0\377\3\0\1\0\3772I\21\377p\242&\377\360u\251(\377" \ + "\1>Y\25\377\232\0\0\0\377\1\0\0\0\356\327\0\0\0\0\1\0\0\0E\235\0\0\0" \ + "\377\2\22\32\6\377i\230$\377\360u\251(\377\2k\232%\377$4\14\377\223\0" \ + "\0\0\377\3\7\13\3\377C`\27\377t\250(\377\271u\251(\377\1e\222#\377\241" \ + "\0\0\0\377\1C`\27\377\272u\251(\377\2\\\205\37\377\25\36\7\377\223\0" \ + "\0\0\377\2\21\30\6\377[\204\37\377\360u\251(\377\2u\250(\3771G\21\377" \ + "\234\0\0\0\377\1\0\0\0\12\326\0\0\0\0\1\0\0\0V\236\0\0\0\377\2\25\36" \ + "\7\377k\233%\377\360u\251(\377\3u\250(\377B_\26\377\4\5\1\377\223\0\0" \ + "\0\377\2!0\13\377f\224#\377\270u\251(\377\1Mo\32\377\241\0\0\0\377\1" \ + "*=\16\377\270u\251(\377\3q\243'\3778P\23\377\2\3\1\377\223\0\0\0\377" \ + "\2(:\16\377m\236%\377\360u\251(\377\2u\250(\3772I\21\377\235\0\0\0\377" \ + "\1\0\0\0\32\326\0\0\0\0\1\0\0\0]\235\0\0\0\377\3\14\21\4\377Ca\27\377" \ + "r\245'\377\362u\251(\377\2a\215!\377\26\40\10\377\223\0\0\0\377\3\5\7" \ + "\2\377A^\26\377t\247(\377\266u\251(\377\1*=\16\377\241\0\0\0\377\2\11" \ + "\15\3\377t\247(\377\266u\251(\377\2W~\36\377\21\31\6\377\223\0\0\0\377" \ + "\2\7\13\3\377Ln\32\377\363u\251(\377\2V}\35\377\32%\11\377\234\0\0\0" \ + "\377\1\0\0\0\40\326\0\0\0\0\1\0\0\0V\222\0\0\0\377\5""2I\21\377Lm\32" \ + "\377Ca\27\377:T\24\3772H\21\377\202/D\20\377\5""6N\22\3777O\23\377Fe" \ + "\30\377^\207\40\377t\250(\377\365u\251(\377\3r\245'\3776N\23\377\1\1" \ + "\0\377\223\0\0\0\377\2\30\"\10\377_\212!\377\264u\251(\377\2s\246'\377" \ + "\10\13\3\377\242\0\0\0\377\1W~\36\377\264u\251(\377\3m\236%\377-A\17" \ + "\377\0\1\0\377\223\0\0\0\377\2\36,\12\377h\226#\377\366u\251(\377\5g" \ + "\224#\377Mo\32\3779S\24\3777O\23\3771F\21\377\202/D\20\377\5""8Q\23\377" \ + "A]\26\377Ij\31\377Fe\30\377\5\7\2\377\220\0\0\0\377\1\0\0\0\31\326\0" \ + "\0\0\0\1\0\0\0F\222\0\0\0\377\2\3\5\1\377Sw\34\377\377u\251(\377\202" \ + "u\251(\377\2Y\200\36\377\16\25\5\377\223\0\0\0\377\3\2\3\1\377;U\24\377" \ + "s\246'\377\262u\251(\377\1U{\35\377\243\0\0\0\377\1""2H\21\377\263u\251" \ + "(\377\2Sx\34\377\14\21\4\377\223\0\0\0\377\3\4\5\1\377A]\26\377t\250" \ + "(\377\377u\251(\377\3u\251(\377i\230$\377\21\31\6\377\221\0\0\0\377\1" \ + "\0\0\0\12\326\0\0\0\0\1\0\0\0%\223\0\0\0\377\2\3\5\1\377Sw\34\377\377" \ + "u\251(\377\202u\251(\377\2n\237&\377(:\16\377\224\0\0\0\377\2\27\"\10" \ + "\377a\214!\377\261u\251(\377\1);\16\377\243\0\0\0\377\2\11\15\3\377q" \ + "\244'\377\260u\251(\377\2n\237&\377-A\17\377\224\0\0\0\377\2\23\33\6" \ + "\377`\213!\377\377u\251(\377\202u\251(\377\2i\230$\377\21\31\6\377\221" \ + "\0\0\0\377\1\0\0\0\350\327\0\0\0\0\2\0\0\0\5\0\0\0\370\223\0\0\0\377" \ + "\2\1\2\0\377Mo\32\377\377u\251(\377\203u\251(\377\2Jk\31\377\6\10\2\377" \ + "\223\0\0\0\377\3\2\3\1\3777O\23\377r\245'\377\256u\251(\377\2h\226#\377" \ + "\2\3\1\377\244\0\0\0\377\1Gf\30\377\257u\251(\377\2Pt\33\377\13\17\4" \ + "\377\224\0\0\0\377\2""3J\21\377r\244'\377\377u\251(\377\202u\251(\377" \ + "\2f\223#\377\16\24\5\377\222\0\0\0\377\1\0\0\0\301\330\0\0\0\0\1\0\0" \ + "\0\302\224\0\0\0\377\2\1\2\0\377Mo\32\377\377u\251(\377\203u\251(\377" \ + "\2d\220\"\377\26\40\10\377\224\0\0\0\377\2\25\36\7\377_\211\40\377\255" \ + "u\251(\377\1""8P\23\377\245\0\0\0\377\2\24\34\7\377u\250(\377\254u\251" \ + "(\377\2m\235%\377'8\15\377\224\0\0\0\377\2\10\13\3\377Pt\33\377\377u" \ + "\251(\377\203u\251(\377\2f\223#\377\16\24\5\377\223\0\0\0\377\1\0\0\0" \ + "\206\330\0\0\0\0\1\0\0\0\200\225\0\0\0\377\2\3\5\1\377Sw\34\377\377u" \ + "\251(\377\203u\251(\377\2p\242&\377,@\17\377\224\0\0\0\377\3\4\6\1\377" \ + "A^\26\377t\250(\377\252u\251(\377\2n\237&\377\11\15\3\377\246\0\0\0\377" \ + "\1Tz\35\377\253u\251(\377\2X\177\36\377\17\26\5\377\224\0\0\0\377\2\26" \ + "\40\10\377c\217\"\377\377u\251(\377\203u\251(\377\2i\227$\377\21\31\6" \ + "\377\224\0\0\0\377\1\0\0\0D\330\0\0\0\0\1\0\0\0)\226\0\0\0\377\2\2\3" \ + "\1\377Hi\31\377\377u\251(\377\204u\251(\377\2Jk\31\377\6\10\2\377\224" \ + "\0\0\0\377\2\34)\12\377g\224#\377\251u\251(\377\1""7O\23\377\247\0\0" \ + "\0\377\2\26\37\7\377t\250(\377\250u\251(\377\3r\244'\3774K\22\377\1\1" \ + "\0\377\224\0\0\0\377\2""0F\20\377q\244'\377\377u\251(\377\203u\251(\377" \ + "\2a\214!\377\16\24\5\377\224\0\0\0\377\2\0\0\0\350\0\0\0\3\331\0\0\0" \ + "\0\1\0\0\0\275\227\0\0\0\377\2:T\24\377u\250(\377\377u\251(\377\203u" \ + "\251(\377\2c\217\"\377\25\36\7\377\224\0\0\0\377\2\7\13\3\377Mo\32\377" \ + "\247u\251(\377\2h\226#\377\4\6\1\377\250\0\0\0\377\1Ii\31\377\247u\251" \ + "(\377\2b\215!\377\26\37\7\377\224\0\0\0\377\2\6\11\2\377Nq\33\377\377" \ + "u\251(\377\204u\251(\377\2W}\36\377\7\13\3\377\225\0\0\0\377\1\0\0\0" \ + "\202\332\0\0\0\0\1\0\0\0L\230\0\0\0\377\2,\77\17\377s\246'\377\377u\251" \ + "(\377\203u\251(\377\2p\242&\377*<\16\377\225\0\0\0\377\2,\77\17\377o" \ + "\240&\377\245u\251(\377\1'8\15\377\251\0\0\0\377\2\14\21\4\377m\236%" \ + "\377\244u\251(\377\3u\250(\377Ec\30\377\4\6\1\377\224\0\0\0\377\2\24" \ + "\34\7\377c\217\"\377\377u\251(\377\204u\251(\377\2Jk\31\377\3\4\1\377" \ + "\225\0\0\0\377\2\0\0\0\366\0\0\0\34\333\0\0\0\0\1\0\0\0\264\230\0\0\0" \ + "\377\2\32&\11\377k\233%\377\377u\251(\377\204u\251(\377\2Jk\31\377\5" \ + "\7\2\377\224\0\0\0\377\2\15\23\5\377X\177\36\377\243u\251(\377\1Hh\31" \ + "\377\253\0\0\0\377\1$4\14\377\243u\251(\377\2i\227$\377\37,\13\377\225" \ + "\0\0\0\377\2.C\20\377q\244'\377\377u\251(\377\203u\251(\377\2t\250(\377" \ + "3J\21\377\227\0\0\0\377\1\0\0\0z\334\0\0\0\0\2\0\0\0#\0\0\0\370\230\0" \ + "\0\0\377\2\21\30\6\377d\220\"\377\377u\251(\377\204u\251(\377\2_\211" \ + "\40\377\20\27\5\377\224\0\0\0\377\3\0\1\0\3773J\21\377r\245'\377\240" \ + "u\251(\377\2d\220\"\377\5\7\2\377\254\0\0\0\377\1Ii\31\377\241u\251(" \ + "\377\2Qu\34\377\11\15\3\377\224\0\0\0\377\2\4\6\1\377Jk\31\377\377u\251" \ + "(\377\204u\251(\377\2q\244'\377'8\15\377\227\0\0\0\377\2\0\0\0\331\0" \ + "\0\0\6\335\0\0\0\0\1\0\0\0\203\231\0\0\0\377\2\14\21\4\377Y\201\36\377" \ + "\377u\251(\377\204u\251(\377\2k\232%\377\36,\12\377\225\0\0\0\377\2\34" \ + ")\12\377g\225#\377\236u\251(\377\2q\244'\377\33'\11\377\255\0\0\0\377" \ + "\2\7\13\3\377b\216\"\377\236u\251(\377\3r\244'\3774L\22\377\0\1\0\377" \ + "\224\0\0\0\377\2\14\21\4\377Z\202\37\377\377u\251(\377\204u\251(\377" \ + "\2k\232%\377\37,\13\377\227\0\0\0\377\2\0\0\0\375\0\0\0I\336\0\0\0\0" \ + "\2\0\0\0\1\0\0\0\253\231\0\0\0\377\3\2\3\1\377>Y\25\377u\250(\377\377" \ + "u\251(\377\203u\251(\377\3t\247(\3776N\23\377\0\1\0\377\224\0\0\0\377" \ + "\2\10\14\3\377Rv\34\377\234u\251(\377\2t\250(\377'8\15\377\257\0\0\0" \ + "\377\2\17\25\5\377j\230$\377\234u\251(\377\2e\222#\377\27\"\10\377\225" \ + "\0\0\0\377\2\34)\12\377j\232$\377\377u\251(\377\204u\251(\377\2X\177" \ + "\36\377\13\21\4\377\230\0\0\0\377\1\0\0\0w\340\0\0\0\0\2\0\0\0\15\0\0" \ + "\0\324\232\0\0\0\377\2\35*\12\377j\230$\377\377u\251(\377\204u\251(\377" \ + "\2Sw\34\377\6\11\2\377\225\0\0\0\377\2/D\20\377r\244'\377\232u\251(\377" \ + "\1/D\20\377\261\0\0\0\377\2\23\34\7\377m\236%\377\232u\251(\377\2Lm\32" \ + "\377\6\10\2\377\225\0\0\0\377\2""7O\23\377t\247(\377\377u\251(\377\203" \ + "u\251(\377\3s\246'\3773J\21\377\0\1\0\377\230\0\0\0\377\2\0\0\0\247\0" \ + "\0\0\1\341\0\0\0\0\2\0\0\0&\0\0\0\344\232\0\0\0\377\2\15\23\4\377Z\202" \ + "\37\377\377u\251(\377\204u\251(\377\2]\207\40\377\15\23\4\377\225\0\0" \ + "\0\377\2\33'\11\377h\226$\377\230u\251(\377\1:T\24\377\263\0\0\0\377" \ + "\2\34)\12\377o\240&\377\227u\251(\377\3s\246'\3774K\22\377\0\1\0\377" \ + "\224\0\0\0\377\2\2\3\1\377Dc\27\377\377u\251(\377\204u\251(\377\2k\232" \ + "%\377\40.\13\377\231\0\0\0\377\2\0\0\0\303\0\0\0\14\343\0\0\0\0\2\0\0" \ + "\0\35\0\0\0\332\232\0\0\0\377\3\0\1\0\3777O\23\377t\247(\377\377u\251" \ + "(\377\203u\251(\377\2l\234%\377\36,\12\377\225\0\0\0\377\2\6\11\2\377" \ + "Nq\33\377\225u\251(\377\2t\250(\377/D\20\377\265\0\0\0\377\2\26\40\10" \ + "\377k\233%\377\225u\251(\377\2d\221\"\377\26\40\10\377\225\0\0\0\377" \ + "\2\13\20\4\377[\203\37\377\377u\251(\377\204u\251(\377\2Ty\35\377\11" \ + "\15\3\377\231\0\0\0\377\2\0\0\0\257\0\0\0\7\345\0\0\0\0\2\0\0\0\35\0" \ + "\0\0\330\233\0\0\0\377\2!0\13\377h\226$\377\377u\251(\377\203u\251(\377" \ + "\2r\244'\377,@\17\377\225\0\0\0\377\3\1\1\0\3779R\23\377t\247(\377\222" \ + "u\251(\377\2t\247(\377/D\20\377\267\0\0\0\377\2\25\36\7\377j\231$\377" \ + "\223u\251(\377\2Sw\34\377\11\15\3\377\225\0\0\0\377\2\24\35\7\377e\222" \ + "#\377\377u\251(\377\203u\251(\377\3r\245'\3779S\24\377\1\2\0\377\231" \ + "\0\0\0\377\2\0\0\0\262\0\0\0\10\347\0\0\0\0\2\0\0\0\14\0\0\0\247\233" \ + "\0\0\0\377\3\7\12\2\377Hh\31\377u\250(\377\377u\251(\377\203u\251(\377" \ + "\2A^\26\377\1\2\0\377\225\0\0\0\377\2\36+\12\377j\231$\377\220u\251(" \ + "\377\2k\232%\377\37,\13\377\271\0\0\0\377\2\14\22\4\377Z\202\37\377\220" \ + "u\251(\377\3s\246'\3777P\23\377\0\1\0\377\225\0\0\0\377\2$4\14\377o\240" \ + "&\377\377u\251(\377\203u\251(\377\2^\210\40\377\25\36\7\377\231\0\0\0" \ + "\377\3\0\0\0\374\0\0\0w\0\0\0\1\352\0\0\0\0\2\0\0\0f\0\0\0\371\233\0" \ + "\0\0\377\2\33'\11\377d\220\"\377\377u\251(\377\203u\251(\377\2V|\35\377" \ + "\7\12\2\377\225\0\0\0\377\2\11\15\3\377W}\36\377\216u\251(\377\2U{\35" \ + "\377\12\16\3\377\273\0\0\0\377\3\1\2\0\377;U\24\377t\250(\377\215u\251" \ + "(\377\2j\230$\377\33'\11\377\226\0\0\0\377\2;U\24\377u\250(\377\377u" \ + "\251(\377\202u\251(\377\3p\242&\377/D\20\377\0\1\0\377\231\0\0\0\377" \ + "\2\0\0\0\347\0\0\0@\355\0\0\0\0\1\0\0\0\214\234\0\0\0\377\3\6\11\2\377" \ + "Gf\30\377u\250(\377\377u\251(\377\202u\251(\377\2]\206\40\377\13\20\4" \ + "\377\225\0\0\0\377\2\3\5\1\377Gg\30\377\213u\251(\377\3s\246'\377=X\25" \ + "\377\2\3\1\377\276\0\0\0\377\2%5\15\377j\230$\377\213u\251(\377\2_\211" \ + "\40\377\17\25\5\377\225\0\0\0\377\2\1\2\0\377C`\27\377\377u\251(\377" \ + "\203u\251(\377\2]\207\40\377\24\35\7\377\233\0\0\0\377\1\0\0\0S\356\0" \ + "\0\0\0\1\0\0\0\216\236\0\0\0\377\2\33&\11\377c\217\"\377\377u\251(\377" \ + "\202u\251(\377\2j\230$\377\27!\10\377\226\0\0\0\377\2*<\16\377p\242&" \ + "\377\210u\251(\377\2U{\35\377\20\27\5\377\301\0\0\0\377\3\5\7\2\377>" \ + "Z\25\377s\246'\377\210u\251(\377\2Gg\30\377\3\5\1\377\225\0\0\0\377\2" \ + "\7\12\2\377V|\35\377\377u\251(\377\202u\251(\377\3o\241&\377/D\20\377" \ + "\0\1\0\377\234\0\0\0\377\1\0\0\0T\356\0\0\0\0\1\0\0\0\230\236\0\0\0\377" \ + "\2\2\3\1\377Ca\27\377\377u\251(\377\203u\251(\377\2n\236%\377\36+\12" \ + "\377\226\0\0\0\377\2\33'\11\377j\230$\377\205u\251(\377\3l\234%\377/" \ + "D\20\377\1\1\0\377\304\0\0\0\377\2\32&\11\377_\211\40\377\205u\251(\377" \ + "\2t\247(\3775M\22\377\226\0\0\0\377\2\13\21\4\377]\207\40\377\377u\251" \ + "(\377\203u\251(\377\2_\211\40\377\13\17\4\377\235\0\0\0\377\1\0\0\0^" \ + "\356\0\0\0\0\1\0\0\0\222\232\0\0\0\377\5\1\1\0\377\17\25\5\377$4\14\377" \ + "Ca\27\377j\230$\377\377u\251(\377\205u\251(\377\2r\245'\377*=\16\377" \ + "\226\0\0\0\377\2\14\21\4\377[\204\37\377\202u\251(\377\3o\241&\377;U" \ + "\24\377\6\11\2\377\307\0\0\0\377\3\1\1\0\377);\16\377d\220\"\377\202" \ + "u\251(\377\2l\234%\377\37-\13\377\226\0\0\0\377\2\23\33\6\377g\224#\377" \ + "\377u\251(\377\205u\251(\377\5q\244'\377Nq\33\377-A\17\377\24\35\7\377" \ + "\3\5\1\377\231\0\0\0\377\1\0\0\0W\356\0\0\0\0\1\0\0\0z\222\0\0\0\377" \ + "\11+>\17\377Nq\33\377Ty\35\377V|\35\377Z\203\37\377_\212!\377e\222#\377" \ + "l\234%\377q\244'\377\377u\251(\377\212u\251(\377\2t\250(\3772H\21\377" \ + "\226\0\0\0\377\4\3\5\1\377Fe\30\377B_\27\377\12\17\3\377\313\0\0\0\377" \ + "\4\2\3\1\377/D\20\377Tz\35\377\17\26\5\377\226\0\0\0\377\2\27\"\10\377" \ + "l\234%\377\377u\251(\377\212u\251(\377\5t\247(\377m\236%\377g\224#\377" \ + "b\215!\377]\206\40\377\202V|\35\377\3Nq\33\377A]\26\377\3\4\1\377\220" \ + "\0\0\0\377\1\0\0\0>\356\0\0\0\0\1\0\0\0`\222\0\0\0\377\2\0\1\0\377@]" \ + "\26\377\377u\251(\377\223u\251(\377\2>Z\25\377\0\1\0\377\374\0\0\0\377" \ + "\2!0\13\377p\242&\377\377u\251(\377\222u\251(\377\2^\207\40\377\13\17" \ + "\4\377\221\0\0\0\377\1\0\0\0%\356\0\0\0\0\1\0\0\0,\224\0\0\0\377\2""3" \ + "J\21\377u\250(\377\377u\251(\377\222u\251(\377\2Fe\30\377\1\1\0\377\372" \ + "\0\0\0\377\2'9\15\377r\245'\377\377u\251(\377\222u\251(\377\2Ty\35\377" \ + "\5\7\2\377\221\0\0\0\377\2\0\0\0\355\0\0\0\1\356\0\0\0\0\2\0\0\0\1\0" \ + "\0\0\355\224\0\0\0\377\2/D\20\377r\245'\377\377u\251(\377\222u\251(\377" \ + "\2Ij\31\377\2\3\1\377\370\0\0\0\377\2*<\16\377s\246'\377\377u\251(\377" \ + "\222u\251(\377\2Mo\32\377\3\5\1\377\222\0\0\0\377\1\0\0\0\263\360\0\0" \ + "\0\0\1\0\0\0\253\225\0\0\0\377\2\32&\11\377i\227$\377\377u\251(\377\222" \ + "u\251(\377\2Os\33\377\2\3\1\377\366\0\0\0\377\2/D\20\377t\250(\377\377" \ + "u\251(\377\221u\251(\377\2s\246'\3773J\22\377\224\0\0\0\377\1\0\0\0n" \ + "\360\0\0\0\0\1\0\0\0M\226\0\0\0\377\2\10\14\3\377Ty\35\377\377u\251(" \ + "\377\222u\251(\377\2Tz\35\377\4\6\1\377\364\0\0\0\377\1""8P\23\377\377" \ + "u\251(\377\222u\251(\377\2f\223#\377\27!\10\377\224\0\0\0\377\2\0\0\0" \ + "\372\0\0\0\25\360\0\0\0\0\2\0\0\0\6\0\0\0\351\226\0\0\0\377\3\1\2\0\377" \ + "\17\377\2\3\1\377\240\0\0\0\377\2\0\0\0\270\0\0\0\22\377" \ + "\0\0\0\0\206\0\0\0\0\2\0\0\0\15\0\0\0\255\243\0\0\0\377\2\37-\13\377" \ + "\\\205\40\377\376u\251(\377\1A^\26\377\351\0\0\0\377\1\36,\12\377\376" \ + "u\251(\377\3j\230$\377/D\20\377\3\4\1\377\240\0\0\0\377\3\0\0\0\375\0" \ + "\0\0w\0\0\0\1\377\0\0\0\0\210\0\0\0\0\3\0\0\0\3\0\0\0{\0\0\0\371\242" \ + "\0\0\0\377\2\40.\13\377o\240&\377\375u\251(\377\1\27!\10\377\351\0\0" \ + "\0\377\2\1\1\0\377h\226#\377\375u\251(\377\2=W\25\377\2\3\1\377\240\0" \ + "\0\0\377\2\0\0\0\352\0\0\0S\377\0\0\0\0\214\0\0\0\0\2\0\0\0#\0\0\0\302" \ + "\237\0\0\0\377\2\24\34\7\377Km\32\377\376u\251(\377\1^\207\40\377\353" \ + "\0\0\0\377\1;U\24\377\376u\251(\377\3_\211\40\377\"2\14\377\1\1\0\377" \ + "\235\0\0\0\377\2\0\0\0\231\0\0\0\20\377\0\0\0\0\216\0\0\0\0\3\0\0\0\3" \ + "\0\0\0w\0\0\0\370\231\0\0\0\377\5\0\1\0\377\21\31\6\3772H\21\377X\177" \ + "\36\377u\250(\377\377u\251(\377\1(:\16\377\353\0\0\0\377\2\11\15\3\377" \ + "p\242&\377\377u\251(\377\4e\222#\377=X\25\377\33&\11\377\3\4\1\377\230" \ + "\0\0\0\377\2\0\0\0\345\0\0\0J\377\0\0\0\0\222\0\0\0\0\2\0\0\0""2\0\0" \ + "\0\340\221\0\0\0\377\2\6\11\2\377Hg\30\377\204^\207\40\377\2^\210\40" \ + "\377n\237&\377\377u\251(\377\203u\251(\377\2e\222#\377\1\2\0\377\354" \ + "\0\0\0\377\1Ca\27\377\377u\251(\377\203u\251(\377\2s\246'\377a\214!\377" \ + "\204^\207\40\377\2W}\36\377\25\36\7\377\220\0\0\0\377\2\0\0\0\300\0\0" \ + "\0\31\377\0\0\0\0\224\0\0\0\0\1\0\0\0\205\222\0\0\0\377\3\3\5\1\377@" \ + "]\26\377u\250(\377\377u\251(\377\207u\251(\377\1""0E\20\377\355\0\0\0" \ + "\377\2\17\25\5\377s\246'\377\377u\251(\377\207u\251(\377\2Y\200\36\377" \ + "\16\25\5\377\221\0\0\0\377\1\0\0\0L\377\0\0\0\0\225\0\0\0\0\1\0\0\0J" \ + "\224\0\0\0\377\2\37,\13\377c\217\"\377\377u\251(\377\205u\251(\377\2" \ + "d\221\"\377\3\4\1\377\356\0\0\0\377\1Ec\30\377\377u\251(\377\205u\251" \ + "(\377\3o\240&\3775M\22\377\1\2\0\377\221\0\0\0\377\2\0\0\0\375\0\0\0" \ + "\21\377\0\0\0\0\225\0\0\0\0\2\0\0\0\17\0\0\0\374\224\0\0\0\377\3\1\1" \ + "\0\377+>\17\377j\231$\377\377u\251(\377\203u\251(\377\1#2\14\377\357" \ + "\0\0\0\377\2\10\13\3\377l\234%\377\377u\251(\377\202u\251(\377\3r\245" \ + "'\377>Z\25\377\10\13\3\377\223\0\0\0\377\1\0\0\0\322\377\0\0\0\0\227" \ + "\0\0\0\0\1\0\0\0\304\226\0\0\0\377\3\10\14\3\377@]\26\377o\241&\377\377" \ + "u\251(\377\1W~\36\377\361\0\0\0\377\1""4K\22\377\377u\251(\377\3u\250" \ + "(\377Rv\34\377\26\37\7\377\225\0\0\0\377\1\0\0\0\211\377\0\0\0\0\227" \ + "\0\0\0\0\1\0\0\0h\230\0\0\0\377\3\10\14\3\377:T\24\377l\234%\377\374" \ + "u\251(\377\2r\245'\377\25\36\7\377\361\0\0\0\377\2\3\4\1\377`\213!\377" \ + "\374u\251(\377\3s\246'\377Jk\31\377\24\35\7\377\227\0\0\0\377\1\0\0\0" \ + "-\377\0\0\0\0\227\0\0\0\0\2\0\0\0\22\0\0\0\371\231\0\0\0\377\3\5\7\2" \ + "\3771F\21\377`\213!\377\372u\251(\377\1""8Q\23\377\363\0\0\0\377\2\27" \ + "!\10\377s\246'\377\371u\251(\377\3k\233%\377\77[\26\377\16\24\5\377\230" \ + "\0\0\0\377\1\0\0\0\323\377\0\0\0\0\231\0\0\0\0\1\0\0\0\253\234\0\0\0" \ + "\377\3\23\34\7\377C`\27\377o\240&\377\366u\251(\377\2Y\200\36\377\1\1" \ + "\0\377\364\0\0\0\377\1""8R\23\377\366u\251(\377\4t\247(\377Nq\33\377" \ + "\37-\13\377\1\1\0\377\232\0\0\0\377\1\0\0\0q\377\0\0\0\0\231\0\0\0\0" \ + "\2\0\0\0)\0\0\0\374\235\0\0\0\377\4\10\13\3\377,@\17\377Sw\34\377r\244" \ + "'\377\362u\251(\377\2o\240&\377\22\33\6\377\365\0\0\0\377\2\2\3\1\377" \ + "\\\205\40\377\363u\251(\377\3^\210\40\3778Q\23\377\21\31\6\377\234\0" \ + "\0\0\377\2\0\0\0\343\0\0\0\7\377\0\0\0\0\232\0\0\0\0\1\0\0\0\245\240" \ + "\0\0\0\377\4\4\6\1\377#3\14\377Jk\31\377o\240&\377\356u\251(\377\2t\247" \ + "(\377\40.\13\377\367\0\0\0\377\2\13\17\4\377h\226$\377\356u\251(\377" \ + "\4s\246'\377Rw\34\377+>\17\377\12\16\3\377\237\0\0\0\377\1\0\0\0j\377" \ + "\0\0\0\0\233\0\0\0\0\2\0\0\0'\0\0\0\367\242\0\0\0\377\4\4\5\1\377#3\14" \ + "\377Jk\31\377n\237&\377\353u\251(\377\1""8Q\23\377\371\0\0\0\377\2\26" \ + "\40\10\377p\242&\377\352u\251(\377\4s\246'\377Rw\34\377+>\17\377\11\15" \ + "\3\377\241\0\0\0\377\2\0\0\0\332\0\0\0\10\377\0\0\0\0\234\0\0\0\0\1\0" \ + "\0\0p\245\0\0\0\377\4\5\7\2\377&6\15\377Jk\31\377m\235%\377\347u\251" \ + "(\377\2Np\33\377\1\1\0\377\372\0\0\0\377\2,\77\17\377u\250(\377\346u" \ + "\251(\377\4s\246'\377U{\35\3771F\21\377\14\22\4\377\243\0\0\0\377\2\0" \ + "\0\0\373\0\0\0""8\377\0\0\0\0\236\0\0\0\0\1\0\0\0\235\247\0\0\0\377\4" \ + "\1\1\0\377\27\"\10\377;U\24\377b\215!\377\343u\251(\377\2Sx\34\377\2" \ + "\3\1\377\374\0\0\0\377\1""1F\21\377\343u\251(\377\4j\232$\377Fe\30\377" \ + "#3\14\377\4\6\1\377\246\0\0\0\377\1\0\0\0i\377\0\0\0\0\237\0\0\0\0\2" \ + "\0\0\0\13\0\0\0\305\252\0\0\0\377\4\20\27\5\3773J\21\377Z\202\37\377" \ + "t\250(\377\336u\251(\377\2Y\201\37\377\4\6\1\377\376\0\0\0\377\1=W\25" \ + "\377\337u\251(\377\4d\220\"\377>Z\25\377\34(\11\377\1\2\0\377\250\0\0" \ + "\0\377\1\0\0\0\225\377\0\0\0\0\241\0\0\0\0\2\0\0\0\16\0\0\0\307\253\0" \ + "\0\0\377\2\25\36\7\377q\244'\377\335u\251(\377\2\\\205\37\377\11\15\3" \ + "\377\377\0\0\0\377\2\0\1\0\377A^\26\377\336u\251(\377\1""6N\22\377\252" \ + "\0\0\0\377\2\0\0\0\230\0\0\0\1\377\0\0\0\0\242\0\0\0\0\2\0\0\0\7\0\0" \ + "\0\247\251\0\0\0\377\2\7\12\2\377b\215!\377\335u\251(\377\2V|\35\377" \ + "\6\10\2\377\377\0\0\0\377\203\0\0\0\377\1""8Q\23\377\335u\251(\377\2" \ + "r\244'\377\32&\11\377\247\0\0\0\377\2\0\0\0\375\0\0\0o\377\0\0\0\0\245" \ + "\0\0\0\0\3\0\0\0\3\0\0\0~\0\0\0\373\246\0\0\0\377\2\6\11\2\377W~\36\377" \ + "\335u\251(\377\2Mo\32\377\3\5\1\377\377\0\0\0\377\205\0\0\0\377\2.C\20" \ + "\377s\246'\377\334u\251(\377\2k\233%\377\26\40\10\377\245\0\0\0\377\2" \ + "\0\0\0\354\0\0\0S\377\0\0\0\0\250\0\0\0\0\2\0\0\0""5\0\0\0\313\244\0" \ + "\0\0\377\2\26\40\10\377a\215!\377\334u\251(\377\3u\250(\377:T\24\377" \ + "\0\1\0\377\377\0\0\0\377\207\0\0\0\377\2\37,\13\377m\235%\377\334u\251" \ + "(\377\2o\240&\377,\77\17\377\243\0\0\0\377\2\0\0\0\252\0\0\0\32\377\0" \ + "\0\0\0\252\0\0\0\0\3\0\0\0\2\0\0\0c\0\0\0\344\237\0\0\0\377\4\0\1\0\377" \ + "\33&\11\377Jk\31\377s\246'\377\334u\251(\377\2p\242&\377&7\15\377\377" \ + "\0\0\0\377\212\0\0\0\377\2\21\31\6\377c\216\"\377\335u\251(\377\3\\\205" \ + "\37\377'9\15\377\4\6\1\377\236\0\0\0\377\2\0\0\0\315\0\0\0A\377\0\0\0" \ + "\0\256\0\0\0\0\3\0\0\0\11\0\0\0r\0\0\0\347\232\0\0\0\377\4\15\23\4\377" \ + "2H\21\377Nq\33\377j\231$\377\336u\251(\377\2_\211\40\377\22\32\6\377" \ + "\377\0\0\0\377\214\0\0\0\377\2\6\10\2\377Hi\31\377\336u\251(\377\4p\242" \ + "&\377W~\36\377;U\24\377\32%\11\377\231\0\0\0\377\3\0\0\0\321\0\0\0S\0" \ + "\0\0\1\377\0\0\0\0\261\0\0\0\0\4\0\0\0\5\0\0\0V\0\0\0\276\0\0\0\375\227" \ + "\0\0\0\377\3\2\3\1\377,@\17\377e\222#\377\335u\251(\377\3u\250(\377A" \ + "^\26\377\3\5\1\377\377\0\0\0\377\217\0\0\0\377\2(:\16\377n\237&\377\335" \ + "u\251(\377\3o\241&\377>Y\25\377\11\15\3\377\226\0\0\0\377\3\0\0\0\367" \ + "\0\0\0\246\0\0\0=\377\0\0\0\0\267\0\0\0\0\4\0\0\0\35\0\0\0s\0\0\0\313" \ + "\0\0\0\376\226\0\0\0\377\4\2\3\1\377&7\15\377V|\35\377u\250(\377\331" \ + "u\251(\377\2b\216\"\377\34)\12\377\377\0\0\0\377\222\0\0\0\377\2\14\22" \ + "\4\377Pt\33\377\332u\251(\377\3d\220\"\3775L\22\377\11\15\3\377\225\0" \ + "\0\0\377\4\0\0\0\371\0\0\0\267\0\0\0_\0\0\0\17\377\0\0\0\0\274\0\0\0" \ + "\0\3\0\0\0\31\0\0\0c\0\0\0\264\227\0\0\0\377\4\20\27\5\3774K\22\377V" \ + "}\35\377s\246'\377\324u\251(\377\3r\244'\377:T\24\377\3\5\1\377\377\0" \ + "\0\0\377\225\0\0\0\377\2%5\15\377h\226$\377\325u\251(\377\4a\214!\377" \ + ">Z\25\377\33'\11\377\0\1\0\377\224\0\0\0\377\4\0\0\0\373\0\0\0\234\0" \ + "\0\0R\0\0\0\15\377\0\0\0\0\301\0\0\0\0\2\0\0\0\6\0\0\0\363\231\0\0\0" \ + "\377\5\5\7\2\377\37,\13\377;U\24\377Ty\35\377g\224#\377\317u\251(\377" \ + "\2Nq\33\377\17\26\5\377\377\0\0\0\377\230\0\0\0\377\3\5\7\2\377;U\24" \ + "\377p\242&\377\316u\251(\377\5m\236%\377Y\201\37\377Ca\27\377'9\15\377" \ + "\13\20\4\377\230\0\0\0\377\1\0\0\0\300\377\0\0\0\0\305\0\0\0\0\1\0\0" \ + "\0\263\236\0\0\0\377\10\6\11\2\377\31$\11\377-B\20\377@]\26\377Mo\32" \ + "\377Y\201\36\377d\220\"\377p\242&\377\305u\251(\377\2\\\205\40\377\34" \ + "(\12\377\377\0\0\0\377\234\0\0\0\377\3\15\23\4\377Ij\31\377t\247(\377" \ + "\304u\251(\377\10s\246'\377h\226$\377\\\205\37\377Qu\34\377Dc\27\377" \ + "3J\22\377\37-\13\377\14\21\4\377\235\0\0\0\377\1\0\0\0y\377\0\0\0\0\305" \ + "\0\0\0\0\1\0\0\0e\246\0\0\0\377\14\6\10\2\377\20\27\5\377\27\"\10\377" \ + "\37-\13\377'8\15\377/D\20\3778R\23\377C`\27\377Mo\32\377X\177\36\377" \ + "d\220\"\377t\247(\377\267u\251(\377\2Z\202\37\377!/\13\377\377\0\0\0" \ + "\377\240\0\0\0\377\3\21\31\6\377Ii\31\377s\246'\377\267u\251(\377\13" \ + "i\230$\377Z\203\37\377Qu\34\377Ed\30\377;U\24\3771G\21\377)<\16\377!" \ + "0\13\377\32%\11\377\22\33\6\377\13\17\4\377\245\0\0\0\377\1\0\0\0)\377" \ + "\0\0\0\0\305\0\0\0\0\2\0\0\0\13\0\0\0\362\260\0\0\0\377\5\5\7\2\377\30" \ + "#\10\377.C\20\377Kl\32\377n\236%\377\260u\251(\377\3t\250(\377Rw\34\377" \ + "\35*\12\377\377\0\0\0\377\244\0\0\0\377\3\17\26\5\377Ca\27\377o\240&" \ + "\377\260u\251(\377\5s\246'\377V}\35\3775M\22\377\37-\13\377\12\16\3\377" \ + "\257\0\0\0\377\1\0\0\0\303\377\0\0\0\0\307\0\0\0\0\1\0\0\0\230\264\0" \ + "\0\0\377\2\6\11\2\377Mo\32\377\255u\251(\377\3o\240&\377Db\27\377\21" \ + "\31\6\377\377\0\0\0\377\250\0\0\0\377\3\7\12\2\3775L\22\377e\222#\377" \ + "\255u\251(\377\2e\222#\377\22\33\6\377\263\0\0\0\377\1\0\0\0\\\377\0" \ + "\0\0\0\307\0\0\0\0\2\0\0\0\31\0\0\0\366\264\0\0\0\377\1Tz\35\377\253" \ + "u\251(\377\3Z\203\37\377-A\17\377\5\7\2\377\377\0\0\0\377\254\0\0\0\377" \ + "\4\1\1\0\377\37-\13\377Mo\32\377r\244'\377\252u\251(\377\2p\242&\377" \ + "\10\14\3\377\262\0\0\0\377\2\0\0\0\321\0\0\0\2\377\0\0\0\0\310\0\0\0" \ + "\0\1\0\0\0\210\263\0\0\0\377\1!/\13\377\251u\251(\377\3d\220\"\377;U" \ + "\24\377\22\33\6\377\377\0\0\0\377\262\0\0\0\377\4\11\15\3\377/D\20\377" \ + "X\177\36\377t\250(\377\250u\251(\377\1Dc\27\377\262\0\0\0\377\1\0\0\0" \ + "K\377\0\0\0\0\311\0\0\0\0\2\0\0\0\7\0\0\0\323\261\0\0\0\377\2\14\22\4" \ + "\377i\227$\377\245u\251(\377\4t\247(\377[\204\37\377;U\24\377\30\"\10" \ + "\377\377\0\0\0\377\270\0\0\0\377\4\14\22\4\3771F\21\377Qu\34\377o\241" \ + "&\377\245u\251(\377\2t\250(\377%5\15\377\260\0\0\0\377\1\0\0\0\236\377" \ + "\0\0\0\0\313\0\0\0\0\2\0\0\0\40\0\0\0\352\257\0\0\0\377\2\13\21\4\377" \ + "`\213!\377\243u\251(\377\4h\226#\377Hg\30\377'8\15\377\10\13\3\377\377" \ + "\0\0\0\377\276\0\0\0\377\5\2\3\1\377\35*\12\377=Y\25\377^\210\40\377" \ + "u\250(\377\242u\251(\377\2p\242&\377\37-\13\377\256\0\0\0\377\2\0\0\0" \ + "\310\0\0\0\10\377\0\0\0\0\314\0\0\0\0\2\0\0\0B\0\0\0\365\255\0\0\0\377" \ + "\2\33&\11\377g\224#\377\237u\251(\377\5s\246'\377_\212!\377Gf\30\377" \ + ".B\20\377\23\34\7\377\377\0\0\0\377\306\0\0\0\377\5\12\17\3\377'8\15" \ + "\377\77[\26\377X\177\36\377o\240&\377\237u\251(\377\3r\245'\3772I\21" \ + "\377\0\1\0\377\253\0\0\0\377\2\0\0\0\336\0\0\0\35\377\0\0\0\0\316\0\0" \ + "\0\0\2\0\0\0>\0\0\0\360\252\0\0\0\377\3\2\3\1\377=W\25\377t\247(\377" \ + "\233u\251(\377\6r\244'\377`\213!\377Mo\32\3774K\22\377\34(\11\377\5\7" \ + "\2\377\377\0\0\0\377\316\0\0\0\377\6\1\2\0\377\24\34\7\377-@\17\377E" \ + "d\30\377[\203\37\377m\236%\377\234u\251(\377\2U{\35\377\14\21\4\377\251" \ + "\0\0\0\377\2\0\0\0\326\0\0\0\34\377\0\0\0\0\320\0\0\0\0\2\0\0\0&\0\0" \ + "\0\325\250\0\0\0\377\2#3\14\377`\213!\377\226u\251(\377\10q\243'\377" \ + "e\222#\377Y\200\36\377Gf\30\3775L\22\377\"1\14\377\20\27\5\377\1\2\0" \ + "\377\377\0\0\0\377\331\0\0\0\377\7\12\17\3\377\35*\12\377/D\20\377A]" \ + "\26\377Ty\35\377a\215!\377m\236%\377\226u\251(\377\3m\235%\3776N\23\377" \ + "\5\7\2\377\246\0\0\0\377\2\0\0\0\262\0\0\0\16\377\0\0\0\0\322\0\0\0\0" \ + "\3\0\0\0\11\0\0\0\204\0\0\0\371\244\0\0\0\377\4\14\21\4\377Ec\30\377" \ + "e\222#\377j\232$\377\210m\236%\377\1k\233%\377\202e\222#\377\13c\216" \ + "\"\377[\204\37\377Ty\35\377Ln\32\377Dc\27\377=X\25\3776N\22\377+>\17" \ + "\377\37-\13\377\24\34\7\377\10\13\3\377\377\0\0\0\377\350\0\0\0\377\13" \ + "\4\6\1\377\20\27\5\377\34(\11\377(:\16\3773J\21\377;U\24\377B_\27\377" \ + "Jk\31\377Qu\34\377Y\200\36\377`\213!\377\202e\222#\377\1i\230$\377\210" \ + "m\236%\377\4m\235%\377e\222#\377V|\35\377\33&\11\377\243\0\0\0\377\3" \ + "\0\0\0\353\0\0\0_\0\0\0\1\377\0\0\0\0\325\0\0\0\0\3\0\0\0\25\0\0\0\210" \ + "\0\0\0\366\377\0\0\0\377\377\0\0\0\377\340\0\0\0\377\3\0\0\0\346\0\0" \ + "\0o\0\0\0\12\377\0\0\0\0\331\0\0\0\0\3\0\0\0\40\0\0\0\230\0\0\0\360\377" \ + "\0\0\0\377\245\0\0\0\377\6\1\0\0\377\22\2\6\377\31\2\11\377!\3\14\377" \ + "&\3\15\3771\4\21\377\2022\5\22\377\7.\4\20\377&\3\15\377\"\3\14\377\31" \ + "\2\11\377\27\2\10\377\15\1\4\377\14\1\4\377\377\0\0\0\377\250\0\0\0\377" \ + "\3\0\0\0\342\0\0\0}\0\0\0\17\377\0\0\0\0\335\0\0\0\0\4\0\0\0\11\0\0\0" \ + "V\0\0\0\262\0\0\0\372\377\0\0\0\377\233\0\0\0\377\10\15\1\4\3771\4\21" \ + "\377M\7\33\377f\11$\377\200\14-\377\227\16""5\377\251\17;\377\271\21" \ + "A\377\216\274\21B\377\10\265\20@\377\235\16""7\377\206\14/\377o\12'\377" \ + "X\10\37\377@\6\27\377&\3\15\377\5\0\2\377\377\0\0\0\377\235\0\0\0\377" \ + "\4\0\0\0\360\0\0\0\235\0\0\0@\0\0\0\2\377\0\0\0\0\342\0\0\0\0\4\0\0\0" \ + "\11\0\0\0D\0\0\0\221\0\0\0\341\377\0\0\0\377\222\0\0\0\377\6\1\0\0\377" \ + "\40\3\13\377E\6\30\377k\12&\377\221\15""3\377\257\20>\377\236\274\21" \ + "B\377\5\252\17<\377\204\14.\377^\11!\3779\5\24\377\17\1\5\377\377\0\0" \ + "\0\377\224\0\0\0\377\5\0\0\0\376\0\0\0\314\0\0\0\200\0\0\0""3\0\0\0\2" \ + "\377\0\0\0\0\350\0\0\0\0\5\0\0\0\2\0\0\0""5\0\0\0z\0\0\0\300\0\0\0\371" \ + "\377\0\0\0\377\213\0\0\0\377\4\4\0\2\3771\4\21\377h\11$\377\240\16""8" \ + "\377\247\274\21B\377\5\272\21A\377\223\15""4\377^\11!\377*\4\17\377\2" \ + "\0\1\377\377\0\0\0\377\215\0\0\0\377\4\0\0\0\361\0\0\0\260\0\0\0j\0\0" \ + "\0%\377\0\0\0\0\357\0\0\0\0\3\0\0\0\12\0\0\0\217\0\0\0\376\377\0\0\0" \ + "\377\207\0\0\0\377\4\22\2\6\377H\7\31\377\177\13-\377\262\20\77\377\256" \ + "\274\21B\377\4\257\20>\377}\13,\377I\7\32\377\22\2\6\377\377\0\0\0\377" \ + "\211\0\0\0\377\3\0\0\0\370\0\0\0e\0\0\0\1\377\0\0\0\0\357\0\0\0\0\3\0" \ + "\0\0\1\0\0\0^\0\0\0\346\377\0\0\0\377\206\0\0\0\377\3\17\1\5\377R\7\35" \ + "\377\226\16""5\377\266\274\21B\377\3\235\16""7\377X\10\37\377\22\2\6" \ + "\377\377\0\0\0\377\210\0\0\0\377\2\0\0\0\317\0\0\0""9\377\0\0\0\0\355" \ + "\0\0\0\0\2\0\0\0+\0\0\0\300\377\0\0\0\377\205\0\0\0\377\4\4\0\2\377\77" \ + "\6\26\377\204\14.\377\267\21@\377\272\274\21B\377\4\273\21A\377\221\15" \ + "3\377R\7\35\377\17\1\5\377\377\0\0\0\377\206\0\0\0\377\3\0\0\0\376\0" \ + "\0\0\242\0\0\0\25\377\0\0\0\0\351\0\0\0\0\3\0\0\0\15\0\0\0\221\0\0\0" \ + "\372\377\0\0\0\377\204\0\0\0\377\3\20\1\6\377^\11!\377\250\17;\377\300" \ + "\274\21B\377\3\264\20\77\377o\12'\377\36\3\13\377\377\0\0\0\377\206\0" \ + "\0\0\377\3\0\0\0\356\0\0\0o\0\0\0\3\377\0\0\0\0\346\0\0\0\0\2\0\0\0@" \ + "\0\0\0\333\377\0\0\0\377\204\0\0\0\377\3(\4\16\377}\13,\377\270\21A\377" \ + "\305\274\21B\377\3\226\16""5\377E\6\30\377\3\0\1\377\377\0\0\0\377\205" \ + "\0\0\0\377\2\0\0\0\276\0\0\0#\377\0\0\0\0\343\0\0\0\0\2\0\0\0\24\0\0" \ + "\0\252\377\0\0\0\377\204\0\0\0\377\3/\4\21\377\203\14.\377\273\21A\377" \ + "\311\274\21B\377\3\241\17""8\377P\7\34\377\7\1\3\377\377\0\0\0\377\204" \ + "\0\0\0\377\3\0\0\0\372\0\0\0\210\0\0\0\6\377\0\0\0\0\340\0\0\0\0\2\0" \ + "\0\0^\0\0\0\351\377\0\0\0\377\203\0\0\0\377\2.\4\20\377\221\15""3\377" \ + "\316\274\21B\377\3\252\17<\377R\7\35\377\6\1\2\377\377\0\0\0\377\204" \ + "\0\0\0\377\2\0\0\0\322\0\0\0""5\377\0\0\0\0\335\0\0\0\0\2\0\0\0\34\0" \ + "\0\0\264\377\0\0\0\377\203\0\0\0\377\2""0\4\21\377\222\15""3\377\322" \ + "\274\21B\377\3\255\20=\377^\11!\377\12\1\4\377\377\0\0\0\377\203\0\0" \ + "\0\377\3\0\0\0\373\0\0\0\221\0\0\0\13\377\0\0\0\0\332\0\0\0\0\2\0\0\0" \ + "O\0\0\0\352\377\0\0\0\377\202\0\0\0\377\3\40\3\13\377\200\14-\377\273" \ + "\21B\377\325\274\21B\377\3\247\17:\377L\7\33\377\3\0\1\377\377\0\0\0" \ + "\377\203\0\0\0\377\2\0\0\0\321\0\0\0-\377\0\0\0\0\327\0\0\0\0\2\0\0\0" \ + "\22\0\0\0\252\377\0\0\0\377\202\0\0\0\377\3\12\1\4\377k\12&\377\272\21" \ + "A\377\331\274\21B\377\2\232\16""6\377-\4\20\377\377\0\0\0\377\203\0\0" \ + "\0\377\3\0\0\0\373\0\0\0\200\0\0\0\3\377\0\0\0\0\324\0\0\0\0\2\0\0\0" \ + "@\0\0\0\341\276\0\0\0\377\3\6\1\2\377\15\1\4\377\25\2\7\377\205\31\2" \ + "\11\377\2\15\1\4\377\1\0\1\377\270\0\0\0\377\3\1\0\0\377K\7\32\377\257" \ + "\20=\377\335\274\21B\377\2\204\14.\377\30\2\10\377\377\0\0\0\377\203" \ + "\0\0\0\377\2\0\0\0\307\0\0\0$\377\0\0\0\0\321\0\0\0\0\3\0\0\0\7\0\0\0" \ + "\221\0\0\0\376\264\0\0\0\377\12\24\2\7\377.\4\20\377F\6\31\377Z\10\40" \ + "\377k\12&\377~\13,\377\221\15""3\377\243\17""9\377\257\20>\377\263\20" \ + "\77\377\213\274\21B\377\13\263\20\77\377\250\17;\377\236\16""7\377\223" \ + "\15""4\377\202\14.\377q\12(\377_\11!\377P\7\34\377<\5\25\377+\4\17\377" \ + "\17\1\5\377\254\0\0\0\377\2\35\3\12\377\216\15""2\377\340\274\21B\377" \ + "\3\265\20@\377^\11!\377\6\1\2\377\377\0\0\0\377\202\0\0\0\377\2\0\0\0" \ + "\362\0\0\0f\377\0\0\0\0\317\0\0\0\0\2\0\0\0\35\0\0\0\307\260\0\0\0\377" \ + "\6\23\2\7\377:\5\24\377a\11\"\377\202\14.\377\234\16""7\377\265\20@\377" \ + "\240\274\21B\377\6\260\20>\377\224\15""4\377y\13*\377\\\10\40\377<\5" \ + "\25\377\12\1\4\377\244\0\0\0\377\3\1\0\0\377O\7\34\377\264\20\77\377" \ + "\343\274\21B\377\2\232\16""6\377#\3\14\377\260\0\0\0\377\2\12\1\4\377" \ + "\25\2\7\377\204\31\2\11\377\3\30\2\11\377\15\1\4\377\12\1\3\377\311\0" \ + "\0\0\377\2\0\0\0\237\0\0\0\11\377\0\0\0\0\314\0\0\0\0\2\0\0\0P\0\0\0" \ + "\361\254\0\0\0\377\5\3\0\1\377*\4\17\377X\10\37\377\202\14.\377\251\17" \ + ";\377\253\274\21B\377\2\255\20=\377-\4\20\377\242\0\0\0\377\2\24\2\7" \ + "\377\213\15""1\377\346\274\21B\377\3\271\21A\377d\11#\377\5\0\2\377\242" \ + "\0\0\0\377\14\7\1\3\377#\3\14\3778\5\24\377H\7\31\377[\10\40\377k\12" \ + "&\377}\13,\377\217\15""2\377\231\16""6\377\244\17:\377\257\20>\377\273" \ + "\21B\377\212\274\21B\377\13\270\21@\377\257\20>\377\251\17;\377\226\16" \ + "5\377\204\14.\377r\12(\377^\11!\377M\7\33\3775\5\23\377\33\2\12\377\4" \ + "\0\2\377\276\0\0\0\377\2\0\0\0\330\0\0\0*\377\0\0\0\0\311\0\0\0\0\3\0" \ + "\0\0\2\0\0\0\210\0\0\0\376\251\0\0\0\377\5\1\0\0\377&\3\15\377X\10\37" \ + "\377\210\14""0\377\263\20\77\377\260\274\21B\377\1\236\16""7\377\241" \ + "\0\0\0\377\2:\5\24\377\255\20=\377\351\274\21B\377\2\234\16""7\377%\3" \ + "\15\377\233\0\0\0\377\6\1\0\1\377-\4\20\377T\10\36\377o\12'\377\213\15" \ + "1\377\247\17:\377\240\274\21B\377\7\272\21A\377\244\17""9\377\212\14" \ + "0\377l\12&\377F\6\31\377\40\3\13\377\2\0\1\377\271\0\0\0\377\2\0\0\0" \ + "\362\0\0\0T\377\0\0\0\0\307\0\0\0\0\2\0\0\0\21\0\0\0\265\250\0\0\0\377" \ + "\4\4\0\2\3773\5\22\377n\12'\377\247\17;\377\264\274\21B\377\2\273\21" \ + "B\377\1\0\1\377\236\0\0\0\377\3\4\0\2\377f\11$\377\273\21B\377\353\274" \ + "\21B\377\2\265\20@\377Q\7\34\377\231\0\0\0\377\2\15\1\5\377\221\15""3" \ + "\377\253\274\21B\377\5\263\20\77\377\216\15""2\377f\11$\3778\5\24\377" \ + "\13\1\4\377\266\0\0\0\377\3\0\0\0\376\0\0\0\210\0\0\0\3\377\0\0\0\0\304" \ + "\0\0\0\0\2\0\0\0'\0\0\0\325\246\0\0\0\377\4\1\0\0\377/\4\21\377v\13)" \ + "\377\261\20>\377\267\274\21B\377\1\255\20=\377\236\0\0\0\377\2\25\2\10" \ + "\377\230\16""5\377\357\274\21B\377\2}\13,\377\10\1\3\377\227\0\0\0\377" \ + "\1b\11\"\377\260\274\21B\377\5\272\21A\377\226\16""5\377g\11$\3777\5" \ + "\23\377\7\1\2\377\264\0\0\0\377\2\0\0\0\262\0\0\0\20\377\0\0\0\0\302" \ + "\0\0\0\0\2\0\0\0L\0\0\0\363\245\0\0\0\377\3#\3\14\377k\12&\377\252\17" \ + "<\377\272\274\21B\377\1w\13*\377\235\0\0\0\377\2'\4\16\377\251\17;\377" \ + "\361\274\21B\377\2\232\16""6\377\30\2\10\377\226\0\0\0\377\1\202\14." \ + "\377\264\274\21B\377\4\264\20\77\377\200\14-\377E\6\30\377\16\1\5\377" \ + "\262\0\0\0\377\2\0\0\0\335\0\0\0'\377\0\0\0\0\300\0\0\0\0\2\0\0\0j\0" \ + "\0\0\374\243\0\0\0\377\4\1\0\1\3777\5\23\377\210\14""0\377\273\21B\377" \ + "\274\274\21B\377\1A\6\27\377\234\0\0\0\377\2C\6\30\377\266\20@\377\363" \ + "\274\21B\377\2\256\20=\3770\4\21\377\225\0\0\0\377\1s\12(\377\267\274" \ + "\21B\377\4\272\21A\377\213\15""1\377E\6\30\377\10\1\3\377\260\0\0\0\377" \ + "\2\0\0\0\355\0\0\0>\377\0\0\0\0\275\0\0\0\0\2\0\0\0\2\0\0\0\221\243\0" \ + "\0\0\377\3\17\1\5\377^\11!\377\252\17<\377\276\274\21B\377\2\244\17:" \ + "\377\4\0\1\377\233\0\0\0\377\2T\10\36\377\273\21A\377\365\274\21B\377" \ + "\2\266\20@\377A\6\27\377\224\0\0\0\377\1=\6\25\377\272\274\21B\377\4" \ + "\267\21@\377}\13,\3779\5\24\377\3\0\1\377\256\0\0\0\377\2\0\0\0\370\0" \ + "\0\0Y\377\0\0\0\0\273\0\0\0\0\2\0\0\0\11\0\0\0\254\242\0\0\0\377\3\13" \ + "\1\4\377^\11!\377\261\20>\377\300\274\21B\377\1O\7\34\377\233\0\0\0\377" \ + "\1f\11$\377\370\274\21B\377\2\273\21B\377S\7\35\377\223\0\0\0\377\2\12" \ + "\1\4\377\267\21@\377\274\274\21B\377\3\237\16""8\377P\7\34\377\12\1\3" \ + "\377\255\0\0\0\377\2\0\0\0\376\0\0\0\200\377\0\0\0\0\271\0\0\0\0\2\0" \ + "\0\0\16\0\0\0\274\241\0\0\0\377\3\12\1\4\377\\\10\40\377\257\20>\377" \ + "\301\274\21B\377\2\247\17:\377\5\0\2\377\232\0\0\0\377\1g\11$\377\373" \ + "\274\21B\377\1^\10!\377\223\0\0\0\377\1o\12'\377\276\274\21B\377\3\267" \ + "\21@\377w\13*\377!\3\14\377\255\0\0\0\377\2\0\0\0\214\0\0\0\1\377\0\0" \ + "\0\0\266\0\0\0\0\2\0\0\0\23\0\0\0\317\240\0\0\0\377\3\4\0\1\377T\10\36" \ + "\377\257\20=\377\303\274\21B\377\1=\6\25\377\231\0\0\0\377\2\1\0\0\377" \ + "o\12'\377\375\274\21B\377\1d\11#\377\222\0\0\0\377\2\30\2\11\377\270" \ + "\21A\377\277\274\21B\377\3\273\21A\377|\13+\377\37\3\13\377\254\0\0\0" \ + "\377\2\0\0\0\240\0\0\0\2\377\0\0\0\0\264\0\0\0\0\2\0\0\0\22\0\0\0\317" \ + "\240\0\0\0\377\2E\6\30\377\247\17:\377\304\274\21B\377\1\177\13-\377" \ + "\232\0\0\0\377\1c\11#\377\377\274\21B\377\1_\11!\377\222\0\0\0\377\1" \ + "r\12(\377\301\274\21B\377\3\273\21A\377z\13+\377\35\3\12\377\253\0\0" \ + "\0\377\2\0\0\0\237\0\0\0\2\377\0\0\0\0\262\0\0\0\0\2\0\0\0\22\0\0\0\316" \ + "\237\0\0\0\377\2\30\2\11\377\202\14.\377\305\274\21B\377\2\263\20\77" \ + "\377\26\2\10\377\231\0\0\0\377\1Q\7\34\377\377\274\21B\377\202\274\21" \ + "B\377\1M\7\33\377\221\0\0\0\377\2\20\1\6\377\257\20=\377\302\274\21B" \ + "\377\3\272\21A\377u\13)\377\22\2\6\377\252\0\0\0\377\2\0\0\0\236\0\0" \ + "\0\2\377\0\0\0\0\260\0\0\0\0\2\0\0\0\22\0\0\0\315\236\0\0\0\377\3\1\0" \ + "\1\377S\7\35\377\265\20\77\377\306\274\21B\377\1K\7\32\377\231\0\0\0" \ + "\377\2;\5\25\377\273\21A\377\377\274\21B\377\202\274\21B\377\2\270\21" \ + "A\3771\4\21\377\221\0\0\0\377\1E\6\30\377\304\274\21B\377\3\265\20@\377" \ + "^\11!\377\7\1\2\377\251\0\0\0\377\2\0\0\0\235\0\0\0\2\377\0\0\0\0\256" \ + "\0\0\0\0\2\0\0\0\21\0\0\0\315\236\0\0\0\377\2%\3\15\377\231\16""6\377" \ + "\307\274\21B\377\1w\13*\377\231\0\0\0\377\2)\4\16\377\265\20@\377\377" \ + "\274\21B\377\204\274\21B\377\2\257\20>\377\35\3\12\377\220\0\0\0\377" \ + "\2\1\0\0\377\216\15""2\377\305\274\21B\377\2\237\16""8\3775\5\23\377" \ + "\251\0\0\0\377\2\0\0\0\235\0\0\0\2\377\0\0\0\0\254\0\0\0\0\2\0\0\0\5" \ + "\0\0\0\274\235\0\0\0\377\3\1\0\0\377V\10\36\377\266\20@\377\307\274\21" \ + "B\377\2\243\17""9\377\13\1\4\377\230\0\0\0\377\2\14\1\4\377\245\17:\377" \ + "\377\274\21B\377\206\274\21B\377\2\236\16""7\377\12\1\4\377\220\0\0\0" \ + "\377\2\33\2\11\377\262\20>\377\306\274\21B\377\2x\13*\377\16\1\5\377" \ + "\250\0\0\0\377\1\0\0\0\204\377\0\0\0\0\253\0\0\0\0\2\0\0\0\1\0\0\0\251" \ + "\235\0\0\0\377\2\16\1\5\377\205\14/\377\310\274\21B\377\2\270\21@\377" \ + "(\4\16\377\231\0\0\0\377\1\200\14-\377\377\274\21B\377\210\274\21B\377" \ + "\1\200\14-\377\221\0\0\0\377\1=\6\25\377\307\274\21B\377\2\260\20>\377" \ + "K\7\32\377\250\0\0\0\377\1\0\0\0l\377\0\0\0\0\252\0\0\0\0\1\0\0\0\204" \ + "\235\0\0\0\377\2""2\5\22\377\254\20<\377\311\274\21B\377\1E\6\30\377" \ + "\231\0\0\0\377\1E\6\30\377\377\274\21B\377\212\274\21B\377\1E\6\30\377" \ + "\221\0\0\0\377\1t\12)\377\310\274\21B\377\2}\13,\377\15\1\4\377\246\0" \ + "\0\0\377\2\0\0\0\374\0\0\0O\377\0\0\0\0\250\0\0\0\0\1\0\0\0h\235\0\0" \ + "\0\377\2P\7\34\377\270\21@\377\311\274\21B\377\1o\12'\377\231\0\0\0\377" \ + "\2\30\2\11\377\262\20>\377\377\274\21B\377\212\274\21B\377\2\260\20>" \ + "\377\23\2\7\377\220\0\0\0\377\2\10\1\3\377\236\16""7\377\310\274\21B" \ + "\377\2\244\17:\377(\4\16\377\246\0\0\0\377\2\0\0\0\363\0\0\0""1\377\0" \ + "\0\0\0\246\0\0\0\0\2\0\0\0E\0\0\0\372\233\0\0\0\377\2\6\1\2\377{\13+" \ + "\377\312\274\21B\377\2\207\14/\377\2\0\1\377\231\0\0\0\377\1\200\14-" \ + "\377\377\274\21B\377\214\274\21B\377\1\200\14-\377\221\0\0\0\377\2\30" \ + "\2\10\377\255\20=\377\310\274\21B\377\3\271\21A\377^\11!\377\1\0\1\377" \ + "\245\0\0\0\377\2\0\0\0\346\0\0\0\36\377\0\0\0\0\244\0\0\0\0\2\0\0\0'" \ + "\0\0\0\355\233\0\0\0\377\2\14\1\4\377\211\14""0\377\312\274\21B\377\2" \ + "\246\17:\377\20\1\6\377\231\0\0\0\377\1/\4\21\377\377\274\21B\377\216" \ + "\274\21B\377\1""6\5\23\377\221\0\0\0\377\2""6\5\23\377\272\21A\377\311" \ + "\274\21B\377\2\177\13-\377\11\1\3\377\245\0\0\0\377\2\0\0\0\314\0\0\0" \ + "\13\377\0\0\0\0\242\0\0\0\0\2\0\0\0\20\0\0\0\333\233\0\0\0\377\2\31\2" \ + "\11\377\236\16""7\377\312\274\21B\377\2\261\20>\377\40\3\13\377\232\0" \ + "\0\0\377\1\221\15""3\377\377\274\21B\377\216\274\21B\377\2\233\16""6" \ + "\377\1\0\1\377\221\0\0\0\377\1R\7\35\377\312\274\21B\377\2\241\17""8" \ + "\377\33\2\12\377\245\0\0\0\377\2\0\0\0\261\0\0\0\1\377\0\0\0\0\240\0" \ + "\0\0\0\2\0\0\0\2\0\0\0\263\233\0\0\0\377\2#\3\14\377\254\20<\377\312" \ + "\274\21B\377\2\267\21@\377-\4\20\377\232\0\0\0\377\1""3\5\22\377\377" \ + "\274\21B\377\220\274\21B\377\1:\5\24\377\222\0\0\0\377\1y\13*\377\312" \ + "\274\21B\377\2\251\17;\377&\3\15\377\245\0\0\0\377\1\0\0\0v\377\0\0\0" \ + "\0\240\0\0\0\0\1\0\0\0u\233\0\0\0\377\2*\4\17\377\260\20>\377\312\274" \ + "\21B\377\2\273\21B\377@\6\27\377\233\0\0\0\377\1\206\14/\377\377\274" \ + "\21B\377\220\274\21B\377\1\216\15""2\377\222\0\0\0\377\2\6\1\2\377\221" \ + "\15""3\377\312\274\21B\377\2\265\20\77\377<\5\25\377\244\0\0\0\377\2" \ + "\0\0\0\372\0\0\0<\377\0\0\0\0\236\0\0\0\0\2\0\0\0>\0\0\0\375\232\0\0" \ + "\0\377\2""2\5\22\377\264\20\77\377\313\274\21B\377\1]\10!\377\233\0\0" \ + "\0\377\2\22\2\6\377\272\21A\377\377\274\21B\377\221\274\21B\377\1\40" \ + "\3\13\377\222\0\0\0\377\2\12\1\4\377\233\16""6\377\312\274\21B\377\2" \ + "\273\21B\377R\7\35\377\244\0\0\0\377\2\0\0\0\346\0\0\0\24\377\0\0\0\0" \ + "\234\0\0\0\0\2\0\0\0\15\0\0\0\336\232\0\0\0\377\2)\4\16\377\263\20\77" \ + "\377\313\274\21B\377\2v\13)\377\1\0\0\377\233\0\0\0\377\1J\7\32\377\377" \ + "\274\21B\377\222\274\21B\377\1e\11#\377\223\0\0\0\377\2\30\2\10\377\253" \ + "\17<\377\312\274\21B\377\2\273\21B\377V\10\36\377\244\0\0\0\377\1\0\0" \ + "\0\257\377\0\0\0\0\234\0\0\0\0\1\0\0\0\234\232\0\0\0\377\2%\3\15\377" \ + "\262\20>\377\313\274\21B\377\2|\13+\377\1\0\1\377\234\0\0\0\377\1w\13" \ + "*\377\377\274\21B\377\222\274\21B\377\1\244\17""9\377\224\0\0\0\377\2" \ + "&\3\15\377\264\20\77\377\313\274\21B\377\1d\11#\377\244\0\0\0\377\1\0" \ + "\0\0b\377\0\0\0\0\232\0\0\0\0\2\0\0\0F\0\0\0\376\231\0\0\0\377\2\35\3" \ + "\12\377\255\20=\377\313\274\21B\377\2\207\14/\377\4\0\1\377\235\0\0\0" \ + "\377\1\231\16""6\377\377\274\21B\377\223\274\21B\377\1\33\2\12\377\224" \ + "\0\0\0\377\2>\6\26\377\272\21A\377\313\274\21B\377\1Z\10\40\377\243\0" \ + "\0\0\377\2\0\0\0\357\0\0\0\32\377\0\0\0\0\230\0\0\0\0\2\0\0\0\21\0\0" \ + "\0\346\231\0\0\0\377\2\17\1\5\377\240\16""8\377\313\274\21B\377\2\227" \ + "\16""5\377\12\1\4\377\236\0\0\0\377\1\253\17<\377\377\274\21B\377\223" \ + "\274\21B\377\1K\7\32\377\225\0\0\0\377\2D\6\30\377\273\21A\377\313\274" \ + "\21B\377\1T\10\36\377\243\0\0\0\377\1\0\0\0\266\377\0\0\0\0\230\0\0\0" \ + "\0\1\0\0\0\233\231\0\0\0\377\2\4\0\1\377\217\15""2\377\313\274\21B\377" \ + "\2\237\16""8\377\20\1\6\377\237\0\0\0\377\1\262\20\77\377\377\274\21" \ + "B\377\223\274\21B\377\1n\12'\377\226\0\0\0\377\1O\7\34\377\313\274\21" \ + "B\377\2\273\21B\377G\6\31\377\243\0\0\0\377\1\0\0\0_\377\0\0\0\0\226" \ + "\0\0\0\0\2\0\0\0=\0\0\0\376\231\0\0\0\377\1w\13*\377\313\274\21B\377" \ + "\2\234\16""7\377\17\1\5\377\240\0\0\0\377\1\254\20<\377\377\274\21B\377" \ + "\223\274\21B\377\1\213\15""1\377\227\0\0\0\377\1g\11$\377\313\274\21" \ + "B\377\2\267\21@\3771\4\21\377\242\0\0\0\377\2\0\0\0\353\0\0\0\22\377" \ + "\0\0\0\0\224\0\0\0\0\2\0\0\0\5\0\0\0\325\231\0\0\0\377\1M\7\33\377\313" \ + "\274\21B\377\2\234\16""7\377\20\1\6\377\241\0\0\0\377\1\237\16""8\377" \ + "\377\274\21B\377\223\274\21B\377\1\237\16""8\377\227\0\0\0\377\2\1\0" \ + "\0\377t\12)\377\313\274\21B\377\2\260\20>\377\33\2\12\377\242\0\0\0\377" \ + "\1\0\0\0\231\377\0\0\0\0\224\0\0\0\0\1\0\0\0n\231\0\0\0\377\2(\4\16\377" \ + "\267\21@\377\312\274\21B\377\2\242\17""9\377\25\2\10\377\242\0\0\0\377" \ + "\1\206\14/\377\377\274\21B\377\223\274\21B\377\1\251\17;\377\230\0\0" \ + "\0\377\2\1\0\0\377o\12'\377\313\274\21B\377\2\241\17""8\377\14\1\4\377" \ + "\241\0\0\0\377\2\0\0\0\375\0\0\0""6\377\0\0\0\0\222\0\0\0\0\2\0\0\0\22" \ + "\0\0\0\354\230\0\0\0\377\2\16\1\5\377\247\17;\377\312\274\21B\377\2\235" \ + "\16""7\377\21\2\6\377\243\0\0\0\377\1h\11$\377\377\274\21B\377\223\274" \ + "\21B\377\1\255\20=\377\231\0\0\0\377\2\1\0\0\377o\12'\377\313\274\21" \ + "B\377\2\210\14""0\377\2\0\1\377\241\0\0\0\377\1\0\0\0\301\377\0\0\0\0" \ + "\222\0\0\0\0\1\0\0\0\222\231\0\0\0\377\1\200\14-\377\312\274\21B\377" \ + "\2\236\16""7\377\21\2\6\377\244\0\0\0\377\1>\6\26\377\377\274\21B\377" \ + "\223\274\21B\377\1\244\17:\377\232\0\0\0\377\2\2\0\1\377z\13+\377\313" \ + "\274\21B\377\1]\10!\377\242\0\0\0\377\1\0\0\0V\377\0\0\0\0\220\0\0\0" \ + "\0\2\0\0\0%\0\0\0\372\230\0\0\0\377\1K\7\32\377\312\274\21B\377\2\242" \ + "\17""9\377\25\2\7\377\245\0\0\0\377\2\16\1\5\377\272\21A\377\377\274" \ + "\21B\377\222\274\21B\377\1\226\16""5\377\233\0\0\0\377\2\1\0\1\377v\13" \ + ")\377\312\274\21B\377\2\273\21A\3773\5\22\377\241\0\0\0\377\2\0\0\0\336" \ + "\0\0\0\6\377\0\0\0\0\217\0\0\0\0\1\0\0\0\252\230\0\0\0\377\2\33\2\12" \ + "\377\263\20\77\377\311\274\21B\377\2\247\17:\377\31\2\11\377\247\0\0" \ + "\0\377\1\217\15""2\377\377\274\21B\377\222\274\21B\377\1~\13,\377\234" \ + "\0\0\0\377\2\1\0\1\377w\13*\377\312\274\21B\377\2\253\17<\377\21\2\6" \ + "\377\241\0\0\0\377\1\0\0\0l\377\0\0\0\0\216\0\0\0\0\2\0\0\0""0\0\0\0" \ + "\376\227\0\0\0\377\2\1\0\1\377\223\15""4\377\311\274\21B\377\2\243\17" \ + "9\377\25\2\10\377\250\0\0\0\377\1K\7\32\377\377\274\21B\377\222\274\21" \ + "B\377\1`\11\"\377\235\0\0\0\377\2\2\0\1\377x\13*\377\312\274\21B\377" \ + "\2\206\14/\377\1\0\0\377\240\0\0\0\377\2\0\0\0\346\0\0\0\11\377\0\0\0" \ + "\0\215\0\0\0\0\1\0\0\0\257\230\0\0\0\377\1K\7\32\377\311\274\21B\377" \ + "\2\244\17""9\377\26\2\10\377\251\0\0\0\377\2\12\1\3\377\262\20\77\377" \ + "\377\274\21B\377\221\274\21B\377\1""5\5\23\377\236\0\0\0\377\2\4\0\1" \ + "\377\200\14-\377\312\274\21B\377\1K\7\32\377\241\0\0\0\377\1\0\0\0q\377" \ + "\0\0\0\0\214\0\0\0\0\2\0\0\0-\0\0\0\376\227\0\0\0\377\2\17\1\5\377\255" \ + "\20=\377\310\274\21B\377\2\246\17:\377\33\2\12\377\253\0\0\0\377\1e\11" \ + "#\377\377\274\21B\377\220\274\21B\377\2\266\20@\377\11\1\3\377\237\0" \ + "\0\0\377\2\2\0\1\377z\13+\377\311\274\21B\377\2\265\20\77\377\30\2\11" \ + "\377\240\0\0\0\377\2\0\0\0\347\0\0\0\11\377\0\0\0\0\213\0\0\0\0\1\0\0" \ + "\0\246\230\0\0\0\377\1z\13+\377\310\274\21B\377\2\233\16""6\377\22\2" \ + "\6\377\254\0\0\0\377\2\20\1\6\377\263\20\77\377\377\274\21B\377\217\274" \ + "\21B\377\1\204\14.\377\241\0\0\0\377\2\2\0\1\377z\13+\377\311\274\21" \ + "B\377\1\206\14/\377\241\0\0\0\377\1\0\0\0j\377\0\0\0\0\212\0\0\0\0\2" \ + "\0\0\0\36\0\0\0\373\227\0\0\0\377\2*\4\17\377\273\21B\377\307\274\21" \ + "B\377\2\233\16""6\377\22\2\6\377\256\0\0\0\377\1O\7\34\377\377\274\21" \ + "B\377\217\274\21B\377\1>\6\26\377\242\0\0\0\377\2\5\0\2\377\201\14-\377" \ + "\311\274\21B\377\1:\5\24\377\240\0\0\0\377\2\0\0\0\332\0\0\0\2\377\0" \ + "\0\0\0\211\0\0\0\0\1\0\0\0\215\227\0\0\0\377\2\1\0\0\377\224\15""4\377" \ + "\307\274\21B\377\2\213\15""1\377\11\1\3\377\257\0\0\0\377\2\2\0\1\377" \ + "\227\16""5\377\377\274\21B\377\215\274\21B\377\2\254\20<\377\4\0\2\377" \ + "\243\0\0\0\377\2\2\0\1\377r\12(\377\310\274\21B\377\2\252\17<\377\14" \ + "\1\4\377\240\0\0\0\377\1\0\0\0Q\377\0\0\0\0\210\0\0\0\0\2\0\0\0\16\0" \ + "\0\0\362\227\0\0\0\377\1>\6\26\377\307\274\21B\377\2\207\14/\377\7\1" \ + "\3\377\261\0\0\0\377\2!\3\14\377\270\21A\377\377\274\21B\377\214\274" \ + "\21B\377\1V\10\36\377\245\0\0\0\377\2\1\0\1\377o\12'\377\310\274\21B" \ + "\377\1d\11#\377\240\0\0\0\377\1\0\0\0\300\377\0\0\0\0\210\0\0\0\0\1\0" \ + "\0\0j\227\0\0\0\377\2\4\0\2\377\243\17""9\377\306\274\21B\377\2~\13," \ + "\377\4\0\2\377\263\0\0\0\377\1a\11\"\377\377\274\21B\377\213\274\21B" \ + "\377\2\254\20<\377\11\1\3\377\247\0\0\0\377\1X\10\37\377\307\274\21B" \ + "\377\2\270\21@\377\31\2\11\377\237\0\0\0\377\2\0\0\0\376\0\0\0-\377\0" \ + "\0\0\0\206\0\0\0\0\2\0\0\0\1\0\0\0\330\227\0\0\0\377\1J\7\32\377\306" \ + "\274\21B\377\2}\13,\377\4\0\1\377\264\0\0\0\377\2\1\0\0\377|\13+\377" \ + "\377\274\21B\377\212\274\21B\377\1C\6\30\377\251\0\0\0\377\2P\7\34\377" \ + "\273\21B\377\306\274\21B\377\1w\13*\377\240\0\0\0\377\1\0\0\0\230\377" \ + "\0\0\0\0\206\0\0\0\0\1\0\0\0""9\227\0\0\0\377\2\4\0\2\377\247\17:\377" \ + "\305\274\21B\377\2i\12%\377\1\0\0\377\266\0\0\0\377\2\12\1\4\377\235" \ + "\16""7\377\377\274\21B\377\210\274\21B\377\2\214\15""1\377\1\0\0\377" \ + "\252\0\0\0\377\2K\7\32\377\273\21A\377\305\274\21B\377\2\273\21A\377" \ + "%\3\15\377\237\0\0\0\377\2\0\0\0\361\0\0\0\12\377\0\0\0\0\205\0\0\0\0" \ + "\1\0\0\0\233\227\0\0\0\377\1E\6\30\377\305\274\21B\377\1^\11!\377\271" \ + "\0\0\0\377\2\32\2\11\377\256\20=\377\377\274\21B\377\206\274\21B\377" \ + "\2\261\20>\377\26\2\10\377\254\0\0\0\377\2H\7\31\377\272\21A\377\305" \ + "\274\21B\377\1\204\14.\377\240\0\0\0\377\1\0\0\0]\377\0\0\0\0\204\0\0" \ + "\0\0\2\0\0\0\14\0\0\0\363\226\0\0\0\377\2\1\0\1\377\236\16""7\377\304" \ + "\274\21B\377\1X\10\37\377\273\0\0\0\377\2#\3\14\377\255\20=\377\377\274" \ + "\21B\377\204\274\21B\377\2\272\21A\3779\5\24\377\256\0\0\0\377\2""8\5" \ + "\24\377\266\20@\377\305\274\21B\377\1)\4\16\377\237\0\0\0\377\1\0\0\0" \ + "\300\377\0\0\0\0\204\0\0\0\0\1\0\0\0X\227\0\0\0\377\1""7\5\23\377\303" \ + "\274\21B\377\2\273\21A\377S\10\35\377\275\0\0\0\377\2\34\3\12\377\250" \ + "\17;\377\377\274\21B\377\203\274\21B\377\1H\7\31\377\260\0\0\0\377\2" \ + "/\4\21\377\262\20\77\377\304\274\21B\377\1\177\13-\377\237\0\0\0\377" \ + "\2\0\0\0\375\0\0\0\34\377\0\0\0\0\203\0\0\0\0\1\0\0\0\262\227\0\0\0\377" \ + "\1\214\15""1\377\302\274\21B\377\2\266\20@\377\77\6\26\377\277\0\0\0" \ + "\377\2\30\2\10\377\244\17""9\377\377\274\21B\377\2\274\21B\377_\11!\377" \ + "\262\0\0\0\377\2'\4\16\377\256\20=\377\303\274\21B\377\2\273\21A\377" \ + "\37\3\13\377\237\0\0\0\377\1\0\0\0u\377\0\0\0\0\202\0\0\0\0\2\0\0\0\22" \ + "\0\0\0\372\226\0\0\0\377\1\40\3\13\377\302\274\21B\377\2\253\17<\377" \ + "'\4\16\377\301\0\0\0\377\2\32\2\11\377\234\16""7\377\376\274\21B\377" \ + "\2r\12(\377\1\0\0\377\263\0\0\0\377\2'\4\16\377\254\20<\377\303\274\21" \ + "B\377\1q\12(\377\237\0\0\0\377\1\0\0\0\314\377\0\0\0\0\202\0\0\0\0\1" \ + "\0\0\0b\227\0\0\0\377\1i\12%\377\301\274\21B\377\2\237\16""8\377\30\2" \ + "\11\377\303\0\0\0\377\2\6\1\2\377w\13*\377\374\274\21B\377\1X\10\37\377" \ + "\266\0\0\0\377\2\32\2\11\377\240\16""8\377\302\274\21B\377\2\267\21@" \ + "\377\21\2\6\377\237\0\0\0\377\1\0\0\0%\377\0\0\0\0\2\0\0\0\0\0\0\0\263" \ + "\226\0\0\0\377\2\7\1\3\377\260\20>\377\300\274\21B\377\2\220\15""2\377" \ + "\15\1\5\377\306\0\0\0\377\2R\7\35\377\272\21A\377\370\274\21B\377\2\271" \ + "\21A\377G\6\31\377\270\0\0\0\377\2\14\1\4\377\215\15""1\377\302\274\21" \ + "B\377\1Z\10\40\377\237\0\0\0\377\1\0\0\0u\377\0\0\0\0\2\0\0\0\12\0\0" \ + "\0\367\226\0\0\0\377\1D\6\30\377\300\274\21B\377\2}\13,\377\5\0\2\377" \ + "\310\0\0\0\377\2:\5\24\377\254\20<\377\366\274\21B\377\2\263\20\77\377" \ + "@\6\27\377\272\0\0\0\377\2\4\0\2\377y\13*\377\301\274\21B\377\2\244\17" \ + "9\377\1\0\1\377\236\0\0\0\377\1\0\0\0\303\377\0\0\0\0\1\0\0\0M\227\0" \ + "\0\0\377\1\212\14""0\377\277\274\21B\377\2r\12(\377\3\0\1\377\312\0\0" \ + "\0\377\3\13\1\4\377q\12(\377\273\21B\377\363\274\21B\377\2\221\15""3" \ + "\377\27\2\10\377\274\0\0\0\377\2\1\0\0\377^\11!\377\301\274\21B\377\1" \ + "4\5\22\377\236\0\0\0\377\2\0\0\0\374\0\0\0\24\376\0\0\0\0\1\0\0\0\230" \ + "\226\0\0\0\377\2\20\1\6\377\272\21A\377\275\274\21B\377\2\273\21A\377" \ + "R\7\35\377\316\0\0\0\377\2.\4\20\377\241\17""8\377\360\274\21B\377\3" \ + "\273\21A\377^\11!\377\3\0\1\377\277\0\0\0\377\2I\7\32\377\271\21A\377" \ + "\277\274\21B\377\1~\13,\377\237\0\0\0\377\1\0\0\0\\\376\0\0\0\0\1\0\0" \ + "\0\340\226\0\0\0\377\1L\7\33\377\275\274\21B\377\2\265\20@\377<\5\25" \ + "\377\320\0\0\0\377\3\13\1\4\377m\12&\377\271\21A\377\355\274\21B\377" \ + "\2\245\17:\3778\5\24\377\302\0\0\0\377\2\77\6\26\377\266\20@\377\276" \ + "\274\21B\377\2\267\21@\377\15\1\4\377\236\0\0\0\377\1\0\0\0\244\375\0" \ + "\0\0\0\1\0\0\0'\227\0\0\0\377\1\211\14""0\377\274\274\21B\377\2\255\20" \ + "=\377*\4\17\377\323\0\0\0\377\3\25\2\10\377q\12(\377\273\21A\377\351" \ + "\274\21B\377\3\262\20>\377R\7\35\377\4\0\1\377\304\0\0\0\377\2'\4\16" \ + "\377\253\17<\377\276\274\21B\377\1I\7\32\377\236\0\0\0\377\2\0\0\0\351" \ + "\0\0\0\1\374\0\0\0\0\1\0\0\0i\226\0\0\0\377\2\15\1\4\377\270\21A\377" \ + "\273\274\21B\377\2\245\17:\377\"\3\14\377\326\0\0\0\377\2&\3\15\377\214" \ + "\15""1\377\346\274\21B\377\3\273\21A\377q\12(\377\22\2\6\377\307\0\0" \ + "\0\377\2\30\2\11\377\237\16""8\377\275\274\21B\377\1\206\14/\377\237" \ + "\0\0\0\377\1\0\0\0,\374\0\0\0\0\1\0\0\0\252\226\0\0\0\377\1E\6\30\377" \ + "\273\274\21B\377\2\222\15""3\377\21\2\6\377\330\0\0\0\377\3\1\0\0\377" \ + "<\5\25\377\224\15""4\377\342\274\21B\377\3\273\21B\377\203\14.\377*\4" \ + "\17\377\312\0\0\0\377\2\15\1\5\377\217\15""2\377\274\274\21B\377\2\270" \ + "\21A\377\15\1\5\377\236\0\0\0\377\1\0\0\0m\373\0\0\0\0\2\0\0\0\2\0\0" \ + "\0\354\226\0\0\0\377\1|\13+\377\272\274\21B\377\2m\12&\377\3\0\1\377" \ + "\334\0\0\0\377\3$\3\15\377w\13*\377\272\21A\377\335\274\21B\377\3\266" \ + "\20@\377k\12&\377\31\2\11\377\315\0\0\0\377\2\11\1\3\377\202\14.\377" \ + "\274\274\21B\377\1C\6\30\377\236\0\0\0\377\1\0\0\0\256\373\0\0\0\0\1" \ + "\0\0\0)\226\0\0\0\377\2\1\0\1\377\256\20=\377\270\274\21B\377\2\271\21" \ + "A\377K\7\32\377\340\0\0\0\377\3\"\3\14\377y\13*\377\270\21A\377\331\274" \ + "\21B\377\3\257\20>\377k\12&\377\30\2\11\377\320\0\0\0\377\2\1\0\1\377" \ + "e\11#\377\273\274\21B\377\1\200\14-\377\236\0\0\0\377\1\0\0\0\352\373" \ + "\0\0\0\0\1\0\0\0a\226\0\0\0\377\1%\3\15\377\270\274\21B\377\2\260\20" \ + ">\3774\5\22\377\343\0\0\0\377\4\13\1\4\377E\6\30\377\204\14.\377\272" \ + "\21A\377\323\274\21B\377\4\271\21A\377}\13,\3772\5\22\377\2\0\1\377\324" \ + "\0\0\0\377\2\77\6\26\377\265\20\77\377\271\274\21B\377\2\262\20\77\377" \ + "\4\0\1\377\236\0\0\0\377\1\0\0\0$\372\0\0\0\0\1\0\0\0\230\226\0\0\0\377" \ + "\1X\10\37\377\267\274\21B\377\2\237\16""8\377\33\2\12\377\347\0\0\0\377" \ + "\3\34\3\12\377_\11!\377\243\17""9\377\317\274\21B\377\3\245\17:\377f" \ + "\11$\377\34\3\12\377\330\0\0\0\377\2#\3\14\377\247\17:\377\271\274\21" \ + "B\377\1,\4\20\377\236\0\0\0\377\1\0\0\0[\372\0\0\0\0\1\0\0\0\320\226" \ + "\0\0\0\377\1\210\14""0\377\266\274\21B\377\2\223\15""4\377\22\2\6\377" \ + "\352\0\0\0\377\5\1\0\0\377'\4\16\377^\11!\377\226\16""5\377\273\21B\377" \ + "\307\274\21B\377\4\273\21B\377\227\16""5\377]\10!\377#\3\14\377\334\0" \ + "\0\0\377\2\23\2\7\377\225\15""4\377\270\274\21B\377\1_\11!\377\236\0" \ + "\0\0\377\1\0\0\0\222\371\0\0\0\0\2\0\0\0\12\0\0\0\373\225\0\0\0\377\2" \ + "\3\0\1\377\265\20\77\377\265\274\21B\377\2m\12&\377\3\0\1\377\357\0\0" \ + "\0\377\4\22\2\6\377J\7\32\377\201\14-\377\264\20\77\377\301\274\21B\377" \ + "\4\255\20=\377\202\14.\377N\7\33\377\25\2\10\377\340\0\0\0\377\2\6\1" \ + "\2\377z\13+\377\267\274\21B\377\1\222\15""3\377\236\0\0\0\377\1\0\0\0" \ + "\310\371\0\0\0\0\1\0\0\0""8\226\0\0\0\377\1\40\3\13\377\264\274\21B\377" \ + "\2\271\21A\377K\7\32\377\364\0\0\0\377\5\4\0\2\377*\4\17\377U\10\36\377" \ + "\201\14-\377\253\17<\377\271\274\21B\377\4\241\17""8\377u\13)\377I\7" \ + "\32\377\35\3\12\377\345\0\0\0\377\2\2\0\1\377g\11$\377\266\274\21B\377" \ + "\2\270\21A\377\12\1\4\377\235\0\0\0\377\2\0\0\0\367\0\0\0\4\370\0\0\0" \ + "\0\1\0\0\0e\226\0\0\0\377\1H\7\31\377\263\274\21B\377\2\261\20>\3774" \ + "\5\22\377\372\0\0\0\377\5\33\2\12\377F\6\31\377p\12'\377\222\15""3\377" \ + "\260\20>\377\256\274\21B\377\6\270\21@\377\231\16""6\377w\13*\377V\10" \ + "\36\3773\5\22\377\20\1\6\377\353\0\0\0\377\2\77\6\26\377\265\20@\377" \ + "\265\274\21B\377\1""4\5\22\377\236\0\0\0\377\1\0\0\0(\370\0\0\0\0\1\0" \ + "\0\0\222\226\0\0\0\377\1n\12'\377\262\274\21B\377\2\241\17""8\377\"\3" \ + "\14\377\377\0\0\0\377\10\0\0\0\377\22\2\6\3771\4\21\377P\7\34\377o\12" \ + "'\377\215\15""1\377\247\17:\377\267\21@\377\240\274\21B\377\10\262\20" \ + ">\377\234\16""7\377\205\14/\377o\12'\377Z\10\40\377B\6\27\377!\3\14\377" \ + "\4\0\1\377\361\0\0\0\377\2)\4\16\377\252\17<\377\264\274\21B\377\1[\10" \ + "\40\377\236\0\0\0\377\1\0\0\0U\370\0\0\0\0\1\0\0\0\300\226\0\0\0\377" \ + "\1\226\16""5\377\261\274\21B\377\2{\13+\377\11\1\3\377\377\0\0\0\377" \ + "\211\0\0\0\377\15\15\1\5\377\37\3\13\3770\4\21\377C\6\30\377S\10\35\377" \ + "f\11$\377q\12(\377y\13*\377}\13,\377\212\14""0\377\216\15""2\377\226" \ + "\16""5\377\240\16""8\377\205\243\17""9\377\204\226\16""5\377\12\213\15" \ + "1\377\177\13-\377r\12(\377e\11#\377X\10\37\377L\7\33\377\77\6\26\377" \ + "2\5\22\377\40\3\13\377\13\1\4\377\372\0\0\0\377\2\24\2\7\377\226\16""5" \ + "\377\263\274\21B\377\1\202\14.\377\236\0\0\0\377\1\0\0\0\202\370\0\0" \ + "\0\0\1\0\0\0\353\225\0\0\0\377\2\3\0\1\377\267\21@\377\257\274\21B\377" \ + "\3\271\21A\377W\10\37\377\1\0\0\377\377\0\0\0\377\377\0\0\0\377\246\0" \ + "\0\0\377\2\12\1\3\377~\13,\377\262\274\21B\377\1\251\17;\377\236\0\0" \ + "\0\377\1\0\0\0\255\367\0\0\0\0\1\0\0\0\25\226\0\0\0\377\1\35\3\12\377" \ + "\257\274\21B\377\2\245\17:\377&\3\15\377\377\0\0\0\377\377\0\0\0\377" \ + "\252\0\0\0\377\2K\7\32\377\267\21@\377\261\274\21B\377\1\25\2\10\377" \ + "\235\0\0\0\377\1\0\0\0\326\367\0\0\0\0\1\0\0\0""8\226\0\0\0\377\1:\5" \ + "\24\377\256\274\21B\377\2\211\14""0\377\17\1\5\377\377\0\0\0\377\344" \ + "\0\0\0\377\6\4\0\1\377\23\2\7\377%\3\15\3777\5\23\377\77\6\26\377E\6" \ + "\30\377\205K\7\32\377\5\77\6\26\3775\5\23\377+\4\17\377\"\3\14\377\15" \ + "\1\5\377\267\0\0\0\377\2-\4\20\377\252\17<\377\260\274\21B\377\1:\5\24" \ + "\377\235\0\0\0\377\2\0\0\0\370\0\0\0\3\366\0\0\0\0\1\0\0\0\\\226\0\0" \ + "\0\377\1V\10\36\377\254\274\21B\377\3\273\21A\377^\11!\377\2\0\1\377" \ + "\377\0\0\0\377\337\0\0\0\377\6\13\1\4\3771\4\21\377V\10\36\377r\12(\377" \ + "\215\15""1\377\250\17;\377\220\274\21B\377\7\262\20>\377\232\16""6\377" \ + "\201\14-\377d\11#\377E\6\30\377&\3\15\377\10\1\3\377\261\0\0\0\377\2" \ + "\16\1\5\377\210\14""0\377\257\274\21B\377\1X\10\37\377\236\0\0\0\377" \ + "\1\0\0\0\37\366\0\0\0\0\1\0\0\0\200\226\0\0\0\377\1r\12(\377\253\274" \ + "\21B\377\2\257\20>\3778\5\24\377\377\0\0\0\377\335\0\0\0\377\5\23\2\7" \ + "\377E\6\30\377w\13*\377\240\16""8\377\273\21B\377\233\274\21B\377\5\271" \ + "\21A\377\231\16""6\377p\12'\377H\6\31\377\30\2\11\377\256\0\0\0\377\3" \ + "\1\0\0\377X\10\37\377\273\21A\377\255\274\21B\377\1t\13)\377\236\0\0" \ + "\0\377\1\0\0\0C\366\0\0\0\0\1\0\0\0\242\226\0\0\0\377\1\217\15""2\377" \ + "\252\274\21B\377\2\231\16""6\377\33\2\11\377\377\0\0\0\377\333\0\0\0" \ + "\377\3&\3\15\377d\11#\377\235\16""7\377\245\274\21B\377\4\241\17""9\377" \ + "o\12'\377;\5\25\377\7\1\2\377\254\0\0\0\377\2""7\5\23\377\257\20=\377" \ + "\254\274\21B\377\1\221\15""3\377\236\0\0\0\377\1\0\0\0f\366\0\0\0\0\1" \ + "\0\0\0\302\226\0\0\0\377\1\247\17;\377\251\274\21B\377\2}\13,\377\11" \ + "\1\3\377\306\0\0\0\377\5\17\1\5\377#\3\14\377-\4\20\3777\5\23\377@\6" \ + "\27\377\205K\7\32\377\6E\6\30\377\77\6\26\3776\5\23\377#\3\14\377\22" \ + "\2\6\377\3\0\1\377\377\0\0\0\377\203\0\0\0\377\3\35\3\12\377d\11#\377" \ + "\244\17:\377\253\274\21B\377\4\264\20\77\377}\13,\377@\6\27\377\10\1" \ + "\3\377\252\0\0\0\377\2\25\2\10\377\224\15""4\377\253\274\21B\377\1\256" \ + "\20=\377\236\0\0\0\377\1\0\0\0\206\366\0\0\0\0\1\0\0\0\336\225\0\0\0" \ + "\377\2\1\0\1\377\271\21A\377\247\274\21B\377\2\264\20\77\377E\6\30\377" \ + "\301\0\0\0\377\7\12\1\3\377)\4\16\377H\7\31\377f\11$\377\203\14.\377" \ + "\234\16""7\377\264\20\77\377\217\274\21B\377\7\273\21B\377\246\17:\377" \ + "\213\15""1\377o\12'\377S\7\35\377.\4\20\377\11\1\3\377\371\0\0\0\377" \ + "\4\5\0\2\377E\6\30\377\217\15""2\377\273\21B\377\260\274\21B\377\4\264" \ + "\20\77\377w\13*\3773\5\22\377\1\0\1\377\250\0\0\0\377\2\5\0\2\377k\12" \ + "&\377\253\274\21B\377\1\16\1\5\377\235\0\0\0\377\1\0\0\0\241\365\0\0" \ + "\0\0\2\0\0\0\1\0\0\0\370\225\0\0\0\377\1\17\1\5\377\247\274\21B\377\2" \ + "\231\16""6\377\35\3\12\377\276\0\0\0\377\5\34\3\12\377J\7\32\377t\12" \ + ")\377\234\16""7\377\273\21A\377\233\274\21B\377\5\272\21A\377\234\16" \ + "7\377r\12(\377A\6\27\377\20\1\6\377\363\0\0\0\377\3\14\1\4\377X\10\37" \ + "\377\252\17<\377\266\274\21B\377\3\250\17;\377^\11!\377\22\2\6\377\250" \ + "\0\0\0\377\2O\7\34\377\270\21@\377\251\274\21B\377\1&\3\15\377\235\0" \ + "\0\0\377\1\0\0\0\274\365\0\0\0\0\1\0\0\0\25\226\0\0\0\377\1\"\3\14\377" \ + "\246\274\21B\377\2k\12&\377\6\1\2\377\273\0\0\0\377\4\12\1\3\377\77\6" \ + "\26\377r\12(\377\245\17:\377\244\274\21B\377\4\273\21B\377\231\16""6" \ + "\377^\11!\377!\3\14\377\356\0\0\0\377\3\14\1\4\377b\11\"\377\262\20\77" \ + "\377\272\274\21B\377\3\270\21@\377z\13+\377)\4\16\377\247\0\0\0\377\2" \ + "\37\3\13\377\234\16""7\377\250\274\21B\377\1""9\5\24\377\235\0\0\0\377" \ + "\1\0\0\0\327\365\0\0\0\0\1\0\0\0""0\226\0\0\0\377\1""4\5\22\377\244\274" \ + "\21B\377\2\257\20>\377<\5\25\377\272\0\0\0\377\4\14\1\4\377E\6\30\377" \ + "\202\14.\377\266\20@\377\253\274\21B\377\3\240\16""8\377_\11!\377\30" \ + "\2\10\377\351\0\0\0\377\3\7\1\3\377X\10\37\377\257\20=\377\277\274\21" \ + "B\377\3\216\15""2\3777\5\23\377\1\0\0\377\245\0\0\0\377\2\7\1\2\377q" \ + "\12(\377\247\274\21B\377\1K\7\32\377\235\0\0\0\377\1\0\0\0\362\365\0" \ + "\0\0\0\1\0\0\0I\226\0\0\0\377\1E\6\30\377\243\274\21B\377\2\224\15""4" \ + "\377\35\3\12\377\270\0\0\0\377\4\4\0\1\3778\5\24\377}\13,\377\266\20" \ + "@\377\260\274\21B\377\4\273\21A\377\210\14""0\377\77\6\26\377\3\0\1\377" \ + "\345\0\0\0\377\2""7\5\23\377\245\17:\377\303\274\21B\377\3\232\16""6" \ + "\377=\6\25\377\1\0\0\377\245\0\0\0\377\2E\6\30\377\263\20\77\377\245" \ + "\274\21B\377\1^\10!\377\236\0\0\0\377\1\0\0\0\13\364\0\0\0\0\1\0\0\0" \ + "\\\226\0\0\0\377\1S\10\35\377\241\274\21B\377\3\271\21A\377^\10!\377" \ + "\3\0\1\377\267\0\0\0\377\3\27\2\10\377d\11#\377\254\20<\377\266\274\21" \ + "B\377\3\244\17:\377Q\7\34\377\10\1\3\377\341\0\0\0\377\2\23\2\7\377~" \ + "\13,\377\307\274\21B\377\2\224\15""4\3771\4\21\377\245\0\0\0\377\2\35" \ + "\3\12\377\231\16""6\377\244\274\21B\377\1o\12'\377\236\0\0\0\377\1\0" \ + "\0\0\36\364\0\0\0\0\1\0\0\0n\226\0\0\0\377\1\\\10\40\377\240\274\21B" \ + "\377\2\230\16""5\377\40\3\13\377\267\0\0\0\377\3""0\4\21\377\200\14-" \ + "\377\272\21A\377\272\274\21B\377\3\257\20=\377Z\10\40\377\10\1\3\377" \ + "\336\0\0\0\377\2B\6\27\377\260\20>\377\312\274\21B\377\2\210\14""0\377" \ + "\35\3\12\377\244\0\0\0\377\3\10\1\3\377o\12'\377\273\21B\377\242\274" \ + "\21B\377\1\201\14-\377\236\0\0\0\377\1\0\0\0""1\364\0\0\0\0\1\0\0\0\200" \ + "\226\0\0\0\377\1d\11#\377\236\274\21B\377\3\273\21B\377l\12&\377\7\1" \ + "\2\377\265\0\0\0\377\3\1\0\1\377=\6\25\377\225\15""4\377\277\274\21B" \ + "\377\3\253\17<\377P\7\34\377\4\0\2\377\332\0\0\0\377\2\23\2\7\377\207" \ + "\14/\377\315\274\21B\377\3\273\21A\377w\13*\377\16\1\5\377\244\0\0\0" \ + "\377\2""6\5\23\377\252\17<\377\241\274\21B\377\1\217\15""2\377\236\0" \ + "\0\0\377\1\0\0\0D\364\0\0\0\0\1\0\0\0\223\226\0\0\0\377\1l\12&\377\235" \ + "\274\21B\377\2\236\16""7\377)\4\16\377\265\0\0\0\377\3\1\0\1\377E\6\30" \ + "\377\240\16""8\377\303\274\21B\377\2\237\16""8\377/\4\21\377\330\0\0" \ + "\0\377\2(\4\16\377\247\17;\377\320\274\21B\377\2\250\17;\377<\5\25\377" \ + "\244\0\0\0\377\2\12\1\4\377q\12(\377\240\274\21B\377\1\230\16""5\377" \ + "\236\0\0\0\377\1\0\0\0W\364\0\0\0\0\1\0\0\0\245\226\0\0\0\377\1u\13)" \ + "\377\233\274\21B\377\3\270\21A\377^\11!\377\6\1\2\377\265\0\0\0\377\2" \ + ":\5\24\377\234\16""7\377\306\274\21B\377\3\273\21B\377v\13)\377\17\1" \ + "\5\377\325\0\0\0\377\2X\10\37\377\271\21A\377\323\274\21B\377\2\206\14" \ + "/\377\26\2\10\377\244\0\0\0\377\2C\6\30\377\260\20>\377\236\274\21B\377" \ + "\1\240\16""8\377\236\0\0\0\377\1\0\0\0i\364\0\0\0\0\1\0\0\0\262\226\0" \ + "\0\0\377\1}\13,\377\232\274\21B\377\2\230\16""5\377#\3\14\377\265\0\0" \ + "\0\377\2%\3\15\377\221\15""3\377\312\274\21B\377\2\254\20<\377:\5\24" \ + "\377\322\0\0\0\377\2\2\0\1\377l\12&\377\326\274\21B\377\2\257\20=\377" \ + "D\6\30\377\244\0\0\0\377\2\20\1\6\377w\13*\377\235\274\21B\377\1\251" \ + "\17;\377\236\0\0\0\377\1\0\0\0w\364\0\0\0\0\1\0\0\0\275\226\0\0\0\377" \ + "\1\202\14.\377\230\274\21B\377\3\270\21A\377c\11#\377\7\1\2\377\264\0" \ + "\0\0\377\3\21\2\6\377w\13*\377\273\21B\377\315\274\21B\377\2}\13,\377" \ + "\15\1\5\377\317\0\0\0\377\2\12\1\3\377\211\14""0\377\331\274\21B\377" \ + "\2\201\14-\377\16\1\5\377\244\0\0\0\377\2""8\5\24\377\251\17;\377\233" \ + "\274\21B\377\1\261\20>\377\236\0\0\0\377\1\0\0\0\201\364\0\0\0\0\1\0" \ + "\0\0\310\226\0\0\0\377\1\201\14-\377\227\274\21B\377\2\210\14""0\377" \ + "\32\2\11\377\265\0\0\0\377\2F\6\31\377\255\20=\377\320\274\21B\377\2" \ + "\241\17""8\377\40\3\13\377\315\0\0\0\377\2\15\1\4\377\217\15""2\377\333" \ + "\274\21B\377\2\244\17""9\377*\4\17\377\244\0\0\0\377\2\14\1\4\377q\12" \ + "(\377\232\274\21B\377\1\271\21A\377\236\0\0\0\377\1\0\0\0\214\364\0\0" \ + "\0\0\1\0\0\0\322\226\0\0\0\377\1\200\14-\377\225\274\21B\377\2\247\17" \ + ";\3779\5\24\377\265\0\0\0\377\2\35\3\12\377\221\15""3\377\323\274\21" \ + "B\377\2\266\20@\377G\6\31\377\313\0\0\0\377\2\22\2\6\377\237\16""8\377" \ + "\335\274\21B\377\3\272\21A\377^\11!\377\1\0\1\377\244\0\0\0\377\2>\6" \ + "\26\377\251\17;\377\231\274\21B\377\1\2\0\1\377\235\0\0\0\377\1\0\0\0" \ + "\226\364\0\0\0\0\1\0\0\0\335\226\0\0\0\377\1\177\13-\377\223\274\21B" \ + "\377\3\271\21A\377o\12'\377\17\1\5\377\264\0\0\0\377\3\1\0\0\377P\7\34" \ + "\377\263\20\77\377\325\274\21B\377\3\273\21B\377_\11!\377\1\0\0\377\310" \ + "\0\0\0\377\2\17\1\5\377\232\16""6\377\340\274\21B\377\2\204\14.\377\14" \ + "\1\4\377\244\0\0\0\377\3\7\1\2\377^\11!\377\270\21@\377\227\274\21B\377" \ + "\1\1\0\0\377\235\0\0\0\377\1\0\0\0\241\364\0\0\0\0\1\0\0\0\346\226\0" \ + "\0\0\377\1}\13,\377\221\274\21B\377\3\273\21B\377w\13*\377\26\2\10\377" \ + "\265\0\0\0\377\2\24\2\7\377\214\15""1\377\331\274\21B\377\2\177\13-\377" \ + "\6\1\2\377\306\0\0\0\377\2\12\1\4\377\226\16""5\377\342\274\21B\377\2" \ + "\235\16""7\377\32\2\11\377\245\0\0\0\377\2\34\3\12\377\213\15""1\377" \ + "\226\274\21B\377\236\0\0\0\377\1\0\0\0\253\364\0\0\0\0\1\0\0\0\352\226" \ + "\0\0\0\377\1}\13,\377\220\274\21B\377\2\231\16""6\3773\5\22\377\266\0" \ + "\0\0\377\2""3\5\22\377\252\17<\377\333\274\21B\377\2\205\14/\377\10\1" \ + "\3\377\304\0\0\0\377\2\6\1\2\377\216\15""2\377\344\274\21B\377\2\257" \ + "\20>\3770\4\21\377\245\0\0\0\377\3\2\0\1\377L\7\33\377\254\20<\377\223" \ + "\274\21B\377\1\273\21B\377\236\0\0\0\377\1\0\0\0\257\364\0\0\0\0\1\0" \ + "\0\0\355\226\0\0\0\377\1w\13*\377\216\274\21B\377\3\226\16""5\377;\5" \ + "\25\377\1\0\0\377\265\0\0\0\377\3\4\0\1\377k\12&\377\273\21B\377\335" \ + "\274\21B\377\2\222\15""3\377\12\1\4\377\302\0\0\0\377\2\1\0\1\377}\13" \ + ",\377\346\274\21B\377\2\270\21@\377E\6\30\377\246\0\0\0\377\3\7\1\3\377" \ + "X\10\37\377\262\20\77\377\221\274\21B\377\1\273\21A\377\236\0\0\0\377" \ + "\1\0\0\0\262\364\0\0\0\0\1\0\0\0\360\226\0\0\0\377\1Y\10\37\377\214\274" \ + "\21B\377\2\220\15""2\3777\5\23\377\267\0\0\0\377\2\22\2\6\377\216\15" \ + "2\377\340\274\21B\377\2\222\15""3\377\12\1\4\377\301\0\0\0\377\1^\10" \ + "!\377\350\274\21B\377\2\273\21B\377S\10\35\377\247\0\0\0\377\3\30\2\10" \ + "\377{\13+\377\273\21A\377\217\274\21B\377\1\272\21A\377\236\0\0\0\377" \ + "\1\0\0\0\265\364\0\0\0\0\1\0\0\0\362\226\0\0\0\377\2\26\2\10\377\264" \ + "\20\77\377\210\274\21B\377\3\261\20>\377m\12&\377!\3\14\377\270\0\0\0" \ + "\377\2#\3\14\377\244\17:\377\342\274\21B\377\2\214\15""1\377\6\1\2\377" \ + "\277\0\0\0\377\2>\6\26\377\273\21B\377\352\274\21B\377\2l\12&\377\1\0" \ + "\0\377\247\0\0\0\377\3\37\3\13\377z\13+\377\272\21A\377\215\274\21B\377" \ + "\1\265\20\77\377\236\0\0\0\377\1\0\0\0\270\364\0\0\0\0\1\0\0\0\365\227" \ + "\0\0\0\377\2.\4\20\377\242\17""9\377\204\274\21B\377\4\247\17;\377s\12" \ + "(\377\77\6\26\377\7\1\3\377\271\0\0\0\377\2:\5\24\377\265\20\77\377\344" \ + "\274\21B\377\2\204\14.\377\3\0\1\377\275\0\0\0\377\2\37\3\13\377\263" \ + "\20\77\377\354\274\21B\377\2w\13*\377\3\0\1\377\250\0\0\0\377\3\33\2" \ + "\12\377t\13)\377\267\21@\377\213\274\21B\377\1\225\15""4\377\236\0\0" \ + "\0\377\1\0\0\0\274\363\0\0\0\0\2\0\0\0\12\0\0\0\372\230\0\0\0\377\5\1" \ + "\0\0\377!\3\14\3772\5\22\377*\4\17\377\26\2\10\377\274\0\0\0\377\2^\11" \ + "!\377\273\21B\377\346\274\21B\377\1q\12(\377\274\0\0\0\377\2\4\0\2\377" \ + "\227\16""5\377\356\274\21B\377\2s\12(\377\1\0\0\377\251\0\0\0\377\3\17" \ + "\1\5\377V\10\36\377\240\16""8\377\211\274\21B\377\1I\7\32\377\236\0\0" \ + "\0\377\1\0\0\0\314\363\0\0\0\0\1\0\0\0\203\331\0\0\0\377\1a\11\"\377" \ + "\351\274\21B\377\1M\7\33\377\273\0\0\0\377\1f\11$\377\360\274\21B\377" \ + "\2v\13)\377\1\0\1\377\252\0\0\0\377\5\1\0\0\377-\4\20\377c\11#\377\227" \ + "\16""5\377\273\21A\377\203\274\21B\377\2\262\20\77\377Y\10\37\377\240" \ + "\0\0\0\377\1\0\0\0K\361\0\0\0\0\2\0\0\0\37\0\0\0\366\327\0\0\0\377\2" \ + "\3\0\1\377x\13*\377\352\274\21B\377\2\271\21A\377/\4\21\377\271\0\0\0" \ + "\377\2""1\4\21\377\273\21A\377\361\274\21B\377\2t\12)\377\1\0\0\377\255" \ + "\0\0\0\377\5\15\1\5\377#\3\14\3772\5\22\377*\4\17\377\7\1\3\377\241\0" \ + "\0\0\377\2\0\0\0\327\0\0\0\5\360\0\0\0\0\1\0\0\0\243\327\0\0\0\377\2" \ + "\6\1\2\377\202\14.\377\354\274\21B\377\2\254\20<\377\25\2\7\377\267\0" \ + "\0\0\377\2\6\1\2\377\241\17""8\377\363\274\21B\377\1a\11\"\377\324\0" \ + "\0\0\377\1\0\0\0k\357\0\0\0\0\2\0\0\0""6\0\0\0\376\326\0\0\0\377\2\4" \ + "\0\1\377\200\14-\377\356\274\21B\377\2\213\15""1\377\1\0\1\377\266\0" \ + "\0\0\377\1d\11#\377\365\274\21B\377\1X\10\37\377\323\0\0\0\377\2\0\0" \ + "\0\353\0\0\0\20\355\0\0\0\0\2\0\0\0\1\0\0\0\306\326\0\0\0\377\2\4\0\1" \ + "\377\201\14-\377\360\274\21B\377\1X\10\37\377\265\0\0\0\377\2#\3\14\377" \ + "\271\21A\377\365\274\21B\377\2\273\21B\377J\7\32\377\323\0\0\0\377\1" \ + "\0\0\0\212\355\0\0\0\0\1\0\0\0T\326\0\0\0\377\2\3\0\1\377\200\14-\377" \ + "\361\274\21B\377\2\270\21@\377#\3\14\377\264\0\0\0\377\1\213\15""1\377" \ + "\367\274\21B\377\2\270\21A\3772\5\22\377\322\0\0\0\377\2\0\0\0\371\0" \ + "\0\0$\353\0\0\0\0\2\0\0\0\7\0\0\0\336\326\0\0\0\377\1p\12'\377\363\274" \ + "\21B\377\2\226\16""5\377\2\0\1\377\262\0\0\0\377\1:\5\24\377\371\274" \ + "\21B\377\2\262\20\77\377\37\3\13\377\322\0\0\0\377\1\0\0\0\252\353\0" \ + "\0\0\0\1\0\0\0t\326\0\0\0\377\1l\12&\377\365\274\21B\377\1V\10\36\377" \ + "\261\0\0\0\377\2\4\0\1\377\237\16""8\377\372\274\21B\377\2\237\16""8" \ + "\377\14\1\4\377\322\0\0\0\377\1\0\0\0=\351\0\0\0\0\2\0\0\0(\0\0\0\355" \ + "\325\0\0\0\377\1X\10\37\377\366\274\21B\377\2\265\20\77\377\31\2\11\377" \ + "\260\0\0\0\377\1F\6\31\377\374\274\21B\377\2\201\14-\377\1\0\0\377\321" \ + "\0\0\0\377\2\0\0\0\312\0\0\0\22\346\0\0\0\0\3\0\0\0\6\0\0\0\210\0\0\0" \ + "\372\325\0\0\0\377\2\77\6\26\377\273\21A\377\367\274\21B\377\1}\13,\377" \ + "\257\0\0\0\377\2\3\0\1\377\242\17""9\377\375\274\21B\377\1\\\10\40\377" \ + "\322\0\0\0\377\2\0\0\0\356\0\0\0f\344\0\0\0\0\2\0\0\0""2\0\0\0\322\326" \ + "\0\0\0\377\2(\4\16\377\266\20@\377\371\274\21B\377\1,\4\20\377\256\0" \ + "\0\0\377\1@\6\27\377\376\274\21B\377\2\273\21A\3774\5\22\377\323\0\0" \ + "\0\377\2\0\0\0\263\0\0\0\32\341\0\0\0\0\2\0\0\0j\0\0\0\367\326\0\0\0" \ + "\377\2\24\2\7\377\252\17<\377\372\274\21B\377\2\223\15""4\377\1\0\0\377" \ + "\255\0\0\0\377\1\226\16""5\377\377\274\21B\377\2\252\17<\377\21\2\6\377" \ + "\323\0\0\0\377\2\0\0\0\344\0\0\0A\336\0\0\0\0\2\0\0\0\31\0\0\0\273\327" \ + "\0\0\0\377\2\3\0\1\377\215\15""1\377\374\274\21B\377\1""7\5\23\377\254" \ + "\0\0\0\377\1+\4\17\377\377\274\21B\377\202\274\21B\377\2\210\14""0\377" \ + "\1\0\0\377\323\0\0\0\377\3\0\0\0\376\0\0\0\221\0\0\0\6\333\0\0\0\0\2" \ + "\0\0\0<\0\0\0\342\330\0\0\0\377\1k\12&\377\375\274\21B\377\1\225\15""4" \ + "\377\254\0\0\0\377\1}\13,\377\377\274\21B\377\203\274\21B\377\1S\10\35" \ + "\377\325\0\0\0\377\2\0\0\0\305\0\0\0\35\331\0\0\0\0\2\0\0\0w\0\0\0\374" \ + "\330\0\0\0\377\1C\6\30\377\377\274\21B\377\1""1\4\21\377\252\0\0\0\377" \ + "\2\24\2\7\377\271\21A\377\377\274\21B\377\203\274\21B\377\2\267\21@\377" \ + "!\3\14\377\325\0\0\0\377\2\0\0\0\355\0\0\0B\326\0\0\0\0\2\0\0\0\5\0\0" \ + "\0\232\331\0\0\0\377\2\31\2\11\377\260\20>\377\377\274\21B\377\1\210" \ + "\14""0\377\252\0\0\0\377\1V\10\36\377\377\274\21B\377\205\274\21B\377" \ + "\2\223\15""4\377\3\0\1\377\325\0\0\0\377\2\0\0\0\373\0\0\0k\324\0\0\0" \ + "\0\2\0\0\0\15\0\0\0\266\331\0\0\0\377\2\3\0\1\377\225\15""4\377\377\274" \ + "\21B\377\3\274\21B\377\273\21B\377\35\3\12\377\251\0\0\0\377\1\235\16" \ + "7\377\377\274\21B\377\206\274\21B\377\1X\10\37\377\327\0\0\0\377\2\0" \ + "\0\0\206\0\0\0\1\321\0\0\0\0\2\0\0\0\33\0\0\0\325\332\0\0\0\377\1a\11" \ + "\"\377\377\274\21B\377\203\274\21B\377\1l\12&\377\250\0\0\0\377\1#\3" \ + "\14\377\377\274\21B\377\207\274\21B\377\2\265\20@\377\33\2\11\377\327" \ + "\0\0\0\377\2\0\0\0\256\0\0\0\7\317\0\0\0\0\2\0\0\0$\0\0\0\336\332\0\0" \ + "\0\377\2)\4\16\377\271\21A\377\377\274\21B\377\203\274\21B\377\2\262" \ + "\20\77\377\12\1\4\377\247\0\0\0\377\1b\11\"\377\377\274\21B\377\210\274" \ + "\21B\377\1\205\14/\377\330\0\0\0\377\2\0\0\0\275\0\0\0\15\315\0\0\0\0" \ + "\2\0\0\0(\0\0\0\342\332\0\0\0\377\2\6\1\2\377\235\16""7\377\377\274\21" \ + "B\377\205\274\21B\377\1F\6\31\377\247\0\0\0\377\1\234\16""7\377\377\274" \ + "\21B\377\211\274\21B\377\1\77\6\26\377\330\0\0\0\377\2\0\0\0\277\0\0" \ + "\0\16\313\0\0\0\0\2\0\0\0-\0\0\0\353\333\0\0\0\377\1e\11#\377\377\274" \ + "\21B\377\206\274\21B\377\1\214\15""1\377\246\0\0\0\377\1\33\2\11\377" \ + "\377\274\21B\377\212\274\21B\377\2\250\17;\377\11\1\3\377\330\0\0\0\377" \ + "\2\0\0\0\317\0\0\0\22\311\0\0\0\0\2\0\0\0+\0\0\0\352\333\0\0\0\377\2" \ + "%\3\15\377\271\21A\377\377\274\21B\377\206\274\21B\377\2\273\21A\377" \ + "\25\2\10\377\245\0\0\0\377\1R\7\35\377\377\274\21B\377\213\274\21B\377" \ + "\1a\11\"\377\253\0\0\0\377\5\25\2\7\3776\5\23\377\77\6\26\3775\5\23\377" \ + "\31\2\11\377\251\0\0\0\377\2\0\0\0\310\0\0\0\16\307\0\0\0\0\2\0\0\0)" \ + "\0\0\0\351\333\0\0\0\377\2\1\0\1\377\222\15""3\377\377\274\21B\377\210" \ + "\274\21B\377\1T\10\36\377\245\0\0\0\377\1\204\14.\377\377\274\21B\377" \ + "\213\274\21B\377\2\264\20\77\377\25\2\7\377\247\0\0\0\377\3\1\0\1\377" \ + "C\6\30\377\226\16""5\377\205\274\21B\377\3\254\20<\377J\7\32\377\1\0" \ + "\1\377\247\0\0\0\377\2\0\0\0\306\0\0\0\15\305\0\0\0\0\2\0\0\0\33\0\0" \ + "\0\337\243\0\0\0\377\6\7\1\2\377(\4\16\377:\5\24\377=\6\25\377+\4\17" \ + "\377\5\0\2\377\263\0\0\0\377\1N\7\33\377\377\274\21B\377\211\274\21B" \ + "\377\1\216\15""2\377\244\0\0\0\377\2\2\0\1\377\260\20>\377\377\274\21" \ + "B\377\214\274\21B\377\1v\13)\377\246\0\0\0\377\2\30\2\10\377\220\15""2" \ + "\377\211\274\21B\377\2\223\15""4\377#\3\14\377\247\0\0\0\377\2\0\0\0" \ + "\270\0\0\0\5\303\0\0\0\0\2\0\0\0\22\0\0\0\326\242\0\0\0\377\3\22\2\6" \ + "\377z\13+\377\271\21A\377\204\274\21B\377\3\264\20\77\377u\13)\377\35" \ + "\3\12\377\260\0\0\0\377\2\17\1\5\377\260\20>\377\377\274\21B\377\211" \ + "\274\21B\377\2\272\21A\377\17\1\5\377\243\0\0\0\377\1&\3\15\377\377\274" \ + "\21B\377\215\274\21B\377\2\273\21A\377\"\3\14\377\244\0\0\0\377\2(\4" \ + "\16\377\255\20=\377\213\274\21B\377\3\271\21A\377j\12%\377\12\1\4\377" \ + "\246\0\0\0\377\2\0\0\0\251\0\0\0\2\301\0\0\0\0\2\0\0\0\10\0\0\0\302\241" \ + "\0\0\0\377\3\2\0\1\377Q\7\34\377\261\20>\377\210\274\21B\377\3\267\21" \ + "@\377Z\10\40\377\1\0\1\377\256\0\0\0\377\1o\12'\377\377\274\21B\377\213" \ + "\274\21B\377\1C\6\30\377\243\0\0\0\377\1S\7\35\377\377\274\21B\377\216" \ + "\274\21B\377\1|\13+\377\243\0\0\0\377\2\33\2\11\377\255\20=\377\216\274" \ + "\21B\377\2\251\17;\377:\5\24\377\246\0\0\0\377\1\0\0\0\212\300\0\0\0" \ + "\0\2\0\0\0\2\0\0\0\251\241\0\0\0\377\2)\4\16\377\230\16""5\377\214\274" \ + "\21B\377\2\201\14-\377\4\0\2\377\254\0\0\0\377\2\37\3\13\377\271\21A" \ + "\377\377\274\21B\377\213\274\21B\377\1v\13)\377\243\0\0\0\377\1|\13+" \ + "\377\377\274\21B\377\216\274\21B\377\2\273\21B\377'\4\16\377\241\0\0" \ + "\0\377\2\7\1\2\377\234\16""7\377\221\274\21B\377\2}\13,\377\14\1\4\377" \ + "\245\0\0\0\377\1\0\0\0n\277\0\0\0\0\1\0\0\0~\240\0\0\0\377\3\10\1\3\377" \ + "o\12'\377\273\21A\377\216\274\21B\377\1x\13*\377\254\0\0\0\377\1\205" \ + "\14/\377\377\274\21B\377\214\274\21B\377\1\244\17""9\377\243\0\0\0\377" \ + "\1\240\16""8\377\377\274\21B\377\217\274\21B\377\1~\13,\377\241\0\0\0" \ + "\377\1\\\10\40\377\223\274\21B\377\2\236\16""7\377$\3\15\377\244\0\0" \ + "\0\377\2\0\0\0\373\0\0\0E\275\0\0\0\0\2\0\0\0U\0\0\0\376\237\0\0\0\377" \ + "\2-\4\20\377\245\17:\377\221\274\21B\377\1O\7\34\377\252\0\0\0\377\1" \ + "/\4\21\377\377\274\21B\377\216\274\21B\377\1\30\2\10\377\241\0\0\0\377" \ + "\2\14\1\4\377\273\21B\377\377\274\21B\377\217\274\21B\377\2\273\21B\377" \ + "\40\3\13\377\237\0\0\0\377\2\26\2\10\377\265\20@\377\224\274\21B\377" \ + "\3\267\21@\377V\10\36\377\1\0\1\377\243\0\0\0\377\2\0\0\0\357\0\0\0$" \ + "\273\0\0\0\0\2\0\0\0+\0\0\0\363\236\0\0\0\377\3\1\0\1\377X\10\37\377" \ + "\270\21A\377\222\274\21B\377\2\263\20\77\377\25\2\7\377\251\0\0\0\377" \ + "\1\213\15""1\377\377\274\21B\377\216\274\21B\377\1D\6\30\377\241\0\0" \ + "\0\377\1,\4\20\377\377\274\21B\377\221\274\21B\377\1r\12(\377\237\0\0" \ + "\0\377\1i\11%\377\227\274\21B\377\2\203\14.\377\12\1\4\377\243\0\0\0" \ + "\377\2\0\0\0\327\0\0\0\16\271\0\0\0\0\2\0\0\0\17\0\0\0\331\236\0\0\0" \ + "\377\2\25\2\10\377\214\15""1\377\225\274\21B\377\1{\13+\377\250\0\0\0" \ + "\377\1""4\5\22\377\377\274\21B\377\217\274\21B\377\1m\12&\377\241\0\0" \ + "\0\377\1J\7\32\377\377\274\21B\377\221\274\21B\377\2\270\21A\377\26\2" \ + "\10\377\235\0\0\0\377\2\14\1\4\377\263\20\77\377\230\274\21B\377\2\242" \ + "\17""9\377\40\3\13\377\243\0\0\0\377\2\0\0\0\256\0\0\0\1\270\0\0\0\0" \ + "\1\0\0\0\247\236\0\0\0\377\2""0\4\21\377\255\20=\377\226\274\21B\377" \ + "\2\272\21A\377\32\2\11\377\247\0\0\0\377\1\216\15""2\377\377\274\21B" \ + "\377\217\274\21B\377\1\221\15""3\377\241\0\0\0\377\1d\11#\377\377\274" \ + "\21B\377\222\274\21B\377\1a\11\"\377\235\0\0\0\377\1U\10\36\377\232\274" \ + "\21B\377\2\262\20\77\377;\5\25\377\243\0\0\0\377\1\0\0\0k\267\0\0\0\0" \ + "\1\0\0\0h\236\0\0\0\377\2X\10\37\377\272\21A\377\230\274\21B\377\1m\12" \ + "&\377\246\0\0\0\377\1-\4\20\377\377\274\21B\377\220\274\21B\377\2\265" \ + "\20@\377\3\0\1\377\240\0\0\0\377\1\200\14-\377\377\274\21B\377\222\274" \ + "\21B\377\2\255\20=\377\6\1\2\377\234\0\0\0\377\1\237\16""8\377\233\274" \ + "\21B\377\2\271\21A\377S\7\35\377\242\0\0\0\377\2\0\0\0\372\0\0\0""7\265" \ + "\0\0\0\0\2\0\0\0.\0\0\0\367\234\0\0\0\377\2\7\1\3\377{\13+\377\232\274" \ + "\21B\377\2\265\20\77\377\16\1\5\377\245\0\0\0\377\1\201\14-\377\377\274" \ + "\21B\377\221\274\21B\377\1\36\3\13\377\240\0\0\0\377\1\227\16""5\377" \ + "\377\274\21B\377\223\274\21B\377\1@\6\27\377\233\0\0\0\377\1\"\3\14\377" \ + "\236\274\21B\377\2o\12'\377\1\0\1\377\241\0\0\0\377\2\0\0\0\333\0\0\0" \ + "\15\263\0\0\0\0\2\0\0\0\11\0\0\0\324\234\0\0\0\377\2\20\1\6\377\220\15" \ + "2\377\234\274\21B\377\1O\7\34\377\244\0\0\0\377\2\40\3\13\377\273\21" \ + "B\377\377\274\21B\377\221\274\21B\377\1<\5\25\377\240\0\0\0\377\1\253" \ + "\17<\377\377\274\21B\377\223\274\21B\377\1\220\15""2\377\233\0\0\0\377" \ + "\1]\10!\377\237\274\21B\377\2z\13+\377\4\0\1\377\241\0\0\0\377\1\0\0" \ + "\0\237\263\0\0\0\0\1\0\0\0\214\234\0\0\0\377\2\33\2\12\377\245\17:\377" \ + "\235\274\21B\377\1\215\15""1\377\244\0\0\0\377\1p\12'\377\377\274\21" \ + "B\377\222\274\21B\377\1V\10\36\377\237\0\0\0\377\2\3\0\1\377\273\21A" \ + "\377\377\274\21B\377\223\274\21B\377\2\273\21B\377\33\2\11\377\232\0" \ + "\0\0\377\1\231\16""6\377\240\274\21B\377\2\203\14.\377\6\1\2\377\241" \ + "\0\0\0\377\1\0\0\0R\261\0\0\0\0\2\0\0\0D\0\0\0\376\233\0\0\0\377\2#\3" \ + "\14\377\253\17<\377\236\274\21B\377\2\272\21A\377\17\1\5\377\242\0\0" \ + "\0\377\2\15\1\4\377\265\20@\377\377\274\21B\377\222\274\21B\377\1r\12" \ + "(\377\237\0\0\0\377\1\25\2\7\377\377\274\21B\377\225\274\21B\377\1a\11" \ + "\"\377\231\0\0\0\377\2\24\2\7\377\273\21B\377\241\274\21B\377\2\205\14" \ + "/\377\7\1\2\377\240\0\0\0\377\2\0\0\0\354\0\0\0\27\257\0\0\0\0\2\0\0" \ + "\0\14\0\0\0\336\233\0\0\0\377\2*\4\17\377\257\20>\377\240\274\21B\377" \ + "\1G\6\31\377\242\0\0\0\377\1O\7\34\377\377\274\21B\377\223\274\21B\377" \ + "\1\213\15""1\377\237\0\0\0\377\1#\3\14\377\377\274\21B\377\225\274\21" \ + "B\377\2\241\17""9\377\1\0\0\377\230\0\0\0\377\1\77\6\26\377\243\274\21" \ + "B\377\2\213\15""1\377\6\1\2\377\240\0\0\0\377\1\0\0\0\252\257\0\0\0\0" \ + "\1\0\0\0\217\233\0\0\0\377\2+\4\17\377\260\20>\377\241\274\21B\377\1" \ + "~\13,\377\241\0\0\0\377\2\1\0\0\377\237\16""8\377\377\274\21B\377\223" \ + "\274\21B\377\1\236\16""7\377\237\0\0\0\377\1,\4\20\377\377\274\21B\377" \ + "\226\274\21B\377\1+\4\17\377\230\0\0\0\377\1h\11$\377\244\274\21B\377" \ + "\2\202\14.\377\3\0\1\377\240\0\0\0\377\1\0\0\0S\255\0\0\0\0\2\0\0\0<" \ + "\0\0\0\375\232\0\0\0\377\2-\4\20\377\265\20\77\377\242\274\21B\377\1" \ + "\254\20<\377\241\0\0\0\377\1)\4\16\377\377\274\21B\377\224\274\21B\377" \ + "\1\257\20>\377\237\0\0\0\377\1""6\5\23\377\377\274\21B\377\226\274\21" \ + "B\377\1l\12&\377\230\0\0\0\377\1\221\15""3\377\245\274\21B\377\2x\13" \ + "*\377\1\0\1\377\237\0\0\0\377\2\0\0\0\347\0\0\0\22\253\0\0\0\0\2\0\0" \ + "\0\3\0\0\0\320\232\0\0\0\377\2&\3\15\377\261\20>\377\244\274\21B\377" \ + "\1\27\2\10\377\240\0\0\0\377\1p\12'\377\377\274\21B\377\225\274\21B\377" \ + "\1\7\1\2\377\236\0\0\0\377\1\77\6\26\377\377\274\21B\377\226\274\21B" \ + "\377\1\244\17:\377\227\0\0\0\377\2\3\0\1\377\264\20\77\377\246\274\21" \ + "B\377\1f\11$\377\240\0\0\0\377\1\0\0\0\226\253\0\0\0\0\1\0\0\0q\232\0" \ + "\0\0\377\2\36\3\13\377\255\20=\377\245\274\21B\377\1@\6\27\377\237\0" \ + "\0\0\377\2\4\0\2\377\255\20=\377\377\274\21B\377\225\274\21B\377\1\25" \ + "\2\7\377\236\0\0\0\377\1E\6\30\377\377\274\21B\377\227\274\21B\377\1" \ + "%\3\15\377\226\0\0\0\377\1\40\3\13\377\250\274\21B\377\1M\7\33\377\237" \ + "\0\0\0\377\2\0\0\0\375\0\0\0""7\251\0\0\0\0\2\0\0\0\31\0\0\0\362\231" \ + "\0\0\0\377\2\24\2\7\377\244\17""9\377\246\274\21B\377\1g\11$\377\237" \ + "\0\0\0\377\1:\5\24\377\377\274\21B\377\226\274\21B\377\1\35\3\12\377" \ + "\236\0\0\0\377\1E\6\30\377\377\274\21B\377\227\274\21B\377\1^\10!\377" \ + "\226\0\0\0\377\1=\6\25\377\250\274\21B\377\2\272\21A\3776\5\23\377\237" \ + "\0\0\0\377\2\0\0\0\314\0\0\0\2\250\0\0\0\0\1\0\0\0\240\231\0\0\0\377" \ + "\2\7\1\3\377\230\16""5\377\247\274\21B\377\1\215\15""1\377\237\0\0\0" \ + "\377\1{\13+\377\377\274\21B\377\226\274\21B\377\1(\4\16\377\236\0\0\0" \ + "\377\1G\6\31\377\377\274\21B\377\227\274\21B\377\1\226\16""5\377\226" \ + "\0\0\0\377\1Y\10\37\377\251\274\21B\377\2\257\20=\377\33\2\11\377\237" \ + "\0\0\0\377\1\0\0\0d\247\0\0\0\0\2\0\0\0""5\0\0\0\375\230\0\0\0\377\2" \ + "\1\0\1\377\202\14.\377\250\274\21B\377\1\252\17<\377\236\0\0\0\377\2" \ + "\4\0\1\377\260\20>\377\377\274\21B\377\226\274\21B\377\1""1\4\21\377" \ + "\236\0\0\0\377\1H\6\31\377\377\274\21B\377\227\274\21B\377\2\272\21A" \ + "\377\15\1\5\377\225\0\0\0\377\1t\13)\377\252\274\21B\377\2\236\16""7" \ + "\377\12\1\4\377\236\0\0\0\377\2\0\0\0\347\0\0\0\16\245\0\0\0\0\2\0\0" \ + "\0\1\0\0\0\310\231\0\0\0\377\1^\10!\377\252\274\21B\377\1\12\1\3\377" \ + "\235\0\0\0\377\1""5\5\23\377\377\274\21B\377\227\274\21B\377\1""6\5\23" \ + "\377\236\0\0\0\377\1C\6\30\377\377\274\21B\377\230\274\21B\377\1\77\6" \ + "\26\377\225\0\0\0\377\1\217\15""2\377\253\274\21B\377\1w\13*\377\237" \ + "\0\0\0\377\1\0\0\0\210\245\0\0\0\0\1\0\0\0P\231\0\0\0\377\2\77\6\26\377" \ + "\273\21B\377\252\274\21B\377\1#\3\14\377\235\0\0\0\377\1m\12&\377\377" \ + "\274\21B\377\227\274\21B\377\1""7\5\23\377\236\0\0\0\377\1<\5\25\377" \ + "\377\274\21B\377\230\274\21B\377\1q\12(\377\225\0\0\0\377\1\252\17<\377" \ + "\254\274\21B\377\1\77\6\26\377\236\0\0\0\377\2\0\0\0\367\0\0\0\35\243" \ + "\0\0\0\0\2\0\0\0\4\0\0\0\330\230\0\0\0\377\2\30\2\10\377\261\20>\377" \ + "\253\274\21B\377\1>\6\26\377\235\0\0\0\377\1\246\17:\377\377\274\21B" \ + "\377\227\274\21B\377\1""7\5\23\377\236\0\0\0\377\1""4\5\22\377\377\274" \ + "\21B\377\230\274\21B\377\1\237\16""8\377\224\0\0\0\377\2\2\0\1\377\272" \ + "\21A\377\254\274\21B\377\2\261\20>\377\26\2\10\377\236\0\0\0\377\1\0" \ + "\0\0\234\243\0\0\0\0\1\0\0\0e\230\0\0\0\377\2\1\0\1\377\216\15""2\377" \ + "\254\274\21B\377\1X\10\37\377\234\0\0\0\377\1\33\2\11\377\377\274\21" \ + "B\377\230\274\21B\377\1""9\5\24\377\236\0\0\0\377\1,\4\20\377\377\274" \ + "\21B\377\230\274\21B\377\2\273\21B\377\15\1\4\377\223\0\0\0\377\1\20" \ + "\1\6\377\256\274\21B\377\2\217\15""2\377\1\0\1\377\235\0\0\0\377\2\0" \ + "\0\0\374\0\0\0+\241\0\0\0\0\2\0\0\0\7\0\0\0\341\230\0\0\0\377\1[\10\40" \ + "\377\255\274\21B\377\1j\12%\377\234\0\0\0\377\1N\7\33\377\377\274\21" \ + "B\377\230\274\21B\377\1""4\5\22\377\236\0\0\0\377\1\36\3\13\377\377\274" \ + "\21B\377\231\274\21B\377\1""7\5\23\377\223\0\0\0\377\1\40\3\13\377\257" \ + "\274\21B\377\1O\7\34\377\236\0\0\0\377\1\0\0\0\252\241\0\0\0\0\1\0\0" \ + "\0h\230\0\0\0\377\2(\4\16\377\271\21A\377\255\274\21B\377\1{\13+\377" \ + "\234\0\0\0\377\1\177\13-\377\377\274\21B\377\230\274\21B\377\1-\4\20" \ + "\377\236\0\0\0\377\1\17\1\5\377\377\274\21B\377\231\274\21B\377\1^\11" \ + "!\377\223\0\0\0\377\1""1\4\21\377\257\274\21B\377\2\265\20\77\377\30" \ + "\2\11\377\235\0\0\0\377\2\0\0\0\376\0\0\0,\237\0\0\0\0\2\0\0\0\4\0\0" \ + "\0\335\227\0\0\0\377\2\5\0\2\377\233\16""6\377\256\274\21B\377\1\213" \ + "\15""1\377\233\0\0\0\377\2\1\0\0\377\256\20=\377\377\274\21B\377\230" \ + "\274\21B\377\1&\3\15\377\236\0\0\0\377\2\1\0\1\377\271\21A\377\377\274" \ + "\21B\377\230\274\21B\377\1\203\14.\377\223\0\0\0\377\1A\6\27\377\260" \ + "\274\21B\377\1\201\14-\377\236\0\0\0\377\1\0\0\0\242\237\0\0\0\0\1\0" \ + "\0\0Y\230\0\0\0\377\1`\11\"\377\257\274\21B\377\1\234\16""7\377\233\0" \ + "\0\0\377\1\32\2\11\377\377\274\21B\377\231\274\21B\377\1\36\3\13\377" \ + "\237\0\0\0\377\1\253\17<\377\377\274\21B\377\230\274\21B\377\1\243\17" \ + "9\377\223\0\0\0\377\1O\7\34\377\261\274\21B\377\1""4\5\22\377\235\0\0" \ + "\0\377\2\0\0\0\373\0\0\0\40\235\0\0\0\0\2\0\0\0\1\0\0\0\321\227\0\0\0" \ + "\377\2\35\3\12\377\270\21@\377\257\274\21B\377\1\255\20=\377\233\0\0" \ + "\0\377\1E\6\30\377\377\274\21B\377\231\274\21B\377\1\20\1\6\377\237\0" \ + "\0\0\377\1\224\15""4\377\377\274\21B\377\230\274\21B\377\2\273\21B\377" \ + "\12\1\4\377\222\0\0\0\377\1W\10\37\377\261\274\21B\377\2\245\17:\377" \ + "\10\1\3\377\235\0\0\0\377\1\0\0\0\224\235\0\0\0\0\1\0\0\0E\230\0\0\0" \ + "\377\1\204\14.\377\260\274\21B\377\1\272\21A\377\233\0\0\0\377\1m\12" \ + "&\377\377\274\21B\377\230\274\21B\377\2\272\21A\377\2\0\1\377\237\0\0" \ + "\0\377\1}\13,\377\377\274\21B\377\231\274\21B\377\1)\4\16\377\222\0\0" \ + "\0\377\1^\11!\377\262\274\21B\377\1Z\10\40\377\235\0\0\0\377\2\0\0\0" \ + "\364\0\0\0\23\234\0\0\0\0\1\0\0\0\266\227\0\0\0\377\1>\6\26\377\262\274" \ + "\21B\377\1\6\1\2\377\232\0\0\0\377\1\223\15""4\377\377\274\21B\377\230" \ + "\274\21B\377\1\253\17<\377\240\0\0\0\377\1c\11#\377\377\274\21B\377\231" \ + "\274\21B\377\1F\6\31\377\222\0\0\0\377\1f\11$\377\262\274\21B\377\2\263" \ + "\20\77\377\17\1\5\377\235\0\0\0\377\1\0\0\0y\233\0\0\0\0\2\0\0\0&\0\0" \ + "\0\376\226\0\0\0\377\2\5\0\2\377\244\17:\377\262\274\21B\377\1\15\1\5" \ + "\377\231\0\0\0\377\2\1\0\0\377\262\20>\377\377\274\21B\377\230\274\21" \ + "B\377\1\233\16""6\377\240\0\0\0\377\1K\7\32\377\377\274\21B\377\231\274" \ + "\21B\377\1^\10!\377\222\0\0\0\377\1n\12'\377\263\274\21B\377\1e\11#\377" \ + "\235\0\0\0\377\2\0\0\0\341\0\0\0\3\232\0\0\0\0\1\0\0\0\215\227\0\0\0" \ + "\377\1T\10\36\377\263\274\21B\377\1\25\2\7\377\231\0\0\0\377\1\30\2\10" \ + "\377\377\274\21B\377\231\274\21B\377\1\205\14/\377\240\0\0\0\377\1+\4" \ + "\17\377\377\274\21B\377\231\274\21B\377\1w\13*\377\222\0\0\0\377\1u\13" \ + ")\377\263\274\21B\377\2\265\20@\377\24\2\7\377\235\0\0\0\377\1\0\0\0" \ + "O\231\0\0\0\0\2\0\0\0\13\0\0\0\357\226\0\0\0\377\2\12\1\4\377\255\20" \ + "=\377\263\274\21B\377\1\35\3\12\377\231\0\0\0\377\1""8\5\24\377\377\274" \ + "\21B\377\231\274\21B\377\1m\12&\377\240\0\0\0\377\2\14\1\4\377\273\21" \ + "B\377\377\274\21B\377\230\274\21B\377\1\216\15""2\377\222\0\0\0\377\1" \ + "{\13+\377\264\274\21B\377\1i\11%\377\235\0\0\0\377\1\0\0\0\272\231\0" \ + "\0\0\0\1\0\0\0_\227\0\0\0\377\1\\\10\40\377\264\274\21B\377\1$\3\15\377" \ + "\231\0\0\0\377\1U\10\36\377\377\274\21B\377\231\274\21B\377\1T\10\36" \ + "\377\241\0\0\0\377\1\245\17:\377\377\274\21B\377\230\274\21B\377\1\242" \ + "\17""9\377\222\0\0\0\377\1{\13+\377\264\274\21B\377\2\265\20@\377\17" \ + "\1\5\377\234\0\0\0\377\2\0\0\0\375\0\0\0#\230\0\0\0\0\1\0\0\0\304\226" \ + "\0\0\0\377\2\13\1\4\377\257\20=\377\264\274\21B\377\1*\4\17\377\231\0" \ + "\0\0\377\1l\12&\377\377\274\21B\377\231\274\21B\377\1<\5\25\377\241\0" \ + "\0\0\377\1\205\14/\377\377\274\21B\377\230\274\21B\377\1\262\20>\377" \ + "\222\0\0\0\377\1{\13+\377\265\274\21B\377\1_\11!\377\235\0\0\0\377\1" \ + "\0\0\0\206\227\0\0\0\0\2\0\0\0#\0\0\0\376\226\0\0\0\377\1[\10\40\377" \ + "\265\274\21B\377\1+\4\17\377\231\0\0\0\377\1\206\14/\377\377\274\21B" \ + "\377\231\274\21B\377\1\34\3\12\377\241\0\0\0\377\1[\10\40\377\377\274" \ + "\21B\377\231\274\21B\377\1\7\1\2\377\221\0\0\0\377\1{\13+\377\265\274" \ + "\21B\377\2\255\20=\377\7\1\2\377\234\0\0\0\377\2\0\0\0\344\0\0\0\3\226" \ + "\0\0\0\0\1\0\0\0\177\226\0\0\0\377\2\6\1\2\377\255\20=\377\265\274\21" \ + "B\377\1+\4\17\377\231\0\0\0\377\1\237\16""8\377\377\274\21B\377\230\274" \ + "\21B\377\2\265\20@\377\2\0\1\377\241\0\0\0\377\1""3\5\22\377\377\274" \ + "\21B\377\231\274\21B\377\1\26\2\10\377\221\0\0\0\377\1{\13+\377\266\274" \ + "\21B\377\1I\7\32\377\235\0\0\0\377\1\0\0\0A\225\0\0\0\0\2\0\0\0\1\0\0" \ + "\0\334\226\0\0\0\377\1H\7\31\377\266\274\21B\377\1+\4\17\377\231\0\0" \ + "\0\377\1\262\20\77\377\377\274\21B\377\230\274\21B\377\1\226\16""5\377" \ + "\242\0\0\0\377\2\12\1\3\377\272\21A\377\377\274\21B\377\230\274\21B\377" \ + "\1!\3\14\377\221\0\0\0\377\1{\13+\377\266\274\21B\377\1\231\16""6\377" \ + "\235\0\0\0\377\1\0\0\0\236\225\0\0\0\0\1\0\0\0""9\226\0\0\0\377\2\1\0" \ + "\0\377\234\16""7\377\266\274\21B\377\1+\4\17\377\230\0\0\0\377\1\5\0" \ + "\2\377\377\274\21B\377\231\274\21B\377\1u\13)\377\243\0\0\0\377\1\233" \ + "\16""6\377\377\274\21B\377\230\274\21B\377\1(\4\16\377\221\0\0\0\377" \ + "\1{\13+\377\267\274\21B\377\1)\4\16\377\234\0\0\0\377\2\0\0\0\361\0\0" \ + "\0\12\224\0\0\0\0\1\0\0\0\216\226\0\0\0\377\1/\4\21\377\267\274\21B\377" \ + "\1+\4\17\377\230\0\0\0\377\1\25\2\7\377\377\274\21B\377\231\274\21B\377" \ + "\1M\7\33\377\243\0\0\0\377\1i\12%\377\377\274\21B\377\230\274\21B\377" \ + "\1""0\4\21\377\221\0\0\0\377\1w\13*\377\267\274\21B\377\1o\12'\377\235" \ + "\0\0\0\377\1\0\0\0P\223\0\0\0\0\2\0\0\0\1\0\0\0\340\226\0\0\0\377\1{" \ + "\13+\377\267\274\21B\377\1+\4\17\377\230\0\0\0\377\1$\3\15\377\377\274" \ + "\21B\377\231\274\21B\377\1$\3\15\377\243\0\0\0\377\1:\5\24\377\377\274" \ + "\21B\377\230\274\21B\377\1""7\5\23\377\221\0\0\0\377\1p\12'\377\267\274" \ + "\21B\377\2\257\20>\377\5\0\2\377\234\0\0\0\377\1\0\0\0\242\223\0\0\0" \ + "\0\1\0\0\0""0\226\0\0\0\377\2\14\1\4\377\266\20@\377\267\274\21B\377" \ + "\1&\3\15\377\230\0\0\0\377\1/\4\21\377\377\274\21B\377\230\274\21B\377" \ + "\2\263\20\77\377\2\0\1\377\243\0\0\0\377\2\12\1\3\377\270\21A\377\377" \ + "\274\21B\377\227\274\21B\377\1""8\5\24\377\221\0\0\0\377\1i\12%\377\270" \ + "\274\21B\377\1<\5\25\377\234\0\0\0\377\2\0\0\0\355\0\0\0\4\222\0\0\0" \ + "\0\1\0\0\0\177\226\0\0\0\377\1J\7\32\377\270\274\21B\377\1\37\3\13\377" \ + "\230\0\0\0\377\1""7\5\23\377\377\274\21B\377\230\274\21B\377\1\216\15" \ + "2\377\245\0\0\0\377\1\222\15""3\377\377\274\21B\377\227\274\21B\377\1" \ + "7\5\23\377\221\0\0\0\377\1d\11#\377\270\274\21B\377\1~\13,\377\235\0" \ + "\0\0\377\1\0\0\0A\222\0\0\0\0\1\0\0\0\316\226\0\0\0\377\1\216\15""2\377" \ + "\270\274\21B\377\1\30\2\11\377\230\0\0\0\377\1\77\6\26\377\377\274\21" \ + "B\377\230\274\21B\377\1\\\10\40\377\245\0\0\0\377\1W\10\37\377\377\274" \ + "\21B\377\227\274\21B\377\1""7\5\23\377\221\0\0\0\377\1\\\10\40\377\270" \ + "\274\21B\377\2\265\20@\377\10\1\3\377\234\0\0\0\377\1\0\0\0\220\221\0" \ + "\0\0\0\2\0\0\0\33\0\0\0\376\225\0\0\0\377\2\26\2\10\377\273\21A\377\270" \ + "\274\21B\377\1\22\2\6\377\230\0\0\0\377\1F\6\31\377\377\274\21B\377\230" \ + "\274\21B\377\1+\4\17\377\245\0\0\0\377\1\35\3\12\377\377\274\21B\377" \ + "\227\274\21B\377\1""5\5\23\377\221\0\0\0\377\1V\10\36\377\271\274\21" \ + "B\377\1:\5\24\377\234\0\0\0\377\1\0\0\0\333\221\0\0\0\0\1\0\0\0_\226" \ + "\0\0\0\377\1T\10\36\377\271\274\21B\377\1\13\1\4\377\230\0\0\0\377\1" \ + "H\6\31\377\377\274\21B\377\227\274\21B\377\2\257\20>\377\2\0\1\377\246" \ + "\0\0\0\377\1\234\16""7\377\377\274\21B\377\226\274\21B\377\1,\4\20\377" \ + "\221\0\0\0\377\1N\7\33\377\271\274\21B\377\1p\12'\377\235\0\0\0\377\1" \ + "\0\0\0!\220\0\0\0\0\1\0\0\0\237\226\0\0\0\377\1\214\15""1\377\271\274" \ + "\21B\377\1\4\0\2\377\230\0\0\0\377\1F\6\31\377\377\274\21B\377\227\274" \ + "\21B\377\1\202\14.\377\247\0\0\0\377\1a\11\"\377\377\274\21B\377\226" \ + "\274\21B\377\1#\3\14\377\221\0\0\0\377\1B\6\27\377\271\274\21B\377\2" \ + "\252\17<\377\1\0\0\377\234\0\0\0\377\1\0\0\0b\220\0\0\0\0\1\0\0\0\337" \ + "\225\0\0\0\377\2\12\1\4\377\270\21@\377\270\274\21B\377\1\270\21A\377" \ + "\231\0\0\0\377\1E\6\30\377\377\274\21B\377\227\274\21B\377\1G\6\31\377" \ + "\247\0\0\0\377\2\33\2\12\377\273\21B\377\377\274\21B\377\225\274\21B" \ + "\377\1\32\2\11\377\221\0\0\0\377\1""6\5\23\377\272\274\21B\377\1$\3\15" \ + "\377\234\0\0\0\377\1\0\0\0\243\217\0\0\0\0\1\0\0\0\40\226\0\0\0\377\1" \ + "@\6\27\377\271\274\21B\377\1\255\20=\377\231\0\0\0\377\1D\6\30\377\377" \ + "\274\21B\377\226\274\21B\377\2\272\21A\377\17\1\5\377\250\0\0\0\377\1" \ + "\226\16""5\377\377\274\21B\377\225\274\21B\377\1\17\1\5\377\221\0\0\0" \ + "\377\1)\4\16\377\272\274\21B\377\1V\10\36\377\234\0\0\0\377\1\0\0\0\345" \ + "\217\0\0\0\0\1\0\0\0a\226\0\0\0\377\1v\13)\377\271\274\21B\377\1\240" \ + "\16""8\377\231\0\0\0\377\1;\5\25\377\377\274\21B\377\226\274\21B\377" \ + "\1\214\15""1\377\251\0\0\0\377\1P\7\34\377\377\274\21B\377\224\274\21" \ + "B\377\2\271\21A\377\1\0\1\377\221\0\0\0\377\1\33\2\12\377\272\274\21" \ + "B\377\1\202\14.\377\235\0\0\0\377\1\0\0\0%\216\0\0\0\0\1\0\0\0\234\226" \ + "\0\0\0\377\1\250\17;\377\271\274\21B\377\1\223\15""4\377\231\0\0\0\377" \ + "\1""2\5\22\377\377\274\21B\377\226\274\21B\377\1R\7\35\377\251\0\0\0" \ + "\377\2\21\2\6\377\270\21A\377\377\274\21B\377\223\274\21B\377\1\251\17" \ + ";\377\222\0\0\0\377\1\17\1\5\377\272\274\21B\377\2\255\20=\377\1\0\0" \ + "\377\234\0\0\0\377\1\0\0\0a\216\0\0\0\0\1\0\0\0\321\225\0\0\0\377\1\30" \ + "\2\10\377\272\274\21B\377\1\206\14/\377\231\0\0\0\377\1)\4\16\377\377" \ + "\274\21B\377\225\274\21B\377\2\270\21A\377\17\1\5\377\252\0\0\0\377\1" \ + "z\13+\377\377\274\21B\377\223\274\21B\377\1\226\16""5\377\222\0\0\0\377" \ + "\2\3\0\1\377\273\21B\377\272\274\21B\377\1\36\3\13\377\234\0\0\0\377" \ + "\1\0\0\0\226\215\0\0\0\0\2\0\0\0\13\0\0\0\374\225\0\0\0\377\1D\6\30\377" \ + "\272\274\21B\377\1z\13+\377\231\0\0\0\377\1\36\3\13\377\377\274\21B\377" \ + "\225\274\21B\377\1\207\14/\377\253\0\0\0\377\1""0\4\21\377\377\274\21" \ + "B\377\223\274\21B\377\1\203\14.\377\223\0\0\0\377\1\260\20>\377\272\274" \ + "\21B\377\1H\7\31\377\234\0\0\0\377\1\0\0\0\311\215\0\0\0\0\1\0\0\0""9" \ + "\226\0\0\0\377\1o\12'\377\272\274\21B\377\1m\12&\377\231\0\0\0\377\1" \ + "\14\1\4\377\377\274\21B\377\225\274\21B\377\1@\6\27\377\254\0\0\0\377" \ + "\1\233\16""6\377\377\274\21B\377\222\274\21B\377\1f\11$\377\223\0\0\0" \ + "\377\1\236\16""7\377\272\274\21B\377\1n\12'\377\234\0\0\0\377\2\0\0\0" \ + "\367\0\0\0\5\214\0\0\0\0\1\0\0\0m\226\0\0\0\377\1\232\16""6\377\272\274" \ + "\21B\377\1_\11!\377\232\0\0\0\377\1\266\20@\377\377\274\21B\377\223\274" \ + "\21B\377\2\262\20>\377\7\1\3\377\254\0\0\0\377\1P\7\34\377\377\274\21" \ + "B\377\222\274\21B\377\1L\7\33\377\223\0\0\0\377\1\213\15""1\377\272\274" \ + "\21B\377\1\217\15""2\377\235\0\0\0\377\1\0\0\0/\214\0\0\0\0\1\0\0\0\240" \ + "\225\0\0\0\377\2\7\1\2\377\272\21A\377\272\274\21B\377\1L\7\33\377\232" \ + "\0\0\0\377\1\244\17""9\377\377\274\21B\377\223\274\21B\377\1l\12&\377" \ + "\255\0\0\0\377\2\7\1\3\377\255\20=\377\377\274\21B\377\221\274\21B\377" \ + "\1/\4\21\377\223\0\0\0\377\1z\13+\377\272\274\21B\377\1\257\20>\377\235" \ + "\0\0\0\377\1\0\0\0c\214\0\0\0\0\1\0\0\0\313\225\0\0\0\377\1%\3\15\377" \ + "\273\274\21B\377\1:\5\24\377\232\0\0\0\377\1\220\15""2\377\377\274\21" \ + "B\377\223\274\21B\377\1!\3\14\377\256\0\0\0\377\1a\11\"\377\377\274\21" \ + "B\377\221\274\21B\377\1\21\2\6\377\223\0\0\0\377\1g\11$\377\273\274\21" \ + "B\377\1\24\2\7\377\234\0\0\0\377\1\0\0\0\216\213\0\0\0\0\2\0\0\0\1\0" \ + "\0\0\362\225\0\0\0\377\1E\6\30\377\273\274\21B\377\1(\4\16\377\232\0" \ + "\0\0\377\1t\12)\377\377\274\21B\377\222\274\21B\377\1\216\15""2\377\257" \ + "\0\0\0\377\2\16\1\5\377\264\20\77\377\377\274\21B\377\217\274\21B\377" \ + "\1\247\17;\377\224\0\0\0\377\1V\10\36\377\273\274\21B\377\1""4\5\22\377" \ + "\234\0\0\0\377\1\0\0\0\264\213\0\0\0\0\1\0\0\0\31\226\0\0\0\377\1f\11" \ + "$\377\273\274\21B\377\1\25\2\10\377\232\0\0\0\377\1Z\10\40\377\377\274" \ + "\21B\377\222\274\21B\377\1B\6\27\377\260\0\0\0\377\1o\12'\377\377\274" \ + "\21B\377\217\274\21B\377\1\204\14.\377\224\0\0\0\377\1C\6\30\377\273" \ + "\274\21B\377\1N\7\33\377\234\0\0\0\377\1\0\0\0\332\213\0\0\0\0\1\0\0" \ + "\0\77\226\0\0\0\377\1\205\14/\377\272\274\21B\377\2\273\21B\377\5\0\2" \ + "\377\232\0\0\0\377\1=\6\25\377\377\274\21B\377\221\274\21B\377\2\241" \ + "\17""9\377\2\0\1\377\260\0\0\0\377\2\25\2\7\377\266\20@\377\377\274\21" \ + "B\377\216\274\21B\377\1_\11!\377\224\0\0\0\377\1/\4\21\377\273\274\21" \ + "B\377\1c\11#\377\234\0\0\0\377\2\0\0\0\373\0\0\0\5\212\0\0\0\0\1\0\0" \ + "\0d\226\0\0\0\377\1\237\16""8\377\272\274\21B\377\1\256\20=\377\233\0" \ + "\0\0\377\1\37\3\13\377\377\274\21B\377\221\274\21B\377\1R\7\35\377\262" \ + "\0\0\0\377\1d\11#\377\377\274\21B\377\216\274\21B\377\1""3\5\22\377\224" \ + "\0\0\0\377\1\27\2\10\377\273\274\21B\377\1y\13*\377\235\0\0\0\377\1\0" \ + "\0\0'\212\0\0\0\0\1\0\0\0\210\226\0\0\0\377\1\264\20\77\377\272\274\21" \ + "B\377\1\232\16""6\377\233\0\0\0\377\2\1\0\1\377\263\20\77\377\377\274" \ + "\21B\377\217\274\21B\377\2\255\20=\377\7\1\3\377\262\0\0\0\377\2\14\1" \ + "\4\377\257\20>\377\377\274\21B\377\214\274\21B\377\2\270\21@\377\7\1" \ + "\3\377\224\0\0\0\377\2\2\0\1\377\270\21A\377\272\274\21B\377\1\216\15" \ + "2\377\235\0\0\0\377\1\0\0\0K\212\0\0\0\0\1\0\0\0\245\225\0\0\0\377\1" \ + "\16\1\5\377\273\274\21B\377\1\202\14.\377\234\0\0\0\377\1\223\15""4\377" \ + "\377\274\21B\377\217\274\21B\377\1`\11\"\377\264\0\0\0\377\1\\\10\40" \ + "\377\377\274\21B\377\214\274\21B\377\1\222\15""3\377\226\0\0\0\377\1" \ + "\244\17:\377\272\274\21B\377\1\243\17""9\377\235\0\0\0\377\1\0\0\0i\212" \ + "\0\0\0\0\1\0\0\0\275\225\0\0\0\377\1#\3\14\377\273\274\21B\377\1j\12" \ + "%\377\234\0\0\0\377\1n\12'\377\377\274\21B\377\216\274\21B\377\2\257" \ + "\20=\377\14\1\4\377\264\0\0\0\377\2\7\1\3\377\247\17;\377\377\274\21" \ + "B\377\213\274\21B\377\1b\11\"\377\226\0\0\0\377\1\214\15""1\377\272\274" \ + "\21B\377\1\263\20\77\377\235\0\0\0\377\1\0\0\0\200\212\0\0\0\0\1\0\0" \ + "\0\324\225\0\0\0\377\1""9\5\24\377\273\274\21B\377\1T\10\36\377\234\0" \ + "\0\0\377\1B\6\27\377\377\274\21B\377\216\274\21B\377\1V\10\36\377\266" \ + "\0\0\0\377\1A\6\27\377\377\274\21B\377\213\274\21B\377\1)\4\16\377\226" \ + "\0\0\0\377\1t\13)\377\272\274\21B\377\2\273\21B\377\3\0\1\377\234\0\0" \ + "\0\377\1\0\0\0\227\212\0\0\0\0\1\0\0\0\354\225\0\0\0\377\1H\6\31\377" \ + "\273\274\21B\377\1<\5\25\377\234\0\0\0\377\1\22\2\6\377\377\274\21B\377" \ + "\215\274\21B\377\2\247\17;\377\6\1\2\377\266\0\0\0\377\2\1\0\0\377\221" \ + "\15""3\377\377\274\21B\377\211\274\21B\377\2\253\17<\377\1\0\1\377\226" \ + "\0\0\0\377\1^\10!\377\273\274\21B\377\1\15\1\5\377\234\0\0\0\377\1\0" \ + "\0\0\256\211\0\0\0\0\2\0\0\0\6\0\0\0\376\225\0\0\0\377\1S\7\35\377\273" \ + "\274\21B\377\1%\3\15\377\235\0\0\0\377\1\241\17""8\377\377\274\21B\377" \ + "\214\274\21B\377\1M\7\33\377\270\0\0\0\377\2)\4\16\377\273\21A\377\377" \ + "\274\21B\377\210\274\21B\377\1w\13*\377\227\0\0\0\377\1D\6\30\377\273" \ + "\274\21B\377\1\31\2\11\377\234\0\0\0\377\1\0\0\0\306\211\0\0\0\0\1\0" \ + "\0\0\33\226\0\0\0\377\1^\10!\377\273\274\21B\377\1\15\1\5\377\235\0\0" \ + "\0\377\1q\12(\377\377\274\21B\377\213\274\21B\377\2\235\16""7\377\3\0" \ + "\1\377\271\0\0\0\377\1l\12&\377\377\274\21B\377\210\274\21B\377\1:\5" \ + "\24\377\227\0\0\0\377\1'\4\16\377\273\274\21B\377\1$\3\15\377\234\0\0" \ + "\0\377\1\0\0\0\334\211\0\0\0\0\1\0\0\0(\226\0\0\0\377\1h\11$\377\272" \ + "\274\21B\377\1\261\20>\377\236\0\0\0\377\1""8\5\24\377\377\274\21B\377" \ + "\213\274\21B\377\1""1\4\21\377\272\0\0\0\377\2\7\1\3\377\243\17""9\377" \ + "\377\274\21B\377\206\274\21B\377\2\253\17<\377\3\0\1\377\227\0\0\0\377" \ + "\2\12\1\3\377\273\21B\377\272\274\21B\377\1)\4\16\377\234\0\0\0\377\1" \ + "\0\0\0\352\211\0\0\0\0\1\0\0\0""1\226\0\0\0\377\1s\12(\377\272\274\21" \ + "B\377\1\223\15""4\377\236\0\0\0\377\2\7\1\2\377\265\20\77\377\377\274" \ + "\21B\377\211\274\21B\377\1\204\14.\377\274\0\0\0\377\1:\5\24\377\377" \ + "\274\21B\377\206\274\21B\377\1o\12'\377\231\0\0\0\377\1\251\17;\377\272" \ + "\274\21B\377\1*\4\17\377\234\0\0\0\377\1\0\0\0\363\211\0\0\0\0\1\0\0" \ + "\0:\226\0\0\0\377\1y\13*\377\272\274\21B\377\1v\13)\377\237\0\0\0\377" \ + "\1\205\14/\377\377\274\21B\377\210\274\21B\377\2\267\21@\377\35\3\12" \ + "\377\275\0\0\0\377\1w\13*\377\377\274\21B\377\205\274\21B\377\1*\4\17" \ + "\377\231\0\0\0\377\1\214\15""1\377\272\274\21B\377\1+\4\17\377\234\0" \ + "\0\0\377\1\0\0\0\374\211\0\0\0\0\1\0\0\0C\226\0\0\0\377\1z\13+\377\272" \ + "\274\21B\377\1Y\10\37\377\237\0\0\0\377\1H\7\31\377\377\274\21B\377\210" \ + "\274\21B\377\1^\11!\377\276\0\0\0\377\2\10\1\3\377\240\16""8\377\377" \ + "\274\21B\377\203\274\21B\377\1\226\16""5\377\232\0\0\0\377\1o\12'\377" \ + "\272\274\21B\377\1+\4\17\377\235\0\0\0\377\1\0\0\0\6\210\0\0\0\0\1\0" \ + "\0\0L\226\0\0\0\377\1{\13+\377\272\274\21B\377\1<\5\25\377\237\0\0\0" \ + "\377\2\12\1\3\377\265\20\77\377\377\274\21B\377\206\274\21B\377\2\231" \ + "\16""6\377\3\0\1\377\277\0\0\0\377\2&\3\15\377\270\21A\377\377\274\21" \ + "B\377\202\274\21B\377\1I\7\32\377\232\0\0\0\377\1S\10\35\377\272\274" \ + "\21B\377\1,\4\20\377\235\0\0\0\377\1\0\0\0\20\210\0\0\0\0\1\0\0\0T\226" \ + "\0\0\0\377\1}\13,\377\272\274\21B\377\1\37\3\13\377\240\0\0\0\377\1~" \ + "\13,\377\377\274\21B\377\205\274\21B\377\2\273\21B\377.\4\20\377\301" \ + "\0\0\0\377\1c\11#\377\377\274\21B\377\3\274\21B\377\261\20>\377\10\1" \ + "\3\377\232\0\0\0\377\1""4\5\22\377\272\274\21B\377\1'\4\16\377\235\0" \ + "\0\0\377\1\0\0\0\31\210\0\0\0\0\1\0\0\0S\226\0\0\0\377\1}\13,\377\271" \ + "\274\21B\377\2\272\21A\377\5\0\2\377\240\0\0\0\377\1:\5\24\377\377\274" \ + "\21B\377\205\274\21B\377\1i\12%\377\302\0\0\0\377\2\1\0\1\377\211\14" \ + "0\377\377\274\21B\377\1a\11\"\377\233\0\0\0\377\1\21\2\6\377\272\274" \ + "\21B\377\1\35\3\12\377\235\0\0\0\377\1\0\0\0\27\210\0\0\0\0\1\0\0\0N" \ + "\226\0\0\0\377\1x\13*\377\271\274\21B\377\1\237\16""8\377\241\0\0\0\377" \ + "\2\1\0\1\377\244\17""9\377\377\274\21B\377\203\274\21B\377\2\231\16""6" \ + "\377\4\0\2\377\303\0\0\0\377\2\21\2\6\377\252\17<\377\375\274\21B\377" \ + "\2\263\20\77\377\16\1\5\377\234\0\0\0\377\1\253\17<\377\271\274\21B\377" \ + "\1\25\2\7\377\235\0\0\0\377\1\0\0\0\21\210\0\0\0\0\1\0\0\0H\226\0\0\0" \ + "\377\1o\12'\377\271\274\21B\377\1|\13+\377\242\0\0\0\377\1X\10\37\377" \ + "\377\274\21B\377\202\274\21B\377\2\265\20@\377\36\3\13\377\305\0\0\0" \ + "\377\2""6\5\23\377\273\21A\377\374\274\21B\377\1m\12&\377\235\0\0\0\377" \ + "\1\211\14""0\377\271\274\21B\377\1\14\1\4\377\235\0\0\0\377\1\0\0\0\14" \ + "\210\0\0\0\0\1\0\0\0C\226\0\0\0\377\1f\11$\377\271\274\21B\377\1[\10" \ + "\40\377\242\0\0\0\377\2\21\2\6\377\267\21@\377\377\274\21B\377\2\274" \ + "\21B\377T\10\36\377\307\0\0\0\377\1\\\10\40\377\373\274\21B\377\2\266" \ + "\20@\377\26\2\10\377\235\0\0\0\377\1i\11%\377\271\274\21B\377\1\3\0\1" \ + "\377\235\0\0\0\377\1\0\0\0\6\210\0\0\0\0\1\0\0\0>\226\0\0\0\377\1^\10" \ + "!\377\271\274\21B\377\1""9\5\24\377\243\0\0\0\377\1p\12'\377\377\274" \ + "\21B\377\1\177\13-\377\311\0\0\0\377\1r\12(\377\372\274\21B\377\1b\11" \ + "\"\377\236\0\0\0\377\1F\6\31\377\270\274\21B\377\1\257\20>\377\236\0" \ + "\0\0\377\1\0\0\0\1\210\0\0\0\0\1\0\0\0""8\226\0\0\0\377\1U\10\36\377" \ + "\271\274\21B\377\1\30\2\10\377\243\0\0\0\377\2\31\2\11\377\271\21A\377" \ + "\375\274\21B\377\2\243\17""9\377\13\1\4\377\311\0\0\0\377\2\4\0\2\377" \ + "\216\15""2\377\370\274\21B\377\2\253\17<\377\12\1\3\377\236\0\0\0\377" \ + "\1%\3\15\377\270\274\21B\377\1\235\16""7\377\235\0\0\0\377\1\0\0\0\372" \ + "\211\0\0\0\0\1\0\0\0(\226\0\0\0\377\1E\6\30\377\270\274\21B\377\2\260" \ + "\20>\377\1\0\0\377\244\0\0\0\377\1}\13,\377\374\274\21B\377\2\270\21" \ + "A\377*\4\17\377\313\0\0\0\377\2\24\2\7\377\246\17:\377\367\274\21B\377" \ + "\1S\7\35\377\237\0\0\0\377\2\4\0\1\377\265\20@\377\267\274\21B\377\1" \ + "\212\14""0\377\235\0\0\0\377\1\0\0\0\351\211\0\0\0\0\1\0\0\0\24\226\0" \ + "\0\0\377\1""3\5\22\377\270\274\21B\377\1\220\15""2\377\245\0\0\0\377" \ + "\2!\3\14\377\272\21A\377\373\274\21B\377\1M\7\33\377\315\0\0\0\377\2" \ + "\32\2\11\377\253\17<\377\365\274\21B\377\2\223\15""4\377\1\0\1\377\240" \ + "\0\0\0\377\1\223\15""4\377\267\274\21B\377\1w\13*\377\235\0\0\0\377\1" \ + "\0\0\0\325\211\0\0\0\0\2\0\0\0\2\0\0\0\374\225\0\0\0\377\1\40\3\13\377" \ + "\270\274\21B\377\1i\12%\377\246\0\0\0\377\1q\12(\377\372\274\21B\377" \ + "\1h\11$\377\317\0\0\0\377\2&\3\15\377\263\20\77\377\363\274\21B\377\2" \ + "\272\21A\377&\3\15\377\241\0\0\0\377\1l\12&\377\267\274\21B\377\1d\11" \ + "#\377\235\0\0\0\377\1\0\0\0\301\212\0\0\0\0\1\0\0\0\352\225\0\0\0\377" \ + "\1\15\1\4\377\270\274\21B\377\1B\6\27\377\246\0\0\0\377\2\20\1\6\377" \ + "\262\20\77\377\370\274\21B\377\2\204\14.\377\1\0\1\377\320\0\0\0\377" \ + "\2""9\5\24\377\270\21A\377\362\274\21B\377\1o\12'\377\242\0\0\0\377\1" \ + "D\6\30\377\267\274\21B\377\1J\7\32\377\235\0\0\0\377\1\0\0\0\254\212" \ + "\0\0\0\0\1\0\0\0\326\225\0\0\0\377\2\1\0\0\377\266\20@\377\267\274\21" \ + "B\377\1\33\2\12\377\247\0\0\0\377\1`\11\"\377\367\274\21B\377\2\236\16" \ + "7\377\15\1\4\377\322\0\0\0\377\2""4\5\22\377\266\20@\377\360\274\21B" \ + "\377\2\234\16""7\377\6\1\2\377\242\0\0\0\377\1\34\3\12\377\267\274\21" \ + "B\377\1.\4\20\377\235\0\0\0\377\1\0\0\0\230\212\0\0\0\0\1\0\0\0\303\226" \ + "\0\0\0\377\1\234\16""7\377\266\274\21B\377\2\255\20=\377\1\0\0\377\247" \ + "\0\0\0\377\2\4\0\2\377\237\16""8\377\365\274\21B\377\2\244\17:\377\23" \ + "\2\7\377\324\0\0\0\377\2""5\5\23\377\266\20@\377\356\274\21B\377\2\270" \ + "\21A\377%\3\15\377\243\0\0\0\377\2\1\0\0\377\257\20>\377\266\274\21B" \ + "\377\1\20\1\6\377\235\0\0\0\377\1\0\0\0\205\212\0\0\0\0\1\0\0\0\244\226" \ + "\0\0\0\377\1\200\14-\377\266\274\21B\377\1\206\14/\377\251\0\0\0\377" \ + "\1""3\5\22\377\364\274\21B\377\2\254\20<\377\33\2\11\377\326\0\0\0\377" \ + "\2=\6\25\377\270\21@\377\355\274\21B\377\1_\11!\377\245\0\0\0\377\1\211" \ + "\14""0\377\265\274\21B\377\1\261\20>\377\236\0\0\0\377\1\0\0\0g\212\0" \ + "\0\0\0\1\0\0\0\200\226\0\0\0\377\1b\11\"\377\266\274\21B\377\1^\11!\377" \ + "\252\0\0\0\377\1~\13,\377\362\274\21B\377\2\265\20\77\377.\4\20\377\330" \ + "\0\0\0\377\2.\4\20\377\262\20>\377\353\274\21B\377\2\200\14-\377\1\0" \ + "\0\377\245\0\0\0\377\1^\10!\377\265\274\21B\377\1\223\15""4\377\236\0" \ + "\0\0\377\1\0\0\0C\212\0\0\0\0\1\0\0\0]\226\0\0\0\377\1G\6\31\377\266" \ + "\274\21B\377\1""8\5\24\377\252\0\0\0\377\2\14\1\4\377\247\17:\377\360" \ + "\274\21B\377\2\262\20\77\377+\4\17\377\332\0\0\0\377\2&\3\15\377\255" \ + "\20=\377\351\274\21B\377\2\236\16""7\377\12\1\3\377\246\0\0\0\377\1." \ + "\4\20\377\265\274\21B\377\1m\12&\377\236\0\0\0\377\1\0\0\0\37\212\0\0" \ + "\0\0\1\0\0\0""9\226\0\0\0\377\1)\4\16\377\265\274\21B\377\2\273\21A\377" \ + "\15\1\5\377\253\0\0\0\377\2""2\5\22\377\273\21B\377\356\274\21B\377\2" \ + "\262\20\77\377+\4\17\377\334\0\0\0\377\2\"\3\14\377\250\17;\377\347\274" \ + "\21B\377\2\262\20\77\377#\3\14\377\247\0\0\0\377\2\6\1\2\377\266\20@" \ + "\377\264\274\21B\377\1F\6\31\377\235\0\0\0\377\2\0\0\0\367\0\0\0\2\212" \ + "\0\0\0\0\1\0\0\0\25\226\0\0\0\377\2\6\1\2\377\270\21A\377\264\274\21" \ + "B\377\1\231\16""6\377\255\0\0\0\377\1o\12'\377\355\274\21B\377\2\264" \ + "\20\77\3771\4\21\377\336\0\0\0\377\2\22\2\6\377\225\15""4\377\345\274" \ + "\21B\377\2\267\21@\377.\4\20\377\251\0\0\0\377\1\220\15""2\377\264\274" \ + "\21B\377\1\37\3\13\377\235\0\0\0\377\1\0\0\0\326\214\0\0\0\0\1\0\0\0" \ + "\360\226\0\0\0\377\1\231\16""6\377\264\274\21B\377\1l\12&\377\255\0\0" \ + "\0\377\2\4\0\1\377\216\15""2\377\353\274\21B\377\2\255\20=\377%\3\15" \ + "\377\340\0\0\0\377\2\6\1\2\377|\13+\377\343\274\21B\377\2\273\21A\377" \ + "@\6\27\377\252\0\0\0\377\1c\11#\377\263\274\21B\377\2\262\20>\377\1\0" \ + "\1\377\235\0\0\0\377\1\0\0\0\263\214\0\0\0\0\1\0\0\0\306\226\0\0\0\377" \ + "\1r\12(\377\264\274\21B\377\1\77\6\26\377\256\0\0\0\377\2\21\2\6\377" \ + "\250\17;\377\351\274\21B\377\2\247\17:\377\35\3\12\377\342\0\0\0\377" \ + "\3\3\0\1\377f\11$\377\273\21B\377\341\274\21B\377\1V\10\36\377\253\0" \ + "\0\0\377\1""7\5\23\377\263\274\21B\377\1\215\15""1\377\236\0\0\0\377" \ + "\1\0\0\0\211\214\0\0\0\0\1\0\0\0\220\226\0\0\0\377\1K\7\32\377\264\274" \ + "\21B\377\1\22\2\6\377\257\0\0\0\377\2.\4\20\377\270\21@\377\347\274\21" \ + "B\377\2\241\17""8\377\32\2\11\377\345\0\0\0\377\2""7\5\23\377\257\20" \ + ">\377\336\274\21B\377\2\273\21B\377K\7\32\377\254\0\0\0\377\2\13\1\4" \ + "\377\271\21A\377\262\274\21B\377\1]\10!\377\236\0\0\0\377\1\0\0\0T\214" \ + "\0\0\0\0\1\0\0\0]\226\0\0\0\377\1$\3\15\377\263\274\21B\377\1\243\17" \ + "9\377\261\0\0\0\377\2""9\5\24\377\272\21A\377\345\274\21B\377\2\206\14" \ + "/\377\12\1\3\377\347\0\0\0\377\2\35\3\12\377\234\16""7\377\335\274\21" \ + "B\377\1W\10\37\377\256\0\0\0\377\1\217\15""2\377\262\274\21B\377\1+\4" \ + "\17\377\236\0\0\0\377\1\0\0\0\40\214\0\0\0\0\1\0\0\0)\226\0\0\0\377\2" \ + "\1\0\1\377\257\20=\377\262\274\21B\377\1t\12)\377\262\0\0\0\377\1M\7" \ + "\33\377\344\274\21B\377\2o\12'\377\3\0\1\377\351\0\0\0\377\3\4\0\1\377" \ + "^\11!\377\273\21A\377\331\274\21B\377\2\270\21@\377D\6\30\377\257\0\0" \ + "\0\377\1[\10\40\377\261\274\21B\377\2\262\20\77\377\3\0\1\377\235\0\0" \ + "\0\377\1\0\0\0\354\215\0\0\0\0\2\0\0\0\2\0\0\0\361\226\0\0\0\377\1}\13" \ + ",\377\262\274\21B\377\1>\6\26\377\263\0\0\0\377\1d\11#\377\341\274\21" \ + "B\377\3\272\21A\377Z\10\40\377\1\0\0\377\354\0\0\0\377\2""2\5\22\377" \ + "\251\17;\377\327\274\21B\377\2\262\20>\3771\4\21\377\260\0\0\0\377\1" \ + "&\3\15\377\261\274\21B\377\1\207\14/\377\236\0\0\0\377\1\0\0\0\270\216" \ + "\0\0\0\0\1\0\0\0\300\226\0\0\0\377\1M\7\33\377\261\274\21B\377\2\271" \ + "\21A\377\14\1\4\377\264\0\0\0\377\1^\11!\377\337\274\21B\377\2\252\17" \ + "<\377,\4\20\377\357\0\0\0\377\2\22\2\6\377\200\14-\377\325\274\21B\377" \ + "\2\247\17:\377(\4\16\377\261\0\0\0\377\2\2\0\1\377\256\20=\377\260\274" \ + "\21B\377\1S\7\35\377\236\0\0\0\377\1\0\0\0\205\216\0\0\0\0\1\0\0\0\211" \ + "\226\0\0\0\377\1\35\3\12\377\261\274\21B\377\1\222\15""3\377\266\0\0" \ + "\0\377\1e\11#\377\335\274\21B\377\2\223\15""4\377\26\2\10\377\362\0\0" \ + "\0\377\2""6\5\23\377\246\17:\377\322\274\21B\377\2\200\14-\377\12\1\4" \ + "\377\263\0\0\0\377\1z\13+\377\257\274\21B\377\2\273\21B\377\24\2\7\377" \ + "\236\0\0\0\377\1\0\0\0N\216\0\0\0\0\1\0\0\0C\227\0\0\0\377\1\244\17:" \ + "\377\260\274\21B\377\1_\11!\377\267\0\0\0\377\2P\7\34\377\273\21A\377" \ + "\331\274\21B\377\3\270\21A\377R\7\35\377\1\0\1\377\364\0\0\0\377\3\15" \ + "\1\4\377o\12'\377\273\21A\377\316\274\21B\377\3\272\21A\377`\11\"\377" \ + "\2\0\1\377\264\0\0\0\377\1H\6\31\377\257\274\21B\377\1\227\16""5\377" \ + "\236\0\0\0\377\2\0\0\0\372\0\0\0\15\216\0\0\0\0\2\0\0\0\10\0\0\0\366" \ + "\226\0\0\0\377\1g\11$\377\260\274\21B\377\1)\4\16\377\270\0\0\0\377\2" \ + ";\5\25\377\265\20@\377\327\274\21B\377\2\242\17""9\377(\4\16\377\370" \ + "\0\0\0\377\2\35\3\12\377\210\14""0\377\314\274\21B\377\2\241\17""8\377" \ + "'\4\16\377\266\0\0\0\377\2\16\1\5\377\271\21A\377\256\274\21B\377\1Y" \ + "\10\37\377\236\0\0\0\377\1\0\0\0\303\220\0\0\0\0\1\0\0\0\272\226\0\0" \ + "\0\377\1-\4\20\377\257\274\21B\377\2\257\20>\377\3\0\1\377\271\0\0\0" \ + "\377\2""1\4\21\377\255\20=\377\324\274\21B\377\3\273\21B\377u\13)\377" \ + "\15\1\4\377\260\0\0\0\377\12\1\0\1\377\23\2\7\377)\4\16\377<\5\25\377" \ + "H\7\31\377T\10\36\377`\11\"\377l\12&\377q\12(\377w\13*\377\203}\13,\377" \ + "\12y\13*\377q\12(\377n\12'\377a\11\"\377V\10\36\377I\7\32\377=\6\25\377" \ + "+\4\17\377\25\2\7\377\2\0\1\377\263\0\0\0\377\3\1\0\0\377E\6\30\377\245" \ + "\17:\377\311\274\21B\377\2{\13+\377\15\1\4\377\270\0\0\0\377\1\216\15" \ + "2\377\256\274\21B\377\1\36\3\13\377\236\0\0\0\377\1\0\0\0~\220\0\0\0" \ + "\0\1\0\0\0v\226\0\0\0\377\2\1\0\1\377\252\17<\377\256\274\21B\377\1v" \ + "\13)\377\273\0\0\0\377\2\17\1\5\377\212\14""0\377\322\274\21B\377\2\237" \ + "\16""8\377+\4\17\377\254\0\0\0\377\7\11\1\3\377*\4\17\377J\7\32\377i" \ + "\11%\377\210\14""0\377\244\17:\377\270\21A\377\225\274\21B\377\7\271" \ + "\21A\377\247\17:\377\213\15""1\377l\12&\377M\7\33\377.\4\20\377\13\1" \ + "\4\377\257\0\0\0\377\3\3\0\1\377K\7\32\377\250\17;\377\305\274\21B\377" \ + "\2\233\16""6\377-\4\20\377\272\0\0\0\377\1Q\7\34\377\255\274\21B\377" \ + "\1\223\15""4\377\237\0\0\0\377\1\0\0\0""9\220\0\0\0\0\1\0\0\0""2\227" \ + "\0\0\0\377\1p\12'\377\256\274\21B\377\1=\6\25\377\274\0\0\0\377\3\4\0" \ + "\2\377k\12&\377\273\21B\377\316\274\21B\377\3\270\21A\377f\11$\377\10" \ + "\1\3\377\251\0\0\0\377\5\40\3\13\377P\7\34\377w\13*\377\234\16""7\377" \ + "\272\21A\377\241\274\21B\377\6\273\21B\377\240\16""8\377z\13+\377S\10" \ + "\35\377%\3\15\377\1\0\1\377\254\0\0\0\377\3\12\1\3\377V\10\36\377\251" \ + "\17;\377\301\274\21B\377\3\262\20>\377Y\10\37\377\4\0\2\377\273\0\0\0" \ + "\377\2\26\2\10\377\273\21B\377\254\274\21B\377\1N\7\33\377\236\0\0\0" \ + "\377\2\0\0\0\360\0\0\0\4\220\0\0\0\0\2\0\0\0\2\0\0\0\352\226\0\0\0\377" \ + "\1)\4\16\377\255\274\21B\377\2\264\20\77\377\7\1\2\377\276\0\0\0\377" \ + "\2""0\4\21\377\247\17;\377\314\274\21B\377\2\204\14.\377\31\2\11\377" \ + "\247\0\0\0\377\4\15\1\4\377@\6\27\377t\13)\377\250\17;\377\253\274\21" \ + "B\377\4\254\20<\377z\13+\377E\6\30\377\17\1\5\377\253\0\0\0\377\3\5\0" \ + "\2\377J\7\32\377\240\16""8\377\275\274\21B\377\3\266\20@\377h\11$\377" \ + "\17\1\5\377\276\0\0\0\377\1\227\16""5\377\253\274\21B\377\2\267\21@\377" \ + "\15\1\5\377\236\0\0\0\377\1\0\0\0\257\222\0\0\0\0\1\0\0\0\225\227\0\0" \ + "\0\377\1\237\16""8\377\254\274\21B\377\1\201\14-\377\300\0\0\0\377\2" \ + "\21\2\6\377\203\14.\377\311\274\21B\377\2\237\16""8\377<\5\25\377\246" \ + "\0\0\0\377\4\32\2\11\377U\10\36\377\214\15""1\377\271\21A\377\261\274" \ + "\21B\377\4\273\21A\377\222\15""3\377Y\10\37\377\40\3\13\377\252\0\0\0" \ + "\377\4\1\0\1\3775\5\23\377\205\14/\377\273\21A\377\270\274\21B\377\3" \ + "\266\20@\377n\12'\377\25\2\7\377\300\0\0\0\377\1]\10!\377\253\274\21" \ + "B\377\1\202\14.\377\237\0\0\0\377\1\0\0\0X\222\0\0\0\0\1\0\0\0@\227\0" \ + "\0\0\377\1Y\10\37\377\254\274\21B\377\1F\6\31\377\302\0\0\0\377\2""1" \ + "\4\21\377\236\16""7\377\305\274\21B\377\3\241\17""9\377\77\6\26\377\1" \ + "\0\0\377\244\0\0\0\377\3\17\1\5\377X\10\37\377\235\16""7\377\271\274" \ + "\21B\377\3\237\16""8\377X\10\37\377\22\2\6\377\252\0\0\0\377\3\33\2\11" \ + "\377f\11$\377\252\17<\377\264\274\21B\377\3\262\20\77\377e\11#\377\22" \ + "\2\6\377\302\0\0\0\377\2\27\2\10\377\273\21B\377\252\274\21B\377\1""1" \ + "\4\21\377\236\0\0\0\377\2\0\0\0\364\0\0\0\12\222\0\0\0\0\2\0\0\0\2\0" \ + "\0\0\345\226\0\0\0\377\2\27\2\10\377\273\21A\377\252\274\21B\377\2\271" \ + "\21A\377\17\1\5\377\303\0\0\0\377\3\7\1\3\377b\11\"\377\265\20\77\377" \ + "\301\274\21B\377\3\244\17:\377O\7\34\377\7\1\2\377\244\0\0\0\377\3'\4" \ + "\16\377t\12)\377\264\20\77\377\275\274\21B\377\4\267\21@\377{\13+\377" \ + "/\4\21\377\1\0\0\377\251\0\0\0\377\4\4\0\1\377:\5\24\377\202\14.\377" \ + "\266\20@\377\257\274\21B\377\3\223\15""4\377J\7\32\377\12\1\3\377\305" \ + "\0\0\0\377\1\217\15""2\377\251\274\21B\377\1\231\16""6\377\237\0\0\0" \ + "\377\1\0\0\0\253\224\0\0\0\0\1\0\0\0\222\227\0\0\0\377\1\201\14-\377" \ + "\252\274\21B\377\1\202\14.\377\306\0\0\0\377\3\23\2\7\377o\12'\377\270" \ + "\21A\377\275\274\21B\377\3\231\16""6\377C\6\30\377\3\0\1\377\243\0\0" \ + "\0\377\3\6\1\2\377J\7\32\377\227\16""5\377\303\274\21B\377\3\236\16""7" \ + "\377R\7\35\377\12\1\3\377\252\0\0\0\377\4\11\1\3\377=\6\25\377w\13*\377" \ + "\256\20=\377\251\274\21B\377\3\237\16""8\377a\11\"\377\40\3\13\377\310" \ + "\0\0\0\377\1J\7\32\377\251\274\21B\377\1F\6\31\377\237\0\0\0\377\1\0" \ + "\0\0V\224\0\0\0\0\1\0\0\0=\227\0\0\0\377\1.\4\20\377\252\274\21B\377" \ + "\1>\6\26\377\310\0\0\0\377\3\33\2\11\377t\13)\377\270\21A\377\270\274" \ + "\21B\377\3\271\21A\377\177\13-\377/\4\21\377\244\0\0\0\377\3\16\1\5\377" \ + "d\11#\377\262\20>\377\307\274\21B\377\3\263\20\77\377k\12&\377\24\2\7" \ + "\377\253\0\0\0\377\5\2\0\1\377'\4\16\377Z\10\40\377\215\15""1\377\267" \ + "\21@\377\241\274\21B\377\4\267\21@\377\214\15""1\377Z\10\40\377\40\3" \ + "\13\377\313\0\0\0\377\2\13\1\4\377\265\20@\377\247\274\21B\377\2\252" \ + "\17<\377\4\0\2\377\236\0\0\0\377\2\0\0\0\364\0\0\0\12\224\0\0\0\0\2\0" \ + "\0\0\3\0\0\0\345\227\0\0\0\377\1\225\15""4\377\250\274\21B\377\2\260" \ + "\20>\377\6\1\2\377\312\0\0\0\377\3\26\2\10\377l\12&\377\265\20@\377\264" \ + "\274\21B\377\3\247\17:\377`\11\"\377\25\2\10\377\244\0\0\0\377\3\12\1" \ + "\3\377^\11!\377\260\20>\377\313\274\21B\377\3\264\20\77\377g\11$\377" \ + "\17\1\5\377\255\0\0\0\377\6\4\0\2\377)\4\16\377P\7\34\377y\13*\377\231" \ + "\16""6\377\267\21@\377\227\274\21B\377\6\273\21B\377\242\17""9\377~\13" \ + ",\377[\10\40\3774\5\22\377\7\1\3\377\317\0\0\0\377\1\200\14-\377\247" \ + "\274\21B\377\1X\10\37\377\237\0\0\0\377\1\0\0\0\253\226\0\0\0\0\1\0\0" \ + "\0\177\227\0\0\0\377\1D\6\30\377\250\274\21B\377\1q\12(\377\315\0\0\0" \ + "\377\3\15\1\4\377P\7\34\377\231\16""6\377\257\274\21B\377\4\265\20\77" \ + "\377}\13,\3774\5\22\377\1\0\1\377\244\0\0\0\377\3\12\1\4\377d\11#\377" \ + "\263\20\77\377\317\274\21B\377\3\265\20\77\377d\11#\377\15\1\4\377\260" \ + "\0\0\0\377\11\2\0\1\377\33\2\11\3778\5\24\377Q\7\34\377i\11%\377\200" \ + "\14-\377\224\15""4\377\241\17""9\377\257\20>\377\206\274\21B\377\12\265" \ + "\20@\377\257\20>\377\247\17:\377\223\15""4\377\203\14.\377s\12(\377[" \ + "\10\40\377\77\6\26\377$\3\15\377\11\1\3\377\324\0\0\0\377\1""7\5\23\377" \ + "\246\274\21B\377\2\256\20=\377\12\1\3\377\237\0\0\0\377\1\0\0\0B\226" \ + "\0\0\0\0\2\0\0\0\31\0\0\0\372\226\0\0\0\377\2\4\0\2\377\246\17:\377\247" \ + "\274\21B\377\1.\4\20\377\320\0\0\0\377\3&\3\15\377f\11$\377\244\17""9" \ + "\377\251\274\21B\377\4\253\17<\377r\12(\3779\5\24\377\7\1\2\377\246\0" \ + "\0\0\377\2@\6\27\377\247\17:\377\323\274\21B\377\3\254\20<\377J\7\32" \ + "\377\1\0\1\377\377\0\0\0\377\234\0\0\0\377\2\1\0\0\377\240\16""8\377" \ + "\245\274\21B\377\1V\10\36\377\237\0\0\0\377\1\0\0\0\324\230\0\0\0\0\1" \ + "\0\0\0\254\227\0\0\0\377\1M\7\33\377\246\274\21B\377\2\241\17""9\377" \ + "\1\0\0\377\323\0\0\0\377\4%\3\15\377^\11!\377\221\15""3\377\271\21A\377" \ + "\241\274\21B\377\5\265\20\77\377\211\14""0\377V\10\36\377#\3\14\377\1" \ + "\0\0\377\247\0\0\0\377\2*\4\17\377\226\16""5\377\327\274\21B\377\2\237" \ + "\16""8\3775\5\23\377\377\0\0\0\377\234\0\0\0\377\1T\10\36\377\244\274" \ + "\21B\377\2\254\20<\377\10\1\3\377\237\0\0\0\377\1\0\0\0o\230\0\0\0\0" \ + "\1\0\0\0C\227\0\0\0\377\2\4\0\1\377\244\17""9\377\245\274\21B\377\1R" \ + "\7\35\377\327\0\0\0\377\5\12\1\3\3778\5\24\377^\11!\377\202\14.\377\244" \ + "\17:\377\230\274\21B\377\6\265\20\77\377\227\16""5\377v\13)\377M\7\33" \ + "\377%\3\15\377\3\0\1\377\251\0\0\0\377\3\6\1\2\377e\11#\377\272\21A\377" \ + "\331\274\21B\377\3\273\21B\377q\12(\377\12\1\4\377\377\0\0\0\377\232" \ + "\0\0\0\377\2\16\1\5\377\266\20@\377\243\274\21B\377\1T\10\36\377\237" \ + "\0\0\0\377\2\0\0\0\364\0\0\0\20\230\0\0\0\0\2\0\0\0\1\0\0\0\330\227\0" \ + "\0\0\377\1J\7\32\377\244\274\21B\377\2\264\20\77\377\13\1\4\377\334\0" \ + "\0\0\377\12\12\1\4\377&\3\15\377B\6\27\377]\10!\377t\13)\377\204\14." \ + "\377\226\16""5\377\247\17;\377\257\20>\377\266\20@\377\205\274\21B\377" \ + "\12\273\21B\377\256\20=\377\241\17""8\377\223\15""4\377~\13,\377f\11" \ + "$\377O\7\34\3776\5\23\377\30\2\11\377\1\0\1\377\255\0\0\0\377\2""0\4" \ + "\21\377\244\17""9\377\335\274\21B\377\2\253\17<\377;\5\25\377\377\0\0" \ + "\0\377\232\0\0\0\377\1s\12(\377\242\274\21B\377\2\233\16""6\377\2\0\1" \ + "\377\237\0\0\0\377\1\0\0\0\234\232\0\0\0\0\1\0\0\0t\227\0\0\0\377\2\4" \ + "\0\2\377\241\17""8\377\243\274\21B\377\1t\12)\377\377\0\0\0\377\242\0" \ + "\0\0\377\3\3\0\1\377a\11\"\377\272\21A\377\337\274\21B\377\3\273\21B" \ + "\377m\12&\377\7\1\2\377\377\0\0\0\377\230\0\0\0\377\2$\3\15\377\273\21" \ + "B\377\241\274\21B\377\1""5\5\23\377\240\0\0\0\377\1\0\0\0""6\232\0\0" \ + "\0\0\2\0\0\0\13\0\0\0\353\227\0\0\0\377\1""2\5\22\377\243\274\21B\377" \ + "\1#\3\14\377\377\0\0\0\377\241\0\0\0\377\2!\3\14\377\234\16""7\377\343" \ + "\274\21B\377\2\244\17""9\377+\4\17\377\377\0\0\0\377\230\0\0\0\377\1" \ + "\205\14/\377\240\274\21B\377\1\204\14.\377\240\0\0\0\377\1\0\0\0\274" \ + "\234\0\0\0\0\1\0\0\0\177\230\0\0\0\377\1\207\14/\377\241\274\21B\377" \ + "\1\220\15""2\377\377\0\0\0\377\241\0\0\0\377\2B\6\27\377\262\20\77\377" \ + "\345\274\21B\377\2\266\20@\377O\7\34\377\377\0\0\0\377\227\0\0\0\377" \ + "\1'\4\16\377\237\274\21B\377\2\260\20>\377\23\2\7\377\240\0\0\0\377\1" \ + "\0\0\0A\234\0\0\0\0\2\0\0\0\17\0\0\0\360\227\0\0\0\377\2\35\3\12\377" \ + "\270\21A\377\240\274\21B\377\1""5\5\23\377\377\0\0\0\377\237\0\0\0\377" \ + "\2\4\0\2\377q\12(\377\351\274\21B\377\2\202\14.\377\13\1\4\377\377\0" \ + "\0\0\377\226\0\0\0\377\1\210\14""0\377\236\274\21B\377\1M\7\33\377\240" \ + "\0\0\0\377\1\0\0\0\304\236\0\0\0\0\1\0\0\0\210\230\0\0\0\377\1]\10!\377" \ + "\237\274\21B\377\1\221\15""3\377\377\0\0\0\377\237\0\0\0\377\2\17\1\5" \ + "\377\216\15""2\377\353\274\21B\377\2\230\16""5\377\27\2\10\377\377\0" \ + "\0\0\377\225\0\0\0\377\1""1\4\21\377\235\274\21B\377\2\222\15""3\377" \ + "\1\0\1\377\240\0\0\0\377\1\0\0\0L\236\0\0\0\0\2\0\0\0\26\0\0\0\365\227" \ + "\0\0\0\377\2\3\0\1\377\230\16""5\377\236\274\21B\377\1""9\5\24\377\377" \ + "\0\0\0\377\236\0\0\0\377\2\35\3\12\377\245\17:\377\355\274\21B\377\2" \ + "\257\20=\377+\4\17\377\377\0\0\0\377\225\0\0\0\377\1\206\14/\377\233" \ + "\274\21B\377\2\265\20\77\377\36\3\13\377\240\0\0\0\377\1\0\0\0\315\240" \ + "\0\0\0\0\1\0\0\0\226\230\0\0\0\377\2*\4\17\377\273\21A\377\234\274\21" \ + "B\377\2\234\16""7\377\1\0\0\377\377\0\0\0\377\235\0\0\0\377\2+\4\17\377" \ + "\257\20=\377\357\274\21B\377\2\264\20\77\3777\5\23\377\377\0\0\0\377" \ + "\224\0\0\0\377\2\31\2\11\377\266\20@\377\232\274\21B\377\1@\6\27\377" \ + "\241\0\0\0\377\1\0\0\0[\240\0\0\0\0\2\0\0\0\26\0\0\0\361\230\0\0\0\377" \ + "\1g\11$\377\234\274\21B\377\1""6\5\23\377\377\0\0\0\377\235\0\0\0\377" \ + "\2/\4\21\377\262\20\77\377\361\274\21B\377\2\270\21@\377>\6\26\377\377" \ + "\0\0\0\377\224\0\0\0\377\1a\11\"\377\231\274\21B\377\1n\12'\377\241\0" \ + "\0\0\377\2\0\0\0\313\0\0\0\2\241\0\0\0\0\1\0\0\0|\230\0\0\0\377\2\3\0" \ + "\1\377\217\15""2\377\232\274\21B\377\1\200\14-\377\377\0\0\0\377\235" \ + "\0\0\0\377\2<\5\25\377\270\21@\377\363\274\21B\377\2\273\21B\377O\7\34" \ + "\377\377\0\0\0\377\223\0\0\0\377\2\12\1\3\377\251\17;\377\227\274\21" \ + "B\377\2\231\16""6\377\7\1\2\377\241\0\0\0\377\1\0\0\0\77\242\0\0\0\0" \ + "\2\0\0\0\11\0\0\0\340\230\0\0\0\377\2\22\2\6\377\252\17<\377\230\274" \ + "\21B\377\2\265\20\77\377\25\2\10\377\377\0\0\0\377\234\0\0\0\377\2:\5" \ + "\24\377\267\21@\377\365\274\21B\377\2\273\21A\377I\7\32\377\377\0\0\0" \ + "\377\223\0\0\0\377\2.\4\20\377\272\21A\377\225\274\21B\377\2\247\17;" \ + "\377\23\2\7\377\241\0\0\0\377\1\0\0\0\257\244\0\0\0\0\1\0\0\0\\\231\0" \ + "\0\0\377\2""6\5\23\377\273\21A\377\227\274\21B\377\1b\11\"\377\377\0" \ + "\0\0\377\234\0\0\0\377\2>\6\26\377\272\21A\377\367\274\21B\377\2\273" \ + "\21B\377K\7\32\377\377\0\0\0\377\223\0\0\0\377\1e\11#\377\224\274\21" \ + "B\377\2\264\20\77\377%\3\15\377\241\0\0\0\377\2\0\0\0\370\0\0\0#\244" \ + "\0\0\0\0\2\0\0\0\1\0\0\0\311\231\0\0\0\377\1S\7\35\377\226\274\21B\377" \ + "\2\224\15""4\377\4\0\1\377\377\0\0\0\377\233\0\0\0\377\2""4\5\22\377" \ + "\270\21@\377\371\274\21B\377\2\273\21A\377@\6\27\377\377\0\0\0\377\222" \ + "\0\0\0\377\2\4\0\1\377\223\15""4\377\222\274\21B\377\2\273\21A\377<\5" \ + "\25\377\242\0\0\0\377\1\0\0\0\216\246\0\0\0\0\2\0\0\0""9\0\0\0\376\231" \ + "\0\0\0\377\1n\12'\377\224\274\21B\377\2\262\20\77\377\33\2\11\377\377" \ + "\0\0\0\377\233\0\0\0\377\2#\3\14\377\261\20>\377\373\274\21B\377\2\266" \ + "\20@\377/\4\21\377\377\0\0\0\377\222\0\0\0\377\2\35\3\12\377\255\20=" \ + "\377\221\274\21B\377\1T\10\36\377\242\0\0\0\377\2\0\0\0\354\0\0\0\21" \ + "\247\0\0\0\0\1\0\0\0\247\231\0\0\0\377\2\2\0\1\377\205\14/\377\223\274" \ + "\21B\377\1J\7\32\377\377\0\0\0\377\233\0\0\0\377\2\33\2\11\377\255\20" \ + "=\377\375\274\21B\377\2\262\20\77\377#\3\14\377\355\0\0\0\377\6\15\1" \ + "\4\3774\5\22\377P\7\34\377i\12%\377}\13,\377\207\14/\377\202\212\14""0" \ + "\377\6\210\14""0\377x\13*\377i\11%\377R\7\35\3771\4\21\377\16\1\5\377" \ + "\226\0\0\0\377\2!\3\14\377\257\20>\377\216\274\21B\377\2\273\21B\377" \ + "J\7\32\377\243\0\0\0\377\1\0\0\0k\250\0\0\0\0\2\0\0\0\22\0\0\0\350\231" \ + "\0\0\0\377\2\15\1\4\377\227\16""5\377\221\274\21B\377\2y\13*\377\1\0" \ + "\0\377\377\0\0\0\377\232\0\0\0\377\2\15\1\4\377\236\16""7\377\377\274" \ + "\21B\377\2\251\17;\377\25\2\7\377\350\0\0\0\377\5\15\1\5\377\77\6\26" \ + "\377q\12(\377\237\16""8\377\273\21B\377\214\274\21B\377\4\273\21A\377" \ + "\230\16""5\377e\11#\377#\3\14\377\224\0\0\0\377\2""1\4\21\377\267\21" \ + "@\377\215\274\21B\377\1V\10\36\377\243\0\0\0\377\2\0\0\0\272\0\0\0\1" \ + "\251\0\0\0\0\1\0\0\0V\232\0\0\0\377\2\12\1\4\377\223\15""4\377\217\274" \ + "\21B\377\2~\13,\377\2\0\1\377\377\0\0\0\377\232\0\0\0\377\2\1\0\1\377" \ + "\205\14/\377\377\274\21B\377\202\274\21B\377\2\223\15""4\377\5\0\2\377" \ + "\344\0\0\0\377\4\5\0\2\377<\5\25\377\202\14.\377\270\21@\377\224\274" \ + "\21B\377\3\233\16""6\377E\6\30\377\3\0\1\377\222\0\0\0\377\2.\4\20\377" \ + "\255\20=\377\212\274\21B\377\2\271\21A\377J\7\32\377\243\0\0\0\377\2" \ + "\0\0\0\363\0\0\0\40\253\0\0\0\0\1\0\0\0\255\232\0\0\0\377\2\16\1\5\377" \ + "\231\16""6\377\215\274\21B\377\2\221\15""3\377\7\1\3\377\377\0\0\0\377" \ + "\233\0\0\0\377\1b\11\"\377\377\274\21B\377\204\274\21B\377\1x\13*\377" \ + "\342\0\0\0\377\3(\4\16\377o\12'\377\257\20>\377\231\274\21B\377\2\241" \ + "\17""9\377\77\6\26\377\222\0\0\0\377\2\26\2\10\377\210\14""0\377\210" \ + "\274\21B\377\2\262\20\77\3775\5\23\377\244\0\0\0\377\1\0\0\0s\254\0\0" \ + "\0\0\2\0\0\0\30\0\0\0\356\232\0\0\0\377\2\14\1\4\377\213\15""1\377\213" \ + "\274\21B\377\2\203\14.\377\12\1\3\377\377\0\0\0\377\233\0\0\0\377\2<" \ + "\5\25\377\273\21B\377\377\274\21B\377\205\274\21B\377\1J\7\32\377\336" \ + "\0\0\0\377\3\1\0\0\3779\5\24\377\217\15""2\377\236\274\21B\377\2\217" \ + "\15""2\377\37\3\13\377\222\0\0\0\377\3""7\5\23\377\213\15""1\377\273" \ + "\21A\377\203\274\21B\377\3\272\21A\377\213\15""1\377#\3\14\377\244\0" \ + "\0\0\377\2\0\0\0\305\0\0\0\2\255\0\0\0\0\1\0\0\0c\233\0\0\0\377\2\4\0" \ + "\2\377w\13*\377\210\274\21B\377\3\265\20\77\377S\10\35\377\1\0\1\377" \ + "\377\0\0\0\377\233\0\0\0\377\2\23\2\7\377\255\20=\377\377\274\21B\377" \ + "\206\274\21B\377\2\265\20\77\377\37\3\13\377\333\0\0\0\377\3\7\1\3\377" \ + "R\7\35\377\244\17""9\377\241\274\21B\377\3\270\21A\377^\11!\377\1\0\1" \ + "\377\222\0\0\0\377\5\17\1\5\377-\4\20\3772\5\22\377,\4\20\377\13\1\4" \ + "\377\245\0\0\0\377\2\0\0\0\371\0\0\0-\256\0\0\0\0\2\0\0\0\1\0\0\0\270" \ + "\233\0\0\0\377\3\1\0\0\377U\10\36\377\245\17:\377\204\274\21B\377\3\256" \ + "\20=\377i\12%\377\24\2\7\377\377\0\0\0\377\234\0\0\0\377\2\1\0\1\377" \ + "\217\15""2\377\377\274\21B\377\210\274\21B\377\2\235\16""7\377\6\1\2" \ + "\377\330\0\0\0\377\3\1\0\0\377E\6\30\377\247\17:\377\245\274\21B\377" \ + "\1f\11$\377\274\0\0\0\377\1\0\0\0~\260\0\0\0\0\2\0\0\0\21\0\0\0\340\234" \ + "\0\0\0\377\2\1\0\0\377\32\2\11\377\2022\5\22\377\2#\3\14\377\4\0\1\377" \ + "\377\0\0\0\377\236\0\0\0\377\1S\7\35\377\377\274\21B\377\212\274\21B" \ + "\377\1d\11#\377\327\0\0\0\377\2,\4\20\377\225\15""4\377\250\274\21B\377" \ + "\1R\7\35\377\272\0\0\0\377\2\0\0\0\263\0\0\0\1\261\0\0\0\0\2\0\0\0=\0" \ + "\0\0\373\377\0\0\0\377\276\0\0\0\377\2\32\2\11\377\264\20\77\377\377" \ + "\274\21B\377\212\274\21B\377\2\271\21A\377&\3\15\377\324\0\0\0\377\2" \ + "\40\3\13\377\212\14""0\377\252\274\21B\377\2\273\21A\3774\5\22\377\270" \ + "\0\0\0\377\2\0\0\0\345\0\0\0\25\263\0\0\0\0\1\0\0\0{\377\0\0\0\377\275" \ + "\0\0\0\377\2\1\0\0\377\216\15""2\377\377\274\21B\377\214\274\21B\377" \ + "\2\234\16""7\377\4\0\1\377\321\0\0\0\377\3\3\0\1\377Y\10\37\377\266\20" \ + "@\377\254\274\21B\377\2\250\17;\377\12\1\4\377\266\0\0\0\377\2\0\0\0" \ + "\374\0\0\0\77\264\0\0\0\0\2\0\0\0\2\0\0\0\272\377\0\0\0\377\274\0\0\0" \ + "\377\1F\6\31\377\377\274\21B\377\216\274\21B\377\1X\10\37\377\320\0\0" \ + "\0\377\2%\3\15\377\234\16""7\377\257\274\21B\377\1n\12'\377\266\0\0\0" \ + "\377\1\0\0\0\201\266\0\0\0\0\2\0\0\0\26\0\0\0\346\302\0\0\0\377\3\22" \ + "\2\6\377%\3\15\377.\4\20\377\2032\5\22\377\3&\3\15\377\26\2\10\377\10" \ + "\1\3\377\356\0\0\0\377\2\13\1\4\377\253\17<\377\377\274\21B\377\216\274" \ + "\21B\377\2\263\20\77\377\25\2\10\377\315\0\0\0\377\3\4\0\2\377d\11#\377" \ + "\271\21A\377\260\274\21B\377\2\273\21A\377)\4\16\377\264\0\0\0\377\2" \ + "\0\0\0\275\0\0\0\2\267\0\0\0\0\2\0\0\0E\0\0\0\373\274\0\0\0\377\5\40" \ + "\3\13\377P\7\34\377t\13)\377\231\16""6\377\264\20\77\377\211\274\21B" \ + "\377\6\256\20=\377\226\16""5\377z\13+\377S\7\35\377+\4\17\377\7\1\2\377" \ + "\350\0\0\0\377\1g\11$\377\377\274\21B\377\220\274\21B\377\1z\13+\377" \ + "\314\0\0\0\377\2\33\2\12\377\222\15""3\377\263\274\21B\377\2\223\15""4" \ + "\377\1\0\1\377\262\0\0\0\377\2\0\0\0\347\0\0\0\35\271\0\0\0\0\1\0\0\0" \ + "`\270\0\0\0\377\4\1\0\0\377)\4\16\377l\12&\377\246\17:\377\223\274\21" \ + "B\377\5\270\21A\377\227\16""5\377m\12&\3775\5\23\377\4\0\2\377\343\0" \ + "\0\0\377\2\32\2\11\377\270\21@\377\377\274\21B\377\220\274\21B\377\2" \ + "\273\21B\377&\3\15\377\312\0\0\0\377\2B\6\27\377\262\20\77\377\265\274" \ + "\21B\377\1B\6\27\377\261\0\0\0\377\2\0\0\0\364\0\0\0""1\273\0\0\0\0\1" \ + "\0\0\0\214\265\0\0\0\377\3\7\1\2\377L\7\33\377\237\16""8\377\232\274" \ + "\21B\377\4\261\20>\377z\13+\377>\6\26\377\10\1\3\377\340\0\0\0\377\1" \ + "w\13*\377\377\274\21B\377\222\274\21B\377\1\210\14""0\377\310\0\0\0\377" \ + "\2\10\1\3\377w\13*\377\267\274\21B\377\2\237\16""8\377\1\0\1\377\257" \ + "\0\0\0\377\2\0\0\0\375\0\0\0R\274\0\0\0\0\2\0\0\0\2\0\0\0\261\262\0\0" \ + "\0\377\3\2\0\1\377L\7\33\377\253\17<\377\237\274\21B\377\3\265\20@\377" \ + "{\13+\377.\4\20\377\335\0\0\0\377\2\40\3\13\377\273\21A\377\377\274\21" \ + "B\377\223\274\21B\377\1/\4\21\377\306\0\0\0\377\2!\3\14\377\237\16""8" \ + "\377\271\274\21B\377\1:\5\24\377\257\0\0\0\377\1\0\0\0|\276\0\0\0\0\2" \ + "\0\0\0\15\0\0\0\321\260\0\0\0\377\2\34\3\12\377\232\16""6\377\244\274" \ + "\21B\377\3\235\16""7\377P\7\34\377\13\1\4\377\332\0\0\0\377\1y\13*\377" \ + "\377\274\21B\377\224\274\21B\377\1\213\15""1\377\305\0\0\0\377\2@\6\27" \ + "\377\262\20>\377\272\274\21B\377\1\220\15""2\377\256\0\0\0\377\2\0\0" \ + "\0\244\0\0\0\1\277\0\0\0\0\2\0\0\0\37\0\0\0\350\256\0\0\0\377\2,\4\20" \ + "\377\257\20>\377\247\274\21B\377\3\264\20\77\377q\12(\377\30\2\11\377" \ + "\327\0\0\0\377\2\34\3\12\377\272\21A\377\377\274\21B\377\225\274\21B" \ + "\377\1-\4\20\377\302\0\0\0\377\2\1\0\1\377e\11#\377\275\274\21B\377\1" \ + ",\4\20\377\254\0\0\0\377\2\0\0\0\307\0\0\0\10\301\0\0\0\0\1\0\0\0|\255" \ + "\0\0\0\377\2)\4\16\377\262\20\77\377\252\274\21B\377\3\270\21A\377s\12" \ + "(\377\30\2\11\377\325\0\0\0\377\1m\12&\377\377\274\21B\377\226\274\21" \ + "B\377\1\201\14-\377\301\0\0\0\377\2\17\1\5\377\216\15""2\377\276\274" \ + "\21B\377\1{\13+\377\254\0\0\0\377\1\0\0\0C\302\0\0\0\0\1\0\0\0E\254\0" \ + "\0\0\377\2\33\2\12\377\257\20=\377\255\274\21B\377\3\273\21A\377}\13" \ + ",\377\35\3\12\377\322\0\0\0\377\2\16\1\5\377\265\20\77\377\377\274\21" \ + "B\377\226\274\21B\377\2\273\21A\377\32\2\11\377\277\0\0\0\377\2\40\3" \ + "\13\377\242\17""9\377\277\274\21B\377\2\266\20@\377\14\1\4\377\252\0" \ + "\0\0\377\2\0\0\0\375\0\0\0\15\302\0\0\0\0\2\0\0\0\21\0\0\0\376\252\0" \ + "\0\0\377\2\5\0\2\377\231\16""6\377\260\274\21B\377\3\270\21A\377k\12" \ + "&\377\14\1\4\377\320\0\0\0\377\1V\10\36\377\377\274\21B\377\230\274\21" \ + "B\377\1i\11%\377\276\0\0\0\377\2:\5\24\377\262\20\77\377\301\274\21B" \ + "\377\1I\7\32\377\252\0\0\0\377\1\0\0\0\326\304\0\0\0\0\1\0\0\0\333\252" \ + "\0\0\0\377\1h\11$\377\263\274\21B\377\3\254\20<\377H\6\31\377\1\0\0\377" \ + "\315\0\0\0\377\2\1\0\0\377\242\17""9\377\377\274\21B\377\230\274\21B" \ + "\377\2\257\20=\377\7\1\2\377\274\0\0\0\377\2L\7\33\377\271\21A\377\302" \ + "\274\21B\377\1\213\15""1\377\252\0\0\0\377\1\0\0\0\241\304\0\0\0\0\1" \ + "\0\0\0\246\251\0\0\0\377\2&\3\15\377\273\21A\377\265\274\21B\377\2\231" \ + "\16""6\377,\4\20\377\314\0\0\0\377\1""1\4\21\377\377\274\21B\377\232" \ + "\274\21B\377\1C\6\30\377\272\0\0\0\377\2\1\0\1\377k\12&\377\304\274\21" \ + "B\377\2\273\21B\377\30\2\11\377\251\0\0\0\377\1\0\0\0l\304\0\0\0\0\1" \ + "\0\0\0r\251\0\0\0\377\1\213\15""1\377\267\274\21B\377\3\273\21A\377o" \ + "\12'\377\13\1\4\377\312\0\0\0\377\1u\13)\377\377\274\21B\377\232\274" \ + "\21B\377\1\210\14""0\377\271\0\0\0\377\2\2\0\1\377q\12(\377\306\274\21" \ + "B\377\1T\10\36\377\251\0\0\0\377\1\0\0\0""6\304\0\0\0\0\1\0\0\0=\250" \ + "\0\0\0\377\1=\6\25\377\272\274\21B\377\2\253\17<\377<\5\25\377\310\0" \ + "\0\0\377\2\11\1\3\377\264\20\77\377\377\274\21B\377\232\274\21B\377\2" \ + "\273\21A\377\25\2\10\377\267\0\0\0\377\2\12\1\3\377\212\14""0\377\307" \ + "\274\21B\377\1\213\15""1\377\250\0\0\0\377\2\0\0\0\370\0\0\0\7\304\0" \ + "\0\0\0\2\0\0\0\14\0\0\0\372\246\0\0\0\377\2\1\0\1\377\237\16""8\377\273" \ + "\274\21B\377\3\273\21B\377s\12(\377\13\1\4\377\306\0\0\0\377\1<\5\25" \ + "\377\377\274\21B\377\234\274\21B\377\1P\7\34\377\266\0\0\0\377\2\20\1" \ + "\6\377\225\15""4\377\310\274\21B\377\2\270\21@\377\11\1\3\377\247\0\0" \ + "\0\377\1\0\0\0\313\306\0\0\0\0\1\0\0\0\305\246\0\0\0\377\1""7\5\23\377" \ + "\276\274\21B\377\2\253\17<\377<\5\25\377\305\0\0\0\377\1y\13*\377\377" \ + "\274\21B\377\234\274\21B\377\1\214\15""1\377\265\0\0\0\377\2\21\2\6\377" \ + "\233\16""6\377\312\274\21B\377\1""5\5\23\377\247\0\0\0\377\1\0\0\0\211" \ + "\306\0\0\0\0\1\0\0\0\206\246\0\0\0\377\1\201\14-\377\277\274\21B\377" \ + "\3\273\21B\377o\12'\377\6\1\2\377\302\0\0\0\377\2\4\0\2\377\261\20>\377" \ + "\377\274\21B\377\234\274\21B\377\2\272\21A\377\16\1\5\377\263\0\0\0\377" \ + "\2\30\2\11\377\244\17:\377\313\274\21B\377\1k\12&\377\247\0\0\0\377\1" \ + "\0\0\0J\306\0\0\0\0\1\0\0\0G\245\0\0\0\377\2\30\2\10\377\273\21A\377" \ + "\301\274\21B\377\2\237\16""8\377\40\3\13\377\301\0\0\0\377\1/\4\21\377" \ + "\377\274\21B\377\236\274\21B\377\1B\6\27\377\262\0\0\0\377\2\32\2\11" \ + "\377\246\17:\377\314\274\21B\377\1\237\16""8\377\246\0\0\0\377\2\0\0" \ + "\0\374\0\0\0\16\306\0\0\0\0\2\0\0\0\14\0\0\0\372\244\0\0\0\377\1^\10" \ + "!\377\303\274\21B\377\2\261\20>\377>\6\26\377\300\0\0\0\377\1a\11\"\377" \ + "\377\274\21B\377\236\274\21B\377\1s\12(\377\261\0\0\0\377\2\27\2\10\377" \ + "\243\17""9\377\316\274\21B\377\1\22\2\6\377\245\0\0\0\377\1\0\0\0\313" \ + "\310\0\0\0\0\1\0\0\0\307\244\0\0\0\377\1\231\16""6\377\305\274\21B\377" \ + "\2w\13*\377\7\1\3\377\276\0\0\0\377\1\220\15""2\377\377\274\21B\377\236" \ + "\274\21B\377\1\242\17""9\377\260\0\0\0\377\2\40\3\13\377\252\17<\377" \ + "\317\274\21B\377\1:\5\24\377\245\0\0\0\377\1\0\0\0\214\310\0\0\0\0\1" \ + "\0\0\0\212\243\0\0\0\377\2\23\2\7\377\273\21B\377\306\274\21B\377\2\225" \ + "\15""4\377\25\2\7\377\274\0\0\0\377\2\7\1\3\377\270\21@\377\377\274\21" \ + "B\377\237\274\21B\377\1\26\2\10\377\256\0\0\0\377\2\33\2\11\377\247\17" \ + ";\377\320\274\21B\377\1_\11!\377\245\0\0\0\377\1\0\0\0O\310\0\0\0\0\1" \ + "\0\0\0C\243\0\0\0\377\1J\7\32\377\310\274\21B\377\2\256\20=\377.\4\20" \ + "\377\273\0\0\0\377\1,\4\20\377\377\274\21B\377\240\274\21B\377\1\77\6" \ + "\26\377\255\0\0\0\377\2\35\3\12\377\253\17<\377\321\274\21B\377\1\207" \ + "\14/\377\244\0\0\0\377\2\0\0\0\371\0\0\0\15\310\0\0\0\0\2\0\0\0\6\0\0" \ + "\0\362\242\0\0\0\377\1\201\14-\377\311\274\21B\377\2\267\21@\377F\6\31" \ + "\377\272\0\0\0\377\1S\10\35\377\377\274\21B\377\240\274\21B\377\1e\11" \ + "#\377\254\0\0\0\377\2\30\2\11\377\247\17:\377\322\274\21B\377\1\255\20" \ + "=\377\244\0\0\0\377\1\0\0\0\275\312\0\0\0\0\1\0\0\0\256\241\0\0\0\377" \ + "\2\1\0\0\377\257\20>\377\312\274\21B\377\3\273\21B\377]\10!\377\1\0\0" \ + "\377\270\0\0\0\377\1w\13*\377\377\274\21B\377\240\274\21B\377\1\212\14" \ + "0\377\253\0\0\0\377\2\23\2\7\377\242\17""9\377\324\274\21B\377\1\30\2" \ + "\11\377\243\0\0\0\377\1\0\0\0t\312\0\0\0\0\1\0\0\0e\241\0\0\0\377\1\32" \ + "\2\11\377\315\274\21B\377\2\200\14-\377\10\1\3\377\267\0\0\0\377\1\233" \ + "\16""6\377\377\274\21B\377\240\274\21B\377\1\255\20=\377\252\0\0\0\377" \ + "\2\15\1\5\377\232\16""6\377\325\274\21B\377\1=\6\25\377\243\0\0\0\377" \ + "\1\0\0\0*\312\0\0\0\0\2\0\0\0\34\0\0\0\376\240\0\0\0\377\1<\5\25\377" \ + "\316\274\21B\377\2\220\15""2\377\14\1\4\377\265\0\0\0\377\2\2\0\1\377" \ + "\270\21A\377\377\274\21B\377\241\274\21B\377\1\20\1\6\377\250\0\0\0\377" \ + "\2\16\1\5\377\233\16""6\377\326\274\21B\377\1[\10\40\377\242\0\0\0\377" \ + "\1\0\0\0\337\314\0\0\0\0\1\0\0\0\321\240\0\0\0\377\1a\11\"\377\317\274" \ + "\21B\377\2\236\16""7\377\25\2\10\377\264\0\0\0\377\1\30\2\10\377\377" \ + "\274\21B\377\242\274\21B\377\1*\4\17\377\247\0\0\0\377\2\7\1\2\377\220" \ + "\15""2\377\327\274\21B\377\1t\12)\377\242\0\0\0\377\1\0\0\0\225\314\0" \ + "\0\0\0\1\0\0\0\210\240\0\0\0\377\1\205\14/\377\320\274\21B\377\2\245" \ + "\17:\377\34\3\12\377\263\0\0\0\377\1""1\4\21\377\377\274\21B\377\242" \ + "\274\21B\377\1D\6\30\377\246\0\0\0\377\2\4\0\2\377\213\15""1\377\330" \ + "\274\21B\377\1\216\15""2\377\242\0\0\0\377\1\0\0\0M\314\0\0\0\0\1\0\0" \ + "\0""5\240\0\0\0\377\1\244\17:\377\321\274\21B\377\2\250\17;\377\37\3" \ + "\13\377\262\0\0\0\377\1J\7\32\377\377\274\21B\377\242\274\21B\377\1]" \ + "\10!\377\245\0\0\0\377\2\1\0\1\377z\13+\377\331\274\21B\377\1\250\17" \ + ";\377\241\0\0\0\377\2\0\0\0\361\0\0\0\7\314\0\0\0\0\2\0\0\0\1\0\0\0\341" \ + "\236\0\0\0\377\2\2\0\1\377\271\21A\377\322\274\21B\377\2\260\20>\377" \ + ",\4\20\377\261\0\0\0\377\1\\\10\40\377\377\274\21B\377\242\274\21B\377" \ + "\1o\12'\377\245\0\0\0\377\1f\11$\377\332\274\21B\377\2\273\21B\377\7" \ + "\1\2\377\240\0\0\0\377\1\0\0\0\250\316\0\0\0\0\1\0\0\0\221\236\0\0\0" \ + "\377\1\22\2\6\377\324\274\21B\377\2\262\20\77\377+\4\17\377\260\0\0\0" \ + "\377\1l\12&\377\377\274\21B\377\242\274\21B\377\1\177\13-\377\244\0\0" \ + "\0\377\1U\10\36\377\334\274\21B\377\1\37\3\13\377\240\0\0\0\377\1\0\0" \ + "\0W\316\0\0\0\0\1\0\0\0@\236\0\0\0\377\1&\3\15\377\325\274\21B\377\2" \ + "\265\20\77\377/\4\21\377\257\0\0\0\377\1{\13+\377\377\274\21B\377\242" \ + "\274\21B\377\1\216\15""2\377\243\0\0\0\377\2>\6\26\377\273\21A\377\334" \ + "\274\21B\377\1""7\5\23\377\237\0\0\0\377\2\0\0\0\367\0\0\0\14\316\0\0" \ + "\0\0\2\0\0\0\3\0\0\0\352\235\0\0\0\377\1:\5\24\377\326\274\21B\377\2" \ + "\264\20\77\377.\4\20\377\256\0\0\0\377\1\210\14""0\377\377\274\21B\377" \ + "\242\274\21B\377\1\234\16""7\377\242\0\0\0\377\2)\4\16\377\267\21@\377" \ + "\335\274\21B\377\1G\6\31\377\237\0\0\0\377\1\0\0\0\264\320\0\0\0\0\1" \ + "\0\0\0\236\235\0\0\0\377\1M\7\33\377\327\274\21B\377\2\257\20>\377%\3" \ + "\15\377\255\0\0\0\377\1\217\15""2\377\377\274\21B\377\242\274\21B\377" \ + "\1\242\17""9\377\241\0\0\0\377\2\25\2\7\377\253\17<\377\336\274\21B\377" \ + "\1V\10\36\377\237\0\0\0\377\1\0\0\0d\320\0\0\0\0\1\0\0\0B\235\0\0\0\377" \ + "\1V\10\36\377\330\274\21B\377\2\261\20>\377)\4\16\377\254\0\0\0\377\1" \ + "\224\15""4\377\377\274\21B\377\242\274\21B\377\1\250\17;\377\240\0\0" \ + "\0\377\2\5\0\2\377\223\15""4\377\337\274\21B\377\1c\11#\377\236\0\0\0" \ + "\377\2\0\0\0\366\0\0\0\16\320\0\0\0\0\2\0\0\0\2\0\0\0\344\234\0\0\0\377" \ + "\1[\10\40\377\331\274\21B\377\2\255\20=\377\37\3\13\377\253\0\0\0\377" \ + "\1\231\16""6\377\377\274\21B\377\242\274\21B\377\1\255\20=\377\240\0" \ + "\0\0\377\1o\12'\377\340\274\21B\377\1q\12(\377\236\0\0\0\377\1\0\0\0" \ + "\255\322\0\0\0\0\1\0\0\0\215\234\0\0\0\377\1a\11\"\377\332\274\21B\377" \ + "\2\252\17<\377\30\2\10\377\252\0\0\0\377\1\234\16""7\377\377\274\21B" \ + "\377\242\274\21B\377\1\260\20>\377\237\0\0\0\377\1J\7\32\377\341\274" \ + "\21B\377\1~\13,\377\236\0\0\0\377\1\0\0\0T\322\0\0\0\0\1\0\0\0""3\234" \ + "\0\0\0\377\1f\11$\377\333\274\21B\377\2\241\17""9\377\21\2\6\377\251" \ + "\0\0\0\377\1\227\16""5\377\377\274\21B\377\242\274\21B\377\1\253\17<" \ + "\377\236\0\0\0\377\2'\4\16\377\267\21@\377\341\274\21B\377\1\214\15""1" \ + "\377\235\0\0\0\377\2\0\0\0\357\0\0\0\10\323\0\0\0\0\1\0\0\0\330\233\0" \ + "\0\0\377\1l\12&\377\334\274\21B\377\2\225\15""4\377\11\1\3\377\250\0" \ + "\0\0\377\1\222\15""3\377\377\274\21B\377\242\274\21B\377\1\246\17:\377" \ + "\235\0\0\0\377\2\7\1\3\377\240\16""8\377\342\274\21B\377\1\231\16""6" \ + "\377\235\0\0\0\377\1\0\0\0\236\324\0\0\0\0\1\0\0\0\177\233\0\0\0\377" \ + "\1p\12'\377\335\274\21B\377\2\201\14-\377\2\0\1\377\247\0\0\0\377\1\216" \ + "\15""2\377\377\274\21B\377\242\274\21B\377\1\241\17""8\377\235\0\0\0" \ + "\377\1q\12(\377\343\274\21B\377\1\236\16""7\377\235\0\0\0\377\1\0\0\0" \ + "E\324\0\0\0\0\2\0\0\0#\0\0\0\376\232\0\0\0\377\1j\12%\377\336\274\21" \ + "B\377\2y\13*\377\1\0\0\377\246\0\0\0\377\1\205\14/\377\377\274\21B\377" \ + "\242\274\21B\377\1\231\16""6\377\234\0\0\0\377\1""7\5\23\377\344\274" \ + "\21B\377\1\237\16""8\377\234\0\0\0\377\2\0\0\0\347\0\0\0\3\325\0\0\0" \ + "\0\1\0\0\0\312\232\0\0\0\377\1c\11#\377\337\274\21B\377\1T\10\36\377" \ + "\246\0\0\0\377\1v\13)\377\377\274\21B\377\242\274\21B\377\1\211\14""0" \ + "\377\233\0\0\0\377\2\16\1\5\377\252\17<\377\344\274\21B\377\1\240\16" \ + "8\377\234\0\0\0\377\1\0\0\0\220\326\0\0\0\0\1\0\0\0p\232\0\0\0\377\1" \ + "[\10\40\377\337\274\21B\377\2\273\21A\3773\5\22\377\245\0\0\0\377\1f" \ + "\11$\377\377\274\21B\377\242\274\21B\377\1z\13+\377\233\0\0\0\377\1{" \ + "\13+\377\345\274\21B\377\1\241\17""8\377\234\0\0\0\377\1\0\0\0""6\326" \ + "\0\0\0\0\2\0\0\0\30\0\0\0\374\231\0\0\0\377\1S\7\35\377\340\274\21B\377" \ + "\2\254\20<\377\24\2\7\377\244\0\0\0\377\1W\10\37\377\377\274\21B\377" \ + "\242\274\21B\377\1j\12%\377\232\0\0\0\377\1@\6\27\377\346\274\21B\377" \ + "\1\241\17""9\377\233\0\0\0\377\1\0\0\0\331\330\0\0\0\0\1\0\0\0\273\231" \ + "\0\0\0\377\1K\7\32\377\341\274\21B\377\2\222\15""3\377\4\0\2\377\243" \ + "\0\0\0\377\1C\6\30\377\377\274\21B\377\242\274\21B\377\1V\10\36\377\231" \ + "\0\0\0\377\2\15\1\4\377\254\20<\377\346\274\21B\377\1\242\17""9\377\233" \ + "\0\0\0\377\1\0\0\0\201\330\0\0\0\0\1\0\0\0c\231\0\0\0\377\1B\6\27\377" \ + "\342\274\21B\377\1c\11#\377\243\0\0\0\377\1(\4\16\377\377\274\21B\377" \ + "\242\274\21B\377\1;\5\25\377\231\0\0\0\377\1q\12(\377\347\274\21B\377" \ + "\1\244\17""9\377\233\0\0\0\377\1\0\0\0*\330\0\0\0\0\2\0\0\0\15\0\0\0" \ + "\365\230\0\0\0\377\1""1\4\21\377\342\274\21B\377\2\273\21B\3777\5\23" \ + "\377\242\0\0\0\377\1\16\1\5\377\377\274\21B\377\242\274\21B\377\1\40" \ + "\3\13\377\230\0\0\0\377\2#\3\14\377\272\21A\377\347\274\21B\377\1\240" \ + "\16""8\377\232\0\0\0\377\1\0\0\0\311\332\0\0\0\0\1\0\0\0\247\230\0\0" \ + "\0\377\1\33\2\12\377\343\274\21B\377\2\255\20=\377\17\1\5\377\242\0\0" \ + "\0\377\1\261\20>\377\377\274\21B\377\240\274\21B\377\2\273\21B\377\10" \ + "\1\3\377\227\0\0\0\377\2\1\0\1\377\226\16""5\377\350\274\21B\377\1\224" \ + "\15""4\377\232\0\0\0\377\1\0\0\0n\332\0\0\0\0\1\0\0\0L\230\0\0\0\377" \ + "\1\7\1\2\377\344\274\21B\377\1w\13*\377\242\0\0\0\377\1\216\15""2\377" \ + "\377\274\21B\377\240\274\21B\377\1\241\17""8\377\230\0\0\0\377\1I\7\32" \ + "\377\351\274\21B\377\1\211\14""0\377\231\0\0\0\377\2\0\0\0\372\0\0\0" \ + "\25\332\0\0\0\0\2\0\0\0\4\0\0\0\350\230\0\0\0\377\1\256\20=\377\344\274" \ + "\21B\377\1:\5\24\377\241\0\0\0\377\1j\12%\377\377\274\21B\377\240\274" \ + "\21B\377\1}\13,\377\227\0\0\0\377\2\16\1\5\377\256\20=\377\351\274\21" \ + "B\377\1}\13,\377\231\0\0\0\377\1\0\0\0\265\334\0\0\0\0\1\0\0\0\222\230" \ + "\0\0\0\377\1\231\16""6\377\344\274\21B\377\2\251\17;\377\14\1\4\377\240" \ + "\0\0\0\377\1F\6\31\377\377\274\21B\377\240\274\21B\377\1X\10\37\377\227" \ + "\0\0\0\377\1i\12%\377\352\274\21B\377\1r\12(\377\231\0\0\0\377\1\0\0" \ + "\0Z\334\0\0\0\0\1\0\0\0""7\230\0\0\0\377\1\205\14/\377\345\274\21B\377" \ + "\1q\12(\377\240\0\0\0\377\1!\3\14\377\377\274\21B\377\240\274\21B\377" \ + "\1""4\5\22\377\226\0\0\0\377\2\35\3\12\377\272\21A\377\352\274\21B\377" \ + "\1f\11$\377\230\0\0\0\377\2\0\0\0\362\0\0\0\12\335\0\0\0\0\1\0\0\0\330" \ + "\227\0\0\0\377\1k\12&\377\345\274\21B\377\2\273\21A\377+\4\17\377\237" \ + "\0\0\0\377\2\1\0\0\377\255\20=\377\377\274\21B\377\236\274\21B\377\2" \ + "\270\21A\377\11\1\3\377\226\0\0\0\377\1z\13+\377\353\274\21B\377\1[\10" \ + "\40\377\230\0\0\0\377\1\0\0\0\240\336\0\0\0\0\1\0\0\0~\227\0\0\0\377" \ + "\1I\7\32\377\346\274\21B\377\2\231\16""6\377\1\0\1\377\237\0\0\0\377" \ + "\1\177\13-\377\377\274\21B\377\236\274\21B\377\1\221\15""3\377\226\0" \ + "\0\0\377\2\35\3\12\377\272\21A\377\353\274\21B\377\1O\7\34\377\230\0" \ + "\0\0\377\1\0\0\0E\336\0\0\0\0\2\0\0\0#\0\0\0\376\226\0\0\0\377\1(\4\16" \ + "\377\347\274\21B\377\1H\6\31\377\237\0\0\0\377\1P\7\34\377\377\274\21" \ + "B\377\236\274\21B\377\1a\11\"\377\226\0\0\0\377\1\200\14-\377\354\274" \ + "\21B\377\1""7\5\23\377\227\0\0\0\377\2\0\0\0\344\0\0\0\2\337\0\0\0\0" \ + "\1\0\0\0\305\226\0\0\0\377\2\10\1\3\377\273\21A\377\346\274\21B\377\2" \ + "\253\17<\377\12\1\4\377\236\0\0\0\377\1\35\3\12\377\377\274\21B\377\236" \ + "\274\21B\377\1/\4\21\377\225\0\0\0\377\2(\4\16\377\273\21B\377\354\274" \ + "\21B\377\1\36\3\13\377\227\0\0\0\377\1\0\0\0\214\340\0\0\0\0\1\0\0\0" \ + "p\227\0\0\0\377\1\243\17""9\377\347\274\21B\377\1a\11\"\377\237\0\0\0" \ + "\377\1\236\16""7\377\377\274\21B\377\234\274\21B\377\2\255\20=\377\2" \ + "\0\1\377\225\0\0\0\377\1\205\14/\377\354\274\21B\377\2\273\21A\377\6" \ + "\1\2\377\227\0\0\0\377\1\0\0\0""7\340\0\0\0\0\1\0\0\0=\227\0\0\0\377" \ + "\1\202\14.\377\347\274\21B\377\2\265\20@\377\27\2\10\377\236\0\0\0\377" \ + "\1d\11#\377\377\274\21B\377\234\274\21B\377\1w\13*\377\225\0\0\0\377" \ + "\2(\4\16\377\273\21B\377\354\274\21B\377\1\251\17;\377\227\0\0\0\377" \ + "\2\0\0\0\374\0\0\0\7\340\0\0\0\0\1\0\0\0\27\227\0\0\0\377\1a\11\"\377" \ + "\350\274\21B\377\1u\13)\377\236\0\0\0\377\1,\4\20\377\377\274\21B\377" \ + "\234\274\21B\377\1\77\6\26\377\225\0\0\0\377\1\205\14/\377\355\274\21" \ + "B\377\1\216\15""2\377\227\0\0\0\377\1\0\0\0\334\342\0\0\0\0\1\0\0\0\357" \ + "\226\0\0\0\377\1""6\5\23\377\350\274\21B\377\2\273\21A\377\40\3\13\377" \ + "\235\0\0\0\377\2\1\0\0\377\242\17""9\377\377\274\21B\377\232\274\21B" \ + "\377\2\260\20>\377\6\1\2\377\224\0\0\0\377\2\40\3\13\377\273\21B\377" \ + "\355\274\21B\377\1u\13)\377\227\0\0\0\377\1\0\0\0\265\342\0\0\0\0\1\0" \ + "\0\0\311\226\0\0\0\377\2\12\1\4\377\272\21A\377\350\274\21B\377\1y\13" \ + "*\377\236\0\0\0\377\1^\11!\377\377\274\21B\377\232\274\21B\377\1q\12" \ + "(\377\225\0\0\0\377\1s\12(\377\356\274\21B\377\1\\\10\40\377\227\0\0" \ + "\0\377\1\0\0\0\216\342\0\0\0\0\1\0\0\0\242\227\0\0\0\377\1\226\16""5" \ + "\377\350\274\21B\377\2\272\21A\377\35\3\12\377\235\0\0\0\377\2\30\2\10" \ + "\377\273\21B\377\377\274\21B\377\231\274\21B\377\1+\4\17\377\224\0\0" \ + "\0\377\2\20\1\6\377\266\20@\377\356\274\21B\377\1\77\6\26\377\227\0\0" \ + "\0\377\1\0\0\0g\342\0\0\0\0\1\0\0\0{\227\0\0\0\377\1i\11%\377\351\274" \ + "\21B\377\1u\13)\377\236\0\0\0\377\1\216\15""2\377\377\274\21B\377\230" \ + "\274\21B\377\2\240\16""8\377\1\0\0\377\224\0\0\0\377\1b\11\"\377\357" \ + "\274\21B\377\1\33\2\11\377\227\0\0\0\377\1\0\0\0@\342\0\0\0\0\1\0\0\0" \ + "H\227\0\0\0\377\1<\5\25\377\351\274\21B\377\2\270\21A\377\31\2\11\377" \ + "\235\0\0\0\377\1;\5\25\377\377\274\21B\377\230\274\21B\377\1N\7\33\377" \ + "\224\0\0\0\377\2\11\1\3\377\257\20>\377\356\274\21B\377\2\260\20>\377" \ + "\1\0\0\377\226\0\0\0\377\2\0\0\0\375\0\0\0\15\342\0\0\0\0\1\0\0\0\24" \ + "\227\0\0\0\377\2\17\1\5\377\273\21B\377\351\274\21B\377\1r\12(\377\235" \ + "\0\0\0\377\2\1\0\1\377\243\17""9\377\377\274\21B\377\226\274\21B\377" \ + "\2\261\20>\377\11\1\3\377\224\0\0\0\377\1M\7\33\377\357\274\21B\377\1" \ + "\217\15""2\377\227\0\0\0\377\1\0\0\0\327\344\0\0\0\0\1\0\0\0\336\227" \ + "\0\0\0\377\1\235\16""7\377\351\274\21B\377\2\267\21@\377\20\1\6\377\235" \ + "\0\0\0\377\1W\10\37\377\377\274\21B\377\226\274\21B\377\1k\12&\377\225" \ + "\0\0\0\377\1\235\16""7\377\357\274\21B\377\1f\11$\377\227\0\0\0\377\1" \ + "\0\0\0\243\344\0\0\0\0\1\0\0\0\252\227\0\0\0\377\1c\11#\377\352\274\21" \ + "B\377\1[\10\40\377\235\0\0\0\377\2\10\1\3\377\255\20=\377\377\274\21" \ + "B\377\224\274\21B\377\2\265\20@\377\22\2\6\377\224\0\0\0\377\1,\4\20" \ + "\377\360\274\21B\377\1""9\5\24\377\227\0\0\0\377\1\0\0\0p\344\0\0\0\0" \ + "\1\0\0\0w\227\0\0\0\377\1*\4\17\377\352\274\21B\377\2\247\17:\377\3\0" \ + "\1\377\235\0\0\0\377\1[\10\40\377\377\274\21B\377\224\274\21B\377\1l" \ + "\12&\377\225\0\0\0\377\1t\12)\377\357\274\21B\377\2\273\21B\377\16\1" \ + "\5\377\227\0\0\0\377\1\0\0\0<\344\0\0\0\0\1\0\0\0\77\227\0\0\0\377\2" \ + "\1\0\1\377\252\17<\377\352\274\21B\377\1;\5\25\377\235\0\0\0\377\2\15" \ + "\1\4\377\262\20>\377\377\274\21B\377\222\274\21B\377\2\270\21A\377\30" \ + "\2\10\377\224\0\0\0\377\2\10\1\3\377\262\20>\377\357\274\21B\377\1\237" \ + "\16""8\377\227\0\0\0\377\2\0\0\0\371\0\0\0\12\344\0\0\0\0\2\0\0\0\6\0" \ + "\0\0\364\227\0\0\0\377\1s\12(\377\352\274\21B\377\1\211\14""0\377\236" \ + "\0\0\0\377\1V\10\36\377\377\274\21B\377\222\274\21B\377\1h\11$\377\225" \ + "\0\0\0\377\1H\7\31\377\360\274\21B\377\1i\12%\377\227\0\0\0\377\1\0\0" \ + "\0\300\346\0\0\0\0\1\0\0\0\273\227\0\0\0\377\1:\5\24\377\352\274\21B" \ + "\377\2\273\21B\377\35\3\12\377\235\0\0\0\377\2\4\0\2\377\241\17""9\377" \ + "\377\274\21B\377\220\274\21B\377\2\256\20=\377\14\1\4\377\225\0\0\0\377" \ + "\1\220\15""2\377\360\274\21B\377\1""4\5\22\377\227\0\0\0\377\1\0\0\0" \ + "\177\346\0\0\0\0\1\0\0\0{\227\0\0\0\377\2\10\1\3\377\266\20@\377\352" \ + "\274\21B\377\1f\11$\377\236\0\0\0\377\1\77\6\26\377\377\274\21B\377\220" \ + "\274\21B\377\1R\7\35\377\225\0\0\0\377\1\35\3\12\377\360\274\21B\377" \ + "\2\265\20\77\377\6\1\2\377\227\0\0\0\377\1\0\0\0>\346\0\0\0\0\1\0\0\0" \ + ":\230\0\0\0\377\1\204\14.\377\352\274\21B\377\2\252\17<\377\2\0\1\377" \ + "\235\0\0\0\377\2\1\0\0\377\220\15""2\377\377\274\21B\377\216\274\21B" \ + "\377\2\236\16""7\377\4\0\2\377\225\0\0\0\377\1`\11\"\377\360\274\21B" \ + "\377\1\206\14/\377\227\0\0\0\377\2\0\0\0\365\0\0\0\6\346\0\0\0\0\2\0" \ + "\0\0\6\0\0\0\363\227\0\0\0\377\1<\5\25\377\353\274\21B\377\1""4\5\22" \ + "\377\236\0\0\0\377\2\33\2\12\377\266\20@\377\377\274\21B\377\214\274" \ + "\21B\377\2\273\21A\377(\4\16\377\226\0\0\0\377\1\241\17""8\377\360\274" \ + "\21B\377\1H\6\31\377\227\0\0\0\377\1\0\0\0\274\350\0\0\0\0\1\0\0\0\253" \ + "\227\0\0\0\377\2\4\0\2\377\255\20=\377\352\274\21B\377\1v\13)\377\237" \ + "\0\0\0\377\1^\10!\377\377\274\21B\377\214\274\21B\377\1o\12'\377\226" \ + "\0\0\0\377\1\40\3\13\377\360\274\21B\377\2\270\21@\377\14\1\4\377\227" \ + "\0\0\0\377\1\0\0\0n\350\0\0\0\0\1\0\0\0^\230\0\0\0\377\1k\12&\377\352" \ + "\274\21B\377\2\262\20\77\377\7\1\2\377\236\0\0\0\377\2\7\1\2\377\236" \ + "\16""7\377\377\274\21B\377\212\274\21B\377\2\251\17;\377\15\1\5\377\226" \ + "\0\0\0\377\1[\10\40\377\360\274\21B\377\1\213\15""1\377\230\0\0\0\377" \ + "\1\0\0\0!\350\0\0\0\0\2\0\0\0\22\0\0\0\373\227\0\0\0\377\1%\3\15\377" \ + "\353\274\21B\377\1=\6\25\377\237\0\0\0\377\2#\3\14\377\270\21@\377\377" \ + "\274\21B\377\210\274\21B\377\2\273\21B\3771\4\21\377\227\0\0\0\377\1" \ + "\231\16""6\377\360\274\21B\377\1E\6\30\377\227\0\0\0\377\1\0\0\0\324" \ + "\352\0\0\0\0\1\0\0\0\302\230\0\0\0\377\1\231\16""6\377\352\274\21B\377" \ + "\1\177\13-\377\240\0\0\0\377\1X\10\37\377\377\274\21B\377\210\274\21" \ + "B\377\1k\12&\377\227\0\0\0\377\1\32\2\11\377\360\274\21B\377\2\260\20" \ + ">\377\7\1\2\377\227\0\0\0\377\1\0\0\0\207\352\0\0\0\0\1\0\0\0w\230\0" \ + "\0\0\377\1V\10\36\377\352\274\21B\377\2\265\20@\377\11\1\3\377\237\0" \ + "\0\0\377\2\3\0\1\377\220\15""2\377\377\274\21B\377\206\274\21B\377\2" \ + "\236\16""7\377\10\1\3\377\227\0\0\0\377\1V\10\36\377\360\274\21B\377" \ + "\1p\12'\377\230\0\0\0\377\1\0\0\0<\352\0\0\0\0\2\0\0\0\36\0\0\0\376\227" \ + "\0\0\0\377\2\22\2\6\377\270\21A\377\352\274\21B\377\1""9\5\24\377\240" \ + "\0\0\0\377\2\20\1\6\377\250\17;\377\377\274\21B\377\204\274\21B\377\2" \ + "\260\20>\377\33\2\11\377\230\0\0\0\377\1\221\15""3\377\360\274\21B\377" \ + "\1)\4\16\377\227\0\0\0\377\2\0\0\0\337\0\0\0\1\353\0\0\0\0\1\0\0\0\303" \ + "\230\0\0\0\377\1u\13)\377\352\274\21B\377\1o\12'\377\241\0\0\0\377\2" \ + ")\4\16\377\270\21@\377\377\274\21B\377\202\274\21B\377\2\273\21B\377" \ + "9\5\24\377\230\0\0\0\377\2\15\1\4\377\272\21A\377\357\274\21B\377\1\222" \ + "\15""3\377\230\0\0\0\377\1\0\0\0\210\354\0\0\0\0\1\0\0\0i\230\0\0\0\377" \ + "\2\40\3\13\377\273\21B\377\351\274\21B\377\1\244\17:\377\242\0\0\0\377" \ + "\1T\10\36\377\377\274\21B\377\202\274\21B\377\1e\11#\377\231\0\0\0\377" \ + "\1:\5\24\377\360\274\21B\377\1A\6\27\377\230\0\0\0\377\1\0\0\0-\354\0" \ + "\0\0\0\2\0\0\0\24\0\0\0\372\230\0\0\0\377\1\212\14""0\377\352\274\21" \ + "B\377\1\33\2\12\377\242\0\0\0\377\1l\12&\377\377\274\21B\377\2z\13+\377" \ + "\1\0\0\377\231\0\0\0\377\1j\12%\377\357\274\21B\377\2\247\17;\377\3\0" \ + "\1\377\227\0\0\0\377\1\0\0\0\322\356\0\0\0\0\1\0\0\0\267\230\0\0\0\377" \ + "\1""6\5\23\377\352\274\21B\377\1P\7\34\377\242\0\0\0\377\2\2\0\1\377" \ + "\204\14.\377\375\274\21B\377\2\223\15""4\377\6\1\2\377\232\0\0\0\377" \ + "\1\231\16""6\377\357\274\21B\377\1W\10\37\377\230\0\0\0\377\1\0\0\0z" \ + "\356\0\0\0\0\1\0\0\0Q\230\0\0\0\377\2\1\0\0\377\235\16""7\377\351\274" \ + "\21B\377\1\205\14/\377\243\0\0\0\377\2\15\1\4\377\231\16""6\377\373\274" \ + "\21B\377\2\244\17""9\377\24\2\7\377\232\0\0\0\377\2\21\2\6\377\273\21" \ + "B\377\356\274\21B\377\2\251\17;\377\6\1\2\377\227\0\0\0\377\2\0\0\0\372" \ + "\0\0\0\30\356\0\0\0\0\2\0\0\0\4\0\0\0\344\230\0\0\0\377\1M\7\33\377\351" \ + "\274\21B\377\2\262\20\77\377\2\0\1\377\243\0\0\0\377\2\17\1\5\377\235" \ + "\16""7\377\371\274\21B\377\2\245\17:\377\25\2\7\377\233\0\0\0\377\1\77" \ + "\6\26\377\357\274\21B\377\1S\7\35\377\230\0\0\0\377\1\0\0\0\253\360\0" \ + "\0\0\0\1\0\0\0\200\230\0\0\0\377\2\7\1\3\377\255\20=\377\351\274\21B" \ + "\377\1#\3\14\377\244\0\0\0\377\2\27\2\10\377\247\17:\377\367\274\21B" \ + "\377\2\257\20=\377!\3\14\377\234\0\0\0\377\1n\12'\377\356\274\21B\377" \ + "\2\252\17<\377\10\1\3\377\230\0\0\0\377\1\0\0\0D\360\0\0\0\0\2\0\0\0" \ + "\34\0\0\0\373\230\0\0\0\377\1S\7\35\377\351\274\21B\377\1L\7\33\377\245" \ + "\0\0\0\377\2\25\2\10\377\241\17""8\377\365\274\21B\377\2\251\17;\377" \ + "\35\3\12\377\235\0\0\0\377\1\231\16""6\377\356\274\21B\377\1H\6\31\377" \ + "\230\0\0\0\377\2\0\0\0\331\0\0\0\1\361\0\0\0\0\1\0\0\0\263\230\0\0\0" \ + "\377\2\6\1\2\377\247\17:\377\350\274\21B\377\1t\13)\377\246\0\0\0\377" \ + "\2\21\2\6\377\233\16""6\377\363\274\21B\377\2\247\17:\377\34\3\12\377" \ + "\235\0\0\0\377\2\7\1\2\377\271\21A\377\355\274\21B\377\2\224\15""4\377" \ + "\1\0\0\377\230\0\0\0\377\1\0\0\0v\362\0\0\0\0\1\0\0\0=\231\0\0\0\377" \ + "\1K\7\32\377\350\274\21B\377\1\234\16""7\377\247\0\0\0\377\2\22\2\6\377" \ + "\231\16""6\377\361\274\21B\377\2\244\17""9\377\34\3\12\377\236\0\0\0" \ + "\377\1&\3\15\377\355\274\21B\377\2\273\21B\377.\4\20\377\230\0\0\0\377" \ + "\2\0\0\0\357\0\0\0\16\363\0\0\0\0\1\0\0\0\305\230\0\0\0\377\2\4\0\1\377" \ + "\242\17""9\377\347\274\21B\377\2\273\21A\377\12\1\4\377\247\0\0\0\377" \ + "\2\10\1\3\377\202\14.\377\357\274\21B\377\2\216\15""2\377\15\1\5\377" \ + "\237\0\0\0\377\1L\7\33\377\355\274\21B\377\1p\12'\377\231\0\0\0\377\1" \ + "\0\0\0\212\364\0\0\0\0\1\0\0\0Q\231\0\0\0\377\1E\6\30\377\350\274\21" \ + "B\377\1""1\4\21\377\250\0\0\0\377\2\4\0\1\377t\12)\377\355\274\21B\377" \ + "\2\202\14.\377\7\1\3\377\240\0\0\0\377\1p\12'\377\354\274\21B\377\2\247" \ + "\17:\377\12\1\4\377\230\0\0\0\377\2\0\0\0\371\0\0\0\33\364\0\0\0\0\2" \ + "\0\0\0\2\0\0\0\326\230\0\0\0\377\2\3\0\1\377\237\16""8\377\347\274\21" \ + "B\377\1R\7\35\377\252\0\0\0\377\2K\7\32\377\270\21@\377\351\274\21B\377" \ + "\3\273\21A\377X\10\37\377\1\0\0\377\241\0\0\0\377\1\223\15""4\377\354" \ + "\274\21B\377\1<\5\25\377\231\0\0\0\377\1\0\0\0\236\366\0\0\0\0\1\0\0" \ + "\0f\231\0\0\0\377\1@\6\27\377\347\274\21B\377\1l\12&\377\253\0\0\0\377" \ + "\2,\4\20\377\253\17<\377\347\274\21B\377\2\261\20>\3777\5\23\377\242" \ + "\0\0\0\377\2\4\0\1\377\266\20@\377\353\274\21B\377\1r\12(\377\231\0\0" \ + "\0\377\2\0\0\0\375\0\0\0,\366\0\0\0\0\2\0\0\0\3\0\0\0\330\231\0\0\0\377" \ + "\1{\13+\377\346\274\21B\377\1\210\14""0\377\254\0\0\0\377\2\33\2\11\377" \ + "\226\16""5\377\345\274\21B\377\2\237\16""8\377#\3\14\377\243\0\0\0\377" \ + "\1\34\3\12\377\353\274\21B\377\2\241\17""8\377\11\1\3\377\231\0\0\0\377" \ + "\1\0\0\0\242\370\0\0\0\0\1\0\0\0[\231\0\0\0\377\2\14\1\4\377\244\17:" \ + "\377\345\274\21B\377\1\242\17""9\377\255\0\0\0\377\3\2\0\1\377X\10\37" \ + "\377\270\21A\377\341\274\21B\377\3\273\21A\377d\11#\377\5\0\2\377\244" \ + "\0\0\0\377\1""4\5\22\377\352\274\21B\377\2\265\20@\377\40\3\13\377\231" \ + "\0\0\0\377\2\0\0\0\372\0\0\0#\370\0\0\0\0\2\0\0\0\2\0\0\0\320\231\0\0" \ + "\0\377\2,\4\20\377\271\21A\377\344\274\21B\377\2\271\21A\377\4\0\1\377" \ + "\256\0\0\0\377\2""1\4\21\377\244\17:\377\337\274\21B\377\2\253\17<\377" \ + ";\5\25\377\246\0\0\0\377\1J\7\32\377\352\274\21B\377\1T\10\36\377\232" \ + "\0\0\0\377\1\0\0\0\232\372\0\0\0\0\1\0\0\0V\232\0\0\0\377\1]\10!\377" \ + "\345\274\21B\377\1\33\2\11\377\257\0\0\0\377\3\6\1\2\377^\11!\377\270" \ + "\21A\377\333\274\21B\377\3\273\21A\377k\12&\377\12\1\4\377\247\0\0\0" \ + "\377\1a\11\"\377\351\274\21B\377\1z\13+\377\232\0\0\0\377\2\0\0\0\371" \ + "\0\0\0!\373\0\0\0\0\1\0\0\0\301\231\0\0\0\377\2\3\0\1\377\215\15""1\377" \ + "\344\274\21B\377\1""3\5\22\377\261\0\0\0\377\2+\4\17\377\234\16""7\377" \ + "\331\274\21B\377\2\243\17""9\3774\5\22\377\251\0\0\0\377\1w\13*\377\350" \ + "\274\21B\377\2\237\16""8\377\12\1\3\377\232\0\0\0\377\1\0\0\0\210\374" \ + "\0\0\0\0\2\0\0\0""1\0\0\0\375\231\0\0\0\377\2\15\1\5\377\244\17""9\377" \ + "\343\274\21B\377\1B\6\27\377\262\0\0\0\377\3\1\0\1\377E\6\30\377\256" \ + "\20=\377\325\274\21B\377\3\262\20\77\377R\7\35\377\4\0\1\377\252\0\0" \ + "\0\377\1\216\15""2\377\347\274\21B\377\2\265\20@\377\"\3\14\377\232\0" \ + "\0\0\377\2\0\0\0\346\0\0\0\15\375\0\0\0\0\1\0\0\0\237\232\0\0\0\377\2" \ + "#\3\14\377\265\20@\377\342\274\21B\377\1N\7\33\377\264\0\0\0\377\3\24" \ + "\2\7\377z\13+\377\273\21A\377\322\274\21B\377\2\202\14.\377\33\2\11\377" \ + "\254\0\0\0\377\1\243\17""9\377\347\274\21B\377\1R\7\35\377\233\0\0\0" \ + "\377\1\0\0\0b\376\0\0\0\0\2\0\0\0\27\0\0\0\361\232\0\0\0\377\1N\7\33" \ + "\377\342\274\21B\377\1Z\10\40\377\266\0\0\0\377\3\35\3\12\377}\13,\377" \ + "\273\21B\377\316\274\21B\377\2}\13,\377\40\3\13\377\256\0\0\0\377\1\265" \ + "\20\77\377\346\274\21B\377\1v\13)\377\233\0\0\0\377\2\0\0\0\312\0\0\0" \ + "\2\377\0\0\0\0\1\0\0\0z\233\0\0\0\377\1j\12%\377\341\274\21B\377\1f\11" \ + "$\377\270\0\0\0\377\2,\4\20\377\210\14""0\377\313\274\21B\377\2\221\15" \ + "3\3775\5\23\377\257\0\0\0\377\2\1\0\0\377\273\21B\377\345\274\21B\377" \ + "\2\216\15""2\377\4\0\1\377\232\0\0\0\377\2\0\0\0\376\0\0\0>\377\0\0\0" \ + "\0\3\0\0\0\0\0\0\0\4\0\0\0\317\232\0\0\0\377\2\1\0\1\377\202\14.\377" \ + "\340\274\21B\377\1r\12(\377\272\0\0\0\377\3\40\3\13\377w\13*\377\271" \ + "\21A\377\305\274\21B\377\3\272\21A\377w\13*\377#\3\14\377\261\0\0\0\377" \ + "\1\7\1\3\377\345\274\21B\377\2\244\17""9\377\16\1\5\377\233\0\0\0\377" \ + "\1\0\0\0\230\377\0\0\0\0\203\0\0\0\0\2\0\0\0""6\0\0\0\375\232\0\0\0\377" \ + "\2\12\1\4\377\234\16""7\377\337\274\21B\377\1}\13,\377\274\0\0\0\377" \ + "\3\32\2\11\377e\11#\377\255\20=\377\301\274\21B\377\3\261\20>\377l\12" \ + "&\377\40\3\13\377\263\0\0\0\377\1\17\1\5\377\344\274\21B\377\2\265\20" \ + "@\377)\4\16\377\233\0\0\0\377\2\0\0\0\345\0\0\0\17\377\0\0\0\0\204\0" \ + "\0\0\0\1\0\0\0\227\233\0\0\0\377\2\27\2\10\377\252\17<\377\336\274\21" \ + "B\377\1\200\14-\377\276\0\0\0\377\4\5\0\2\377B\6\27\377\210\14""0\377" \ + "\272\21A\377\273\274\21B\377\4\273\21B\377\220\15""2\377I\7\32\377\10" \ + "\1\3\377\265\0\0\0\377\1\27\2\10\377\343\274\21B\377\2\271\21A\3777\5" \ + "\23\377\234\0\0\0\377\1\0\0\0Z\377\0\0\0\0\205\0\0\0\0\2\0\0\0\22\0\0" \ + "\0\346\233\0\0\0\377\2\33\2\12\377\253\17<\377\335\274\21B\377\1z\13" \ + "+\377\301\0\0\0\377\3\23\2\7\377T\10\36\377\230\16""5\377\267\274\21" \ + "B\377\3\236\16""7\377[\10\40\377\30\2\10\377\270\0\0\0\377\1\36\3\13" \ + "\377\343\274\21B\377\1I\7\32\377\234\0\0\0\377\2\0\0\0\273\0\0\0\1\377" \ + "\0\0\0\0\206\0\0\0\0\2\0\0\0D\0\0\0\376\233\0\0\0\377\2'\4\16\377\262" \ + "\20\77\377\334\274\21B\377\1u\13)\377\304\0\0\0\377\4\17\1\5\377E\6\30" \ + "\377\204\14.\377\270\21@\377\257\274\21B\377\4\271\21A\377\212\14""0" \ + "\377R\7\35\377\27\2\10\377\273\0\0\0\377\1%\3\15\377\342\274\21B\377" \ + "\1e\11#\377\234\0\0\0\377\2\0\0\0\355\0\0\0\32\377\0\0\0\0\210\0\0\0" \ + "\0\1\0\0\0\227\234\0\0\0\377\2""0\4\21\377\266\20@\377\333\274\21B\377" \ + "\1p\12'\377\307\0\0\0\377\4\17\1\5\377\77\6\26\377o\12'\377\240\16""8" \ + "\377\251\274\21B\377\4\244\17:\377t\12)\377C\6\30\377\22\2\6\377\276" \ + "\0\0\0\377\1#\3\14\377\341\274\21B\377\2w\13*\377\1\0\0\377\234\0\0\0" \ + "\377\1\0\0\0Z\377\0\0\0\0\211\0\0\0\0\2\0\0\0\13\0\0\0\332\234\0\0\0" \ + "\377\2\77\6\26\377\271\21A\377\332\274\21B\377\1l\12&\377\313\0\0\0\377" \ + "\5\22\2\6\377<\5\25\377f\11$\377\217\15""2\377\263\20\77\377\237\274" \ + "\21B\377\5\266\20@\377\222\15""3\377i\12%\377@\6\27\377\26\2\10\377\302" \ + "\0\0\0\377\1\35\3\12\377\340\274\21B\377\2x\13*\377\1\0\1\377\234\0\0" \ + "\0\377\1\0\0\0\252\377\0\0\0\0\213\0\0\0\0\2\0\0\0>\0\0\0\374\234\0\0" \ + "\0\377\2A\6\27\377\272\21A\377\331\274\21B\377\1f\11$\377\317\0\0\0\377" \ + "\10\1\0\0\377\30\2\10\3777\5\23\377V\10\36\377r\12(\377\207\14/\377\235" \ + "\16""7\377\263\20\77\377\221\274\21B\377\10\265\20@\377\237\16""8\377" \ + "\212\14""0\377t\13)\377Y\10\37\377:\5\24\377\33\2\11\377\2\0\1\377\306" \ + "\0\0\0\377\1\30\2\10\377\337\274\21B\377\2\204\14.\377\4\0\2\377\234" \ + "\0\0\0\377\2\0\0\0\347\0\0\0\27\377\0\0\0\0\214\0\0\0\0\1\0\0\0v\235" \ + "\0\0\0\377\2<\5\25\377\270\21A\377\330\274\21B\377\1X\10\37\377\327\0" \ + "\0\0\377\7\12\1\3\377\26\2\10\377\"\3\14\377.\4\20\377:\5\24\377\77\6" \ + "\26\377E\6\30\377\203K\7\32\377\7G\6\31\377\77\6\26\377<\5\25\377/\4" \ + "\21\377#\3\14\377\27\2\10\377\13\1\4\377\316\0\0\0\377\1\14\1\4\377\336" \ + "\274\21B\377\2\203\14.\377\4\0\1\377\234\0\0\0\377\2\0\0\0\373\0\0\0" \ + "=\377\0\0\0\0\215\0\0\0\0\2\0\0\0\1\0\0\0\261\235\0\0\0\377\2B\6\27\377" \ + "\270\21A\377\327\274\21B\377\1E\6\30\377\377\0\0\0\377\267\0\0\0\377" \ + "\2\1\0\0\377\270\21A\377\334\274\21B\377\2\210\14""0\377\7\1\3\377\235" \ + "\0\0\0\377\1\0\0\0|\377\0\0\0\0\217\0\0\0\0\2\0\0\0\27\0\0\0\347\235" \ + "\0\0\0\377\2""5\5\23\377\264\20\77\377\326\274\21B\377\1""1\4\21\377" \ + "\377\0\0\0\377\270\0\0\0\377\1\251\17;\377\333\274\21B\377\2\200\14-" \ + "\377\5\0\2\377\235\0\0\0\377\2\0\0\0\300\0\0\0\3\377\0\0\0\0\220\0\0" \ + "\0\0\2\0\0\0""8\0\0\0\370\235\0\0\0\377\2%\3\15\377\254\20<\377\325\274" \ + "\21B\377\1\25\2\7\377\377\0\0\0\377\270\0\0\0\377\1\223\15""4\377\332" \ + "\274\21B\377\2r\12(\377\1\0\1\377\235\0\0\0\377\2\0\0\0\336\0\0\0\23" \ + "\377\0\0\0\0\222\0\0\0\0\1\0\0\0h\236\0\0\0\377\2\36\3\13\377\244\17" \ + "9\377\323\274\21B\377\2\263\20\77\377\1\0\0\377\377\0\0\0\377\270\0\0" \ + "\0\377\1z\13+\377\331\274\21B\377\2l\12&\377\1\0\1\377\235\0\0\0\377" \ + "\2\0\0\0\366\0\0\0""0\377\0\0\0\0\224\0\0\0\0\1\0\0\0\234\236\0\0\0\377" \ + "\2\20\1\6\377\221\15""3\377\322\274\21B\377\1\223\15""4\377\377\0\0\0" \ + "\377\271\0\0\0\377\1a\11\"\377\327\274\21B\377\2\273\21B\377W\10\37\377" \ + "\237\0\0\0\377\1\0\0\0]\377\0\0\0\0\225\0\0\0\0\2\0\0\0\12\0\0\0\315" \ + "\236\0\0\0\377\2\3\0\1\377n\12'\377\321\274\21B\377\1h\11$\377\377\0" \ + "\0\0\377\271\0\0\0\377\1=\6\25\377\326\274\21B\377\2\265\20@\377;\5\25" \ + "\377\237\0\0\0\377\1\0\0\0\232\377\0\0\0\0\227\0\0\0\0\2\0\0\0\24\0\0" \ + "\0\332\236\0\0\0\377\3\1\0\0\377X\10\37\377\272\21A\377\317\274\21B\377" \ + "\1\77\6\26\377\377\0\0\0\377\271\0\0\0\377\1\27\2\10\377\325\274\21B" \ + "\377\2\257\20>\3771\4\21\377\237\0\0\0\377\2\0\0\0\257\0\0\0\3\377\0" \ + "\0\0\0\230\0\0\0\0\2\0\0\0#\0\0\0\351\237\0\0\0\377\2""0\4\21\377\254" \ + "\20<\377\315\274\21B\377\2\272\21A\377\17\1\5\377\377\0\0\0\377\272\0" \ + "\0\0\377\1\252\17<\377\323\274\21B\377\2\236\16""7\377\33\2\12\377\237" \ + "\0\0\0\377\2\0\0\0\307\0\0\0\11\377\0\0\0\0\232\0\0\0\0\2\0\0\0@\0\0" \ + "\0\370\237\0\0\0\377\2\24\2\7\377\221\15""3\377\314\274\21B\377\1\221" \ + "\15""3\377\377\0\0\0\377\273\0\0\0\377\1w\13*\377\322\274\21B\377\2\177" \ + "\13-\377\10\1\3\377\237\0\0\0\377\2\0\0\0\342\0\0\0\33\377\0\0\0\0\234" \ + "\0\0\0\0\2\0\0\0M\0\0\0\373\237\0\0\0\377\3\3\0\1\377a\11\"\377\272\21" \ + "A\377\312\274\21B\377\1V\10\36\377\377\0\0\0\377\273\0\0\0\377\1E\6\30" \ + "\377\320\274\21B\377\3\273\21A\377c\11#\377\2\0\1\377\237\0\0\0\377\2" \ + "\0\0\0\350\0\0\0#\377\0\0\0\0\236\0\0\0\0\1\0\0\0e\241\0\0\0\377\2'\4" \ + "\16\377\241\17""8\377\310\274\21B\377\2\267\21@\377\16\1\5\377\377\0" \ + "\0\0\377\273\0\0\0\377\2\20\1\6\377\271\21A\377\316\274\21B\377\2\252" \ + "\17<\3772\5\22\377\240\0\0\0\377\2\0\0\0\362\0\0\0""4\377\0\0\0\0\240" \ + "\0\0\0\0\1\0\0\0}\241\0\0\0\377\3\14\1\4\377t\12)\377\273\21B\377\306" \ + "\274\21B\377\1}\13,\377\377\0\0\0\377\275\0\0\0\377\1\202\14.\377\315" \ + "\274\21B\377\2{\13+\377\13\1\4\377\240\0\0\0\377\2\0\0\0\370\0\0\0B\377" \ + "\0\0\0\0\241\0\0\0\0\2\0\0\0\1\0\0\0\222\242\0\0\0\377\2+\4\17\377\237" \ + "\16""8\377\304\274\21B\377\2\273\21B\377#\3\14\377\377\0\0\0\377\275" \ + "\0\0\0\377\1\77\6\26\377\313\274\21B\377\3\264\20\77\377N\7\33\377\1" \ + "\0\0\377\240\0\0\0\377\2\0\0\0\374\0\0\0Y\377\0\0\0\0\244\0\0\0\0\1\0" \ + "\0\0\204\242\0\0\0\377\3\11\1\3\377h\11$\377\270\21A\377\302\274\21B" \ + "\377\1\211\14""0\377\377\0\0\0\377\276\0\0\0\377\2\2\0\1\377\241\17""8" \ + "\377\311\274\21B\377\2\213\15""1\377\26\2\10\377\241\0\0\0\377\2\0\0" \ + "\0\372\0\0\0R\377\0\0\0\0\246\0\0\0\0\1\0\0\0\204\243\0\0\0\377\2\32" \ + "\2\11\377\204\14.\377\300\274\21B\377\2\270\21A\377\40\3\13\377\377\0" \ + "\0\0\377\277\0\0\0\377\1M\7\33\377\307\274\21B\377\3\265\20\77\377W\10" \ + "\37\377\2\0\1\377\241\0\0\0\377\2\0\0\0\372\0\0\0R\377\0\0\0\0\247\0" \ + "\0\0\0\2\0\0\0\1\0\0\0\210\244\0\0\0\377\2>\6\26\377\241\17""8\377\276" \ + "\274\21B\377\1j\12%\377\377\0\0\0\377\300\0\0\0\377\2\5\0\2\377\241\17" \ + "8\377\305\274\21B\377\2\204\14.\377\30\2\11\377\242\0\0\0\377\2\0\0\0" \ + "\370\0\0\0U\377\0\0\0\0\252\0\0\0\0\2\0\0\0i\0\0\0\375\243\0\0\0\377" \ + "\3\1\0\1\377\77\6\26\377\242\17""9\377\273\274\21B\377\2\231\16""6\377" \ + "\6\1\2\377\377\0\0\0\377\301\0\0\0\377\1""6\5\23\377\303\274\21B\377" \ + "\2\244\17:\377:\5\24\377\243\0\0\0\377\2\0\0\0\360\0\0\0>\377\0\0\0\0" \ + "\254\0\0\0\0\2\0\0\0Q\0\0\0\367\244\0\0\0\377\3\7\1\3\377U\10\36\377" \ + "\253\17<\377\270\274\21B\377\2\265\20\77\377\40\3\13\377\377\0\0\0\377" \ + "\303\0\0\0\377\1y\13*\377\300\274\21B\377\3\260\20>\377W\10\37\377\6" \ + "\1\2\377\243\0\0\0\377\2\0\0\0\344\0\0\0+\377\0\0\0\0\256\0\0\0\0\2\0" \ + "\0\0B\0\0\0\362\245\0\0\0\377\3\7\1\3\377S\10\35\377\252\17<\377\265" \ + "\274\21B\377\2\270\21@\3776\5\23\377\377\0\0\0\377\304\0\0\0\377\2\11" \ + "\1\3\377\240\16""8\377\275\274\21B\377\3\267\21@\377l\12&\377\17\1\5" \ + "\377\244\0\0\0\377\2\0\0\0\332\0\0\0!\377\0\0\0\0\260\0\0\0\0\2\0\0\0" \ + "5\0\0\0\353\246\0\0\0\377\3\4\0\2\377E\6\30\377\227\16""5\377\262\274" \ + "\21B\377\2\267\21@\377=\6\25\377\377\0\0\0\377\306\0\0\0\377\2\35\3\12" \ + "\377\255\20=\377\272\274\21B\377\3\265\20\77\377j\12%\377\24\2\7\377" \ + "\245\0\0\0\377\2\0\0\0\317\0\0\0\27\377\0\0\0\0\262\0\0\0\0\2\0\0\0/" \ + "\0\0\0\345\250\0\0\0\377\3-\4\20\377w\13*\377\265\20\77\377\256\274\21" \ + "B\377\2\255\20=\377+\4\17\377\377\0\0\0\377\310\0\0\0\377\2$\3\15\377" \ + "\257\20>\377\267\274\21B\377\3\257\20>\377c\11#\377\20\1\6\377\246\0" \ + "\0\0\377\2\0\0\0\306\0\0\0\23\377\0\0\0\0\264\0\0\0\0\2\0\0\0\23\0\0" \ + "\0\275\251\0\0\0\377\4\12\1\4\377J\7\32\377\214\15""1\377\272\21A\377" \ + "\251\274\21B\377\3\264\20\77\377d\11#\377\16\1\5\377\377\0\0\0\377\312" \ + "\0\0\0\377\2\21\2\6\377\203\14.\377\264\274\21B\377\3\234\16""7\377E" \ + "\6\30\377\4\0\2\377\247\0\0\0\377\2\0\0\0\210\0\0\0\4\377\0\0\0\0\266" \ + "\0\0\0\0\2\0\0\0\4\0\0\0\221\253\0\0\0\377\4\17\1\5\377J\7\32\377\204" \ + "\14.\377\263\20\77\377\244\274\21B\377\3\257\20=\377a\11\"\377\17\1\5" \ + "\377\377\0\0\0\377\315\0\0\0\377\3\1\0\1\377I\7\32\377\255\20=\377\257" \ + "\274\21B\377\4\266\20@\377}\13,\3776\5\23\377\1\0\1\377\247\0\0\0\377" \ + "\2\0\0\0\371\0\0\0f\377\0\0\0\0\272\0\0\0\0\2\0\0\0f\0\0\0\371\254\0" \ + "\0\0\377\5\1\0\1\377&\3\15\377X\10\37\377\212\14""0\377\267\21@\377\235" \ + "\274\21B\377\4\253\17<\377k\12&\377,\4\20\377\1\0\1\377\333\0\0\0\377" \ + "\15\3\0\1\377\22\2\6\377#\3\14\3775\5\23\377E\6\30\377T\10\36\377d\11" \ + "#\377o\12'\377z\13+\377\205\14/\377\221\15""3\377\234\16""7\377\247\17" \ + ";\377\217\257\20>\377\1\247\17;\377\202\243\17""9\377\12\236\16""7\377" \ + "\221\15""3\377\203\14.\377u\13)\377h\11$\377[\10\40\377M\7\33\377<\5" \ + "\25\377%\3\15\377\16\1\5\377\314\0\0\0\377\3\15\1\4\377c\11#\377\264" \ + "\20\77\377\252\274\21B\377\4\273\21A\377\217\15""2\377M\7\33\377\15\1" \ + "\4\377\251\0\0\0\377\2\0\0\0\347\0\0\0;\377\0\0\0\0\274\0\0\0\0\2\0\0" \ + "\0;\0\0\0\350\257\0\0\0\377\5\14\1\4\377;\5\25\377a\11\"\377\203\14." \ + "\377\245\17:\377\225\274\21B\377\5\265\20\77\377\216\15""2\377d\11#\377" \ + "8\5\24\377\6\1\2\377\327\0\0\0\377\7\15\1\4\377(\4\16\377C\6\30\377^" \ + "\11!\377z\13+\377\225\15""4\377\255\20=\377\251\274\21B\377\10\263\20" \ + "\77\377\234\16""7\377\205\14/\377n\12'\377S\7\35\3775\5\23\377\30\2\11" \ + "\377\1\0\1\377\306\0\0\0\377\3\20\1\6\377[\10\40\377\244\17""9\377\245" \ + "\274\21B\377\4\271\21A\377\217\15""2\377S\10\35\377\25\2\7\377\253\0" \ + "\0\0\377\2\0\0\0\312\0\0\0\33\377\0\0\0\0\276\0\0\0\0\2\0\0\0#\0\0\0" \ + "\317\263\0\0\0\377\10\14\1\4\377.\4\20\377P\7\34\377g\11$\377v\13)\377" \ + "\204\14.\377\223\15""4\377\241\17""8\377\206\257\20>\377\10\252\17<\377" \ + "\226\16""5\377\203\14.\377o\12'\377]\10!\377I\7\32\377%\3\15\377\3\0" \ + "\1\377\325\0\0\0\377\6\14\1\4\377,\4\20\377L\7\33\377n\12'\377\216\15" \ + "2\377\256\20=\377\267\274\21B\377\6\266\20@\377\232\16""6\377}\13,\377" \ + "^\11!\377;\5\25\377\30\2\10\377\303\0\0\0\377\4\1\0\1\377.\4\20\377o" \ + "\12'\377\254\20<\377\237\274\21B\377\4\242\17""9\377u\13)\377@\6\27\377" \ + "\15\1\4\377\255\0\0\0\377\2\0\0\0\253\0\0\0\15\377\0\0\0\0\300\0\0\0" \ + "\0\3\0\0\0\4\0\0\0\200\0\0\0\375\377\0\0\0\377\230\0\0\0\377\5\12\1\3" \ + "\3772\5\22\377]\10!\377\205\14/\377\247\17:\377\303\274\21B\377\5\257" \ + "\20>\377\214\15""1\377i\11%\377D\6\30\377\30\2\10\377\301\0\0\0\377\6" \ + "\1\0\1\377$\3\15\377V\10\36\377\200\14-\377\243\17""9\377\273\21B\377" \ + "\225\274\21B\377\5\261\20>\377\214\15""1\377f\11$\377\77\6\26\377\22" \ + "\2\6\377\257\0\0\0\377\2\0\0\0\357\0\0\0U\377\0\0\0\0\304\0\0\0\0\2\0" \ + "\0\0A\0\0\0\344\377\0\0\0\377\223\0\0\0\377\5\32\2\11\377E\6\30\377o" \ + "\12'\377\232\16""6\377\272\21A\377\314\274\21B\377\5\247\17;\377z\13" \ + "+\377M\7\33\377\40\3\13\377\1\0\0\377\301\0\0\0\377\11\13\1\4\377-\4" \ + "\20\377P\7\34\377n\12'\377~\13,\377\216\15""2\377\234\16""7\377\253\17" \ + "<\377\271\21A\377\204\274\21B\377\12\270\21@\377\257\20>\377\244\17""9" \ + "\377\220\15""2\377}\13,\377h\11$\377M\7\33\3773\5\22\377\30\2\11\377" \ + "\1\0\0\377\262\0\0\0\377\2\0\0\0\305\0\0\0\40\377\0\0\0\0\306\0\0\0\0" \ + "\2\0\0\0\24\0\0\0\262\377\0\0\0\377\216\0\0\0\377\4\22\2\6\377C\6\30" \ + "\377t\12)\377\245\17:\377\325\274\21B\377\4\255\20=\377y\13*\377@\6\27" \ + "\377\14\1\4\377\377\0\0\0\377\206\0\0\0\377\3\0\0\0\375\0\0\0\200\0\0" \ + "\0\4\377\0\0\0\0\310\0\0\0\0\3\0\0\0\2\0\0\0w\0\0\0\370\377\0\0\0\377" \ + "\210\0\0\0\377\4\4\0\2\3775\5\23\377k\12&\377\234\16""7\377\334\274\21" \ + "B\377\4\271\21A\377\215\15""1\377V\10\36\377\34\3\12\377\377\0\0\0\377" \ + "\202\0\0\0\377\2\0\0\0\350\0\0\0L\377\0\0\0\0\314\0\0\0\0\2\0\0\0\"\0" \ + "\0\0\272\377\0\0\0\377\204\0\0\0\377\4\21\2\6\377K\7\32\377\204\14.\377" \ + "\266\20@\377\343\274\21B\377\3\244\17:\377d\11#\377\36\3\13\377\374\0" \ + "\0\0\377\3\0\0\0\375\0\0\0\221\0\0\0\16\377\0\0\0\0\317\0\0\0\0\2\0\0" \ + "\0U\0\0\0\354\376\0\0\0\377\4\13\1\4\377H\6\31\377\205\14/\377\267\21" \ + "@\377\350\274\21B\377\4\273\21B\377\223\15""4\377S\7\35\377\17\1\5\377" \ + "\370\0\0\0\377\2\0\0\0\326\0\0\0;\377\0\0\0\0\322\0\0\0\0\2\0\0\0\27" \ + "\0\0\0\242\372\0\0\0\377\4\11\1\3\377E\6\30\377\212\14""0\377\272\21" \ + "A\377\356\274\21B\377\3\270\21A\377}\13,\3772\5\22\377\364\0\0\0\377" \ + "\3\0\0\0\371\0\0\0\200\0\0\0\10\377\0\0\0\0\325\0\0\0\0\2\0\0\0T\0\0" \ + "\0\336\366\0\0\0\377\3)\4\16\377p\12'\377\257\20=\377\364\274\21B\377" \ + "\3\217\15""2\377\77\6\26\377\2\0\1\377\360\0\0\0\377\2\0\0\0\303\0\0" \ + "\0""4\377\0\0\0\0\330\0\0\0\0\3\0\0\0\5\0\0\0f\0\0\0\352\361\0\0\0\377" \ + "\3\7\1\2\377K\7\32\377\231\16""6\377\371\274\21B\377\3\246\17:\377R\7" \ + "\35\377\6\1\2\377\354\0\0\0\377\2\0\0\0\323\0\0\0D\377\0\0\0\0\334\0" \ + "\0\0\0\3\0\0\0\21\0\0\0\210\0\0\0\370\355\0\0\0\377\3\24\2\7\377d\11" \ + "#\377\254\20<\377\375\274\21B\377\3\247\17:\377R\7\35\377\6\1\2\377\350" \ + "\0\0\0\377\3\0\0\0\351\0\0\0f\0\0\0\4\377\0\0\0\0\337\0\0\0\0\3\0\0\0" \ + ")\0\0\0\243\0\0\0\373\351\0\0\0\377\3\14\1\4\377b\11\"\377\264\20\77" \ + "\377\377\274\21B\377\202\274\21B\377\2\234\16""7\377)\4\16\377\345\0" \ + "\0\0\377\3\0\0\0\361\0\0\0\206\0\0\0\24\377\0\0\0\0\343\0\0\0\0\3\0\0" \ + "\0\35\0\0\0\221\0\0\0\366\345\0\0\0\377\3\12\1\4\377d\11#\377\263\20" \ + "\77\377\377\274\21B\377\205\274\21B\377\3\273\21B\377w\13*\377\15\1\5" \ + "\377\341\0\0\0\377\3\0\0\0\345\0\0\0o\0\0\0\14\377\0\0\0\0\347\0\0\0" \ + "\0\3\0\0\0\36\0\0\0\212\0\0\0\354\341\0\0\0\377\3\1\0\0\377H\7\31\377" \ + "\247\17;\377\377\274\21B\377\211\274\21B\377\2\244\17:\377,\4\20\377" \ + "\336\0\0\0\377\3\0\0\0\332\0\0\0q\0\0\0\15\377\0\0\0\0\353\0\0\0\0\3" \ + "\0\0\0\10\0\0\0_\0\0\0\307\336\0\0\0\377\2$\3\15\377\230\16""5\377\377" \ + "\274\21B\377\214\274\21B\377\2\272\21A\377X\10\37\377\332\0\0\0\377\4" \ + "\0\0\0\373\0\0\0\260\0\0\0F\0\0\0\1\377\0\0\0\0\360\0\0\0\0\3\0\0\0\37" \ + "\0\0\0l\0\0\0\273\331\0\0\0\377\3\4\0\2\377d\11#\377\270\21A\377\377" \ + "\274\21B\377\217\274\21B\377\2y\13*\377\7\1\2\377\325\0\0\0\377\4\0\0" \ + "\0\367\0\0\0\251\0\0\0[\0\0\0\21\377\0\0\0\0\366\0\0\0\0\2\0\0\0D\0\0" \ + "\0\350\326\0\0\0\377\2\30\2\11\377\225\15""4\377\377\274\21B\377\222" \ + "\274\21B\377\2\200\14-\377\3\0\1\377\323\0\0\0\377\2\0\0\0\321\0\0\0" \ + "(\377\0\0\0\0\372\0\0\0\0\2\0\0\0\34\0\0\0\303\324\0\0\0\377\2""1\4\21" \ + "\377\256\20=\377\377\274\21B\377\224\274\21B\377\1r\12(\377\322\0\0\0" \ + "\377\2\0\0\0\221\0\0\0\10\377\0\0\0\0\374\0\0\0\0\3\0\0\0\4\0\0\0\200" \ + "\0\0\0\375\321\0\0\0\377\2C\6\30\377\270\21A\377\377\274\21B\377\226" \ + "\274\21B\377\1G\6\31\377\317\0\0\0\377\2\0\0\0\363\0\0\0\\\377\0\0\0" \ + "\0\377\0\0\0\0\3\0\0\0\0\0\0\0C\0\0\0\347\317\0\0\0\377\2J\7\32\377\273" \ + "\21A\377\377\274\21B\377\227\274\21B\377\2\260\20>\377\20\1\6\377\315" \ + "\0\0\0\377\2\0\0\0\320\0\0\0'\377\0\0\0\0\377\0\0\0\0\203\0\0\0\0\2\0" \ + "\0\0\27\0\0\0\273\315\0\0\0\377\2<\5\25\377\272\21A\377\377\274\21B\377" \ + "\231\274\21B\377\1k\12&\377\314\0\0\0\377\2\0\0\0\221\0\0\0\10\377\0" \ + "\0\0\0\377\0\0\0\0\205\0\0\0\0\3\0\0\0\5\0\0\0\215\0\0\0\376\312\0\0" \ + "\0\377\2\36\3\13\377\264\20\77\377\377\274\21B\377\232\274\21B\377\2" \ + "\263\20\77\377\11\1\3\377\311\0\0\0\377\2\0\0\0\364\0\0\0a\377\0\0\0" \ + "\0\377\0\0\0\0\211\0\0\0\0\2\0\0\0@\0\0\0\343\310\0\0\0\377\2\4\0\1\377" \ + "\232\16""6\377\377\274\21B\377\234\274\21B\377\1""6\5\23\377\310\0\0" \ + "\0\377\2\0\0\0\303\0\0\0\37\377\0\0\0\0\377\0\0\0\0\213\0\0\0\0\2\0\0" \ + "\0\17\0\0\0\247\307\0\0\0\377\1S\7\35\377\377\274\21B\377\235\274\21" \ + "B\377\1X\10\37\377\306\0\0\0\377\3\0\0\0\374\0\0\0\200\0\0\0\4\377\0" \ + "\0\0\0\377\0\0\0\0\216\0\0\0\0\2\0\0\0^\0\0\0\364\304\0\0\0\377\2\4\0" \ + "\1\377\252\17<\377\377\274\21B\377\235\274\21B\377\1f\11$\377\305\0\0" \ + "\0\377\2\0\0\0\336\0\0\0""8\377\0\0\0\0\377\0\0\0\0\221\0\0\0\0\2\0\0" \ + "\0(\0\0\0\316\303\0\0\0\377\1:\5\24\377\377\274\21B\377\236\274\21B\377" \ + "\1a\11\"\377\304\0\0\0\377\2\0\0\0\246\0\0\0\17\377\0\0\0\0\377\0\0\0" \ + "\0\223\0\0\0\0\3\0\0\0\5\0\0\0\200\0\0\0\375\301\0\0\0\377\1k\12&\377" \ + "\377\274\21B\377\236\274\21B\377\1L\7\33\377\302\0\0\0\377\2\0\0\0\363" \ + "\0\0\0^\377\0\0\0\0\377\0\0\0\0\227\0\0\0\0\2\0\0\0O\0\0\0\350\300\0" \ + "\0\0\377\1\213\15""1\377\377\274\21B\377\236\274\21B\377\1'\4\16\377" \ + "\301\0\0\0\377\2\0\0\0\317\0\0\0-\377\0\0\0\0\377\0\0\0\0\231\0\0\0\0" \ + "\2\0\0\0\17\0\0\0\231\277\0\0\0\377\1\225\15""4\377\377\274\21B\377\235" \ + "\274\21B\377\2\253\17<\377\1\0\1\377\277\0\0\0\377\3\0\0\0\370\0\0\0" \ + "w\0\0\0\3\377\0\0\0\0\377\0\0\0\0\234\0\0\0\0\2\0\0\0H\0\0\0\343\275" \ + "\0\0\0\377\1\222\15""3\377\377\274\21B\377\235\274\21B\377\1m\12&\377" \ + "\277\0\0\0\377\2\0\0\0\312\0\0\0*\377\0\0\0\0\377\0\0\0\0\237\0\0\0\0" \ + "\2\0\0\0\17\0\0\0\231\274\0\0\0\377\1z\13+\377\377\274\21B\377\235\274" \ + "\21B\377\1!\3\14\377\275\0\0\0\377\3\0\0\0\370\0\0\0w\0\0\0\4\377\0\0" \ + "\0\0\377\0\0\0\0\242\0\0\0\0\2\0\0\0J\0\0\0\344\272\0\0\0\377\1J\7\32" \ + "\377\377\274\21B\377\234\274\21B\377\1\204\14.\377\275\0\0\0\377\2\0" \ + "\0\0\313\0\0\0+\377\0\0\0\0\377\0\0\0\0\245\0\0\0\0\2\0\0\0\30\0\0\0" \ + "\257\271\0\0\0\377\2\15\1\4\377\266\20@\377\377\274\21B\377\232\274\21" \ + "B\377\2\270\21A\377\35\3\12\377\273\0\0\0\377\3\0\0\0\374\0\0\0\210\0" \ + "\0\0\7\377\0\0\0\0\377\0\0\0\0\250\0\0\0\0\2\0\0\0J\0\0\0\336\270\0\0" \ + "\0\377\1l\12&\377\377\274\21B\377\232\274\21B\377\1i\11%\377\273\0\0" \ + "\0\377\2\0\0\0\274\0\0\0&\377\0\0\0\0\377\0\0\0\0\253\0\0\0\0\3\0\0\0" \ + "\11\0\0\0\200\0\0\0\371\266\0\0\0\377\2\26\2\10\377\264\20\77\377\377" \ + "\274\21B\377\230\274\21B\377\2\257\20>\377\17\1\5\377\271\0\0\0\377\3" \ + "\0\0\0\352\0\0\0^\0\0\0\1\377\0\0\0\0\377\0\0\0\0\256\0\0\0\0\2\0\0\0" \ + "&\0\0\0\275\266\0\0\0\377\1S\7\35\377\377\274\21B\377\230\274\21B\377" \ + "\1<\5\25\377\270\0\0\0\377\3\0\0\0\376\0\0\0\231\0\0\0\22\377\0\0\0\0" \ + "\377\0\0\0\0\261\0\0\0\0\3\0\0\0\1\0\0\0^\0\0\0\353\264\0\0\0\377\2\2" \ + "\0\1\377\227\16""5\377\377\274\21B\377\226\274\21B\377\1r\12(\377\270" \ + "\0\0\0\377\2\0\0\0\325\0\0\0>\377\0\0\0\0\377\0\0\0\0\265\0\0\0\0\3\0" \ + "\0\0\22\0\0\0\231\0\0\0\376\263\0\0\0\377\2)\4\16\377\271\21A\377\377" \ + "\274\21B\377\224\274\21B\377\2\242\17""9\377\12\1\3\377\266\0\0\0\377" \ + "\3\0\0\0\367\0\0\0w\0\0\0\5\377\0\0\0\0\377\0\0\0\0\270\0\0\0\0\2\0\0" \ + "\0G\0\0\0\324\263\0\0\0\377\1U\10\36\377\377\274\21B\377\223\274\21B" \ + "\377\2\270\21A\377)\4\16\377\266\0\0\0\377\2\0\0\0\267\0\0\0*\377\0\0" \ + "\0\0\377\0\0\0\0\273\0\0\0\0\3\0\0\0\1\0\0\0U\0\0\0\340\262\0\0\0\377" \ + "\1t\13)\377\377\274\21B\377\221\274\21B\377\2\273\21B\377@\6\27\377\265" \ + "\0\0\0\377\2\0\0\0\306\0\0\0""8\377\0\0\0\0\377\0\0\0\0\277\0\0\0\0\3" \ + "\0\0\0\12\0\0\0w\0\0\0\362\260\0\0\0\377\2\6\1\2\377\226\16""5\377\377" \ + "\274\21B\377\220\274\21B\377\1[\10\40\377\264\0\0\0\377\3\0\0\0\337\0" \ + "\0\0U\0\0\0\1\377\0\0\0\0\377\0\0\0\0\302\0\0\0\0\3\0\0\0\32\0\0\0\231" \ + "\0\0\0\374\257\0\0\0\377\2\31\2\11\377\252\17<\377\377\274\21B\377\216" \ + "\274\21B\377\2y\13*\377\1\0\0\377\262\0\0\0\377\3\0\0\0\361\0\0\0w\0" \ + "\0\0\12\377\0\0\0\0\377\0\0\0\0\306\0\0\0\0\2\0\0\0*\0\0\0\266\257\0" \ + "\0\0\377\2!\3\14\377\257\20=\377\377\274\21B\377\214\274\21B\377\2\216" \ + "\15""2\377\5\0\2\377\261\0\0\0\377\3\0\0\0\374\0\0\0\231\0\0\0\31\377" \ + "\0\0\0\0\377\0\0\0\0\311\0\0\0\0\3\0\0\0\1\0\0\0T\0\0\0\324\256\0\0\0" \ + "\377\2#\3\14\377\257\20>\377\377\274\21B\377\212\274\21B\377\2\213\15" \ + "1\377\7\1\3\377\261\0\0\0\377\2\0\0\0\270\0\0\0""6\377\0\0\0\0\377\0" \ + "\0\0\0\316\0\0\0\0\2\0\0\0D\0\0\0\313\255\0\0\0\377\2*\4\17\377\264\20" \ + "\77\377\377\274\21B\377\210\274\21B\377\2\211\14""0\377\7\1\3\377\257" \ + "\0\0\0\377\3\0\0\0\376\0\0\0\252\0\0\0-\377\0\0\0\0\377\0\0\0\0\321\0" \ + "\0\0\0\3\0\0\0\1\0\0\0M\0\0\0\315\254\0\0\0\377\2""4\5\22\377\264\20" \ + "\77\377\377\274\21B\377\206\274\21B\377\2\213\15""1\377\10\1\3\377\256" \ + "\0\0\0\377\3\0\0\0\376\0\0\0\252\0\0\0.\377\0\0\0\0\377\0\0\0\0\325\0" \ + "\0\0\0\3\0\0\0\1\0\0\0M\0\0\0\315\253\0\0\0\377\2\40\3\13\377\251\17" \ + ";\377\377\274\21B\377\204\274\21B\377\2\201\14-\377\4\0\2\377\256\0\0" \ + "\0\377\2\0\0\0\252\0\0\0/\377\0\0\0\0\377\0\0\0\0\331\0\0\0\0\3\0\0\0" \ + "\1\0\0\0M\0\0\0\316\252\0\0\0\377\2\37\3\13\377\247\17;\377\377\274\21" \ + "B\377\202\274\21B\377\2|\13+\377\5\0\2\377\255\0\0\0\377\2\0\0\0\263" \ + "\0\0\0""8\377\0\0\0\0\377\0\0\0\0\335\0\0\0\0\3\0\0\0\4\0\0\0X\0\0\0" \ + "\311\251\0\0\0\377\2\27\2\10\377\237\16""8\377\377\274\21B\377\2e\11" \ + "#\377\1\0\0\377\253\0\0\0\377\3\0\0\0\375\0\0\0\257\0\0\0>\377\0\0\0" \ + "\0\377\0\0\0\0\342\0\0\0\0\3\0\0\0""0\0\0\0\231\0\0\0\367\247\0\0\0\377" \ + "\2\12\1\3\377\202\14.\377\374\274\21B\377\2\270\21@\377F\6\31\377\253" \ + "\0\0\0\377\3\0\0\0\355\0\0\0\200\0\0\0\30\377\0\0\0\0\377\0\0\0\0\346" \ + "\0\0\0\0\3\0\0\0\27\0\0\0\200\0\0\0\354\246\0\0\0\377\3\1\0\0\377^\11" \ + "!\377\273\21B\377\371\274\21B\377\2\261\20>\3771\4\21\377\252\0\0\0\377" \ + "\3\0\0\0\326\0\0\0f\0\0\0\14\377\0\0\0\0\377\0\0\0\0\352\0\0\0\0\3\0" \ + "\0\0\7\0\0\0^\0\0\0\325\246\0\0\0\377\2I\7\32\377\270\21@\377\367\274" \ + "\21B\377\2\242\17""9\377$\3\15\377\250\0\0\0\377\4\0\0\0\376\0\0\0\263" \ + "\0\0\0D\0\0\0\2\377\0\0\0\0\377\0\0\0\0\356\0\0\0\0\3\0\0\0\3\0\0\0T" \ + "\0\0\0\300\245\0\0\0\377\2+\4\17\377\252\17<\377\365\274\21B\377\2~\13" \ + ",\377\13\1\4\377\247\0\0\0\377\3\0\0\0\371\0\0\0\250\0\0\0:\377\0\0\0" \ + "\0\377\0\0\0\0\364\0\0\0\0\3\0\0\0\34\0\0\0w\0\0\0\343\243\0\0\0\377" \ + "\2\13\1\4\377z\13+\377\362\274\21B\377\2\264\20\77\377E\6\30\377\247" \ + "\0\0\0\377\3\0\0\0\321\0\0\0f\0\0\0\17\377\0\0\0\0\377\0\0\0\0\370\0" \ + "\0\0\0\4\0\0\0\11\0\0\0^\0\0\0\303\0\0\0\376\242\0\0\0\377\2E\6\30\377" \ + "\263\20\77\377\357\274\21B\377\2\234\16""7\377\35\3\12\377\245\0\0\0" \ + "\377\4\0\0\0\371\0\0\0\254\0\0\0F\0\0\0\2\377\0\0\0\0\377\0\0\0\0\375" \ + "\0\0\0\0\3\0\0\0\32\0\0\0o\0\0\0\316\241\0\0\0\377\2\40\3\13\377\231" \ + "\16""6\377\355\274\21B\377\2v\13)\377\12\1\4\377\243\0\0\0\377\4\0\0" \ + "\0\374\0\0\0\263\0\0\0U\0\0\0\11\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0" \ + "\203\0\0\0\0\4\0\0\0\1\0\0\0;\0\0\0\234\0\0\0\376\237\0\0\0\377\3\5\0" \ + "\2\377g\11$\377\272\21A\377\351\274\21B\377\2\250\17;\3777\5\23\377\243" \ + "\0\0\0\377\3\0\0\0\363\0\0\0\203\0\0\0&\377\0\0\0\0\377\0\0\0\0\377\0" \ + "\0\0\0\211\0\0\0\0\2\0\0\0b\0\0\0\375\240\0\0\0\377\2!\3\14\377\223\15" \ + "4\377\346\274\21B\377\3\273\21A\377d\11#\377\7\1\3\377\243\0\0\0\377" \ + "\2\0\0\0\355\0\0\0""3\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\214\0\0\0\0" \ + "\2\0\0\0Y\0\0\0\374\240\0\0\0\377\3\1\0\0\377K\7\32\377\262\20>\377\343" \ + "\274\21B\377\2\241\17""8\377,\4\20\377\244\0\0\0\377\2\0\0\0\355\0\0" \ + "\0""2\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\216\0\0\0\0\2\0\0\0X\0\0\0" \ + "\373\241\0\0\0\377\2\30\2\11\377\207\14/\377\340\274\21B\377\3\270\21" \ + "@\377h\11$\377\13\1\4\377\244\0\0\0\377\2\0\0\0\354\0\0\0""1\377\0\0" \ + "\0\0\377\0\0\0\0\377\0\0\0\0\220\0\0\0\0\2\0\0\0W\0\0\0\373\242\0\0\0" \ + "\377\2\77\6\26\377\243\17""9\377\335\274\21B\377\2\202\14.\377\33\2\12" \ + "\377\245\0\0\0\377\2\0\0\0\353\0\0\0""0\377\0\0\0\0\377\0\0\0\0\377\0" \ + "\0\0\0\222\0\0\0\0\2\0\0\0b\0\0\0\375\242\0\0\0\377\3\1\0\1\377E\6\30" \ + "\377\251\17;\377\331\274\21B\377\2\221\15""3\377'\4\16\377\246\0\0\0" \ + "\377\2\0\0\0\357\0\0\0""5\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\224\0\0" \ + "\0\0\2\0\0\0F\0\0\0\362\243\0\0\0\377\3\13\1\4\377c\11#\377\265\20\77" \ + "\377\325\274\21B\377\3\252\17<\377J\7\32\377\2\0\1\377\246\0\0\0\377" \ + "\2\0\0\0\333\0\0\0#\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\226\0\0\0\0\2" \ + "\0\0\0""5\0\0\0\351\244\0\0\0\377\3\24\2\7\377r\12(\377\270\21A\377\321" \ + "\274\21B\377\3\251\17;\377Q\7\34\377\6\1\2\377\247\0\0\0\377\2\0\0\0" \ + "\315\0\0\0\30\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\230\0\0\0\0\2\0\0\0" \ + "\"\0\0\0\332\245\0\0\0\377\3\17\1\5\377^\11!\377\257\20=\377\315\274" \ + "\21B\377\3\241\17""9\377E\6\30\377\4\0\1\377\250\0\0\0\377\2\0\0\0\267" \ + "\0\0\0\14\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\232\0\0\0\0\2\0\0\0\30" \ + "\0\0\0\314\246\0\0\0\377\3\15\1\4\377[\10\40\377\254\20<\377\311\274" \ + "\21B\377\3\250\17;\377P\7\34\377\6\1\2\377\251\0\0\0\377\2\0\0\0\244" \ + "\0\0\0\6\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\234\0\0\0\0\2\0\0\0\20\0" \ + "\0\0\276\247\0\0\0\377\3\7\1\2\377M\7\33\377\241\17""8\377\305\274\21" \ + "B\377\3\216\15""2\377@\6\27\377\4\0\2\377\252\0\0\0\377\2\0\0\0\221\0" \ + "\0\0\2\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\236\0\0\0\0\2\0\0\0\3\0\0" \ + "\0\210\251\0\0\0\377\3&\3\15\377k\12&\377\257\20=\377\277\274\21B\377" \ + "\3\255\20=\377d\11#\377\32\2\11\377\253\0\0\0\377\2\0\0\0\366\0\0\0Y" \ + "\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\242\0\0\0\0\2\0\0\0Z\0\0\0\367\251" \ + "\0\0\0\377\3\12\1\4\377L\7\33\377\224\15""4\377\273\274\21B\377\3\224" \ + "\15""4\377J\7\32\377\10\1\3\377\254\0\0\0\377\2\0\0\0\346\0\0\0""8\377" \ + "\0\0\0\0\377\0\0\0\0\377\0\0\0\0\244\0\0\0\0\2\0\0\0""9\0\0\0\347\253" \ + "\0\0\0\377\3\40\3\13\377e\11#\377\241\17""9\377\264\274\21B\377\4\273" \ + "\21A\377\217\15""2\377S\7\35\377\27\2\10\377\256\0\0\0\377\2\0\0\0\311" \ + "\0\0\0\32\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\246\0\0\0\0\2\0\0\0\33" \ + "\0\0\0\313\255\0\0\0\377\4!\3\14\377]\10!\377\223\15""4\377\272\21A\377" \ + "\255\274\21B\377\4\270\21A\377\210\14""0\377L\7\33\377\22\2\6\377\260" \ + "\0\0\0\377\2\0\0\0\241\0\0\0\10\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\250" \ + "\0\0\0\0\2\0\0\0\14\0\0\0\243\257\0\0\0\377\4\15\1\5\377\77\6\26\377" \ + "r\12(\377\237\16""8\377\246\274\21B\377\5\273\21B\377\234\16""7\377j" \ + "\12%\377:\5\24\377\13\1\4\377\261\0\0\0\377\3\0\0\0\372\0\0\0v\0\0\0" \ + "\1\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\253\0\0\0\0\2\0\0\0R\0\0\0\357" \ + "\261\0\0\0\377\5\17\1\5\377;\5\25\377d\11#\377\205\14/\377\247\17:\377" \ + "\235\274\21B\377\5\253\17<\377\211\14""0\377`\11\"\3777\5\23\377\15\1" \ + "\5\377\264\0\0\0\377\2\0\0\0\332\0\0\0""2\377\0\0\0\0\377\0\0\0\0\377" \ + "\0\0\0\0\256\0\0\0\0\2\0\0\0\37\0\0\0\307\265\0\0\0\377\11\15\1\4\377" \ + ")\4\16\377C\6\30\377^\11!\377x\13*\377\211\14""0\377\233\16""6\377\252" \ + "\17<\377\272\21A\377\213\274\21B\377\11\263\20\77\377\246\17:\377\230" \ + "\16""5\377\206\14/\377s\12(\377^\10!\377I\7\32\377,\4\20\377\15\1\5\377" \ + "\270\0\0\0\377\2\0\0\0\245\0\0\0\15\377\0\0\0\0\377\0\0\0\0\377\0\0\0" \ + "\0\260\0\0\0\0\3\0\0\0\5\0\0\0\210\0\0\0\376\275\0\0\0\377\1\14\1\4\377" \ + "\204\15\1\4\377\1\12\1\3\377\303\0\0\0\377\2\0\0\0\364\0\0\0^\377\0\0" \ + "\0\0\377\0\0\0\0\377\0\0\0\0\264\0\0\0\0\2\0\0\0O\0\0\0\346\377\0\0\0" \ + "\377\205\0\0\0\377\2\0\0\0\314\0\0\0.\377\0\0\0\0\377\0\0\0\0\377\0\0" \ + "\0\0\266\0\0\0\0\3\0\0\0\16\0\0\0\221\0\0\0\375\377\0\0\0\377\4\0\0\0" \ + "\377\0\0\0\364\0\0\0f\0\0\0\1\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\271" \ + "\0\0\0\0\2\0\0\0=\0\0\0\332\376\0\0\0\377\2\0\0\0\276\0\0\0\"\377\0\0" \ + "\0\0\377\0\0\0\0\377\0\0\0\0\274\0\0\0\0\3\0\0\0\20\0\0\0\234\0\0\0\376" \ + "\372\0\0\0\377\3\0\0\0\365\0\0\0v\0\0\0\3\377\0\0\0\0\377\0\0\0\0\377" \ + "\0\0\0\0\277\0\0\0\0\2\0\0\0""0\0\0\0\304\367\0\0\0\377\3\0\0\0\376\0" \ + "\0\0\242\0\0\0\30\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\302\0\0\0\0\3\0" \ + "\0\0\1\0\0\0^\0\0\0\350\364\0\0\0\377\2\0\0\0\321\0\0\0=\377\0\0\0\0" \ + "\377\0\0\0\0\377\0\0\0\0\306\0\0\0\0\3\0\0\0\23\0\0\0\231\0\0\0\375\360" \ + "\0\0\0\377\3\0\0\0\363\0\0\0v\0\0\0\6\377\0\0\0\0\377\0\0\0\0\377\0\0" \ + "\0\0\311\0\0\0\0\3\0\0\0\40\0\0\0\231\0\0\0\374\354\0\0\0\377\3\0\0\0" \ + "\361\0\0\0w\0\0\0\15\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\315\0\0\0\0" \ + "\3\0\0\0*\0\0\0\252\0\0\0\376\350\0\0\0\377\3\0\0\0\366\0\0\0\210\0\0" \ + "\0\24\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\321\0\0\0\0\2\0\0\0=\0\0\0" \ + "\300\345\0\0\0\377\3\0\0\0\373\0\0\0\242\0\0\0#\377\0\0\0\0\377\0\0\0" \ + "\0\377\0\0\0\0\325\0\0\0\0\3\0\0\0.\0\0\0\242\0\0\0\372\340\0\0\0\377" \ + "\3\0\0\0\355\0\0\0\200\0\0\0\27\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\331" \ + "\0\0\0\0\3\0\0\0\30\0\0\0\200\0\0\0\357\334\0\0\0\377\3\0\0\0\341\0\0" \ + "\0o\0\0\0\14\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\335\0\0\0\0\3\0\0\0" \ + "\25\0\0\0y\0\0\0\334\330\0\0\0\377\3\0\0\0\306\0\0\0a\0\0\0\10\377\0" \ + "\0\0\0\377\0\0\0\0\377\0\0\0\0\342\0\0\0\0\3\0\0\0""3\0\0\0\231\0\0\0" \ + "\364\322\0\0\0\377\3\0\0\0\342\0\0\0\200\0\0\0$\377\0\0\0\0\377\0\0\0" \ + "\0\377\0\0\0\0\347\0\0\0\0\4\0\0\0\24\0\0\0q\0\0\0\311\0\0\0\376\314" \ + "\0\0\0\377\4\0\0\0\371\0\0\0\265\0\0\0[\0\0\0\10\377\0\0\0\0\377\0\0" \ + "\0\0\377\0\0\0\0\354\0\0\0\0\4\0\0\0\24\0\0\0^\0\0\0\263\0\0\0\373\306" \ + "\0\0\0\377\4\0\0\0\363\0\0\0\242\0\0\0M\0\0\0\11\377\0\0\0\0\377\0\0" \ + "\0\0\377\0\0\0\0\362\0\0\0\0\4\0\0\0\40\0\0\0q\0\0\0\272\0\0\0\367\300" \ + "\0\0\0\377\4\0\0\0\356\0\0\0\251\0\0\0_\0\0\0\21\377\0\0\0\0\377\0\0" \ + "\0\0\377\0\0\0\0\370\0\0\0\0\4\0\0\0\12\0\0\0L\0\0\0\224\0\0\0\335\271" \ + "\0\0\0\377\5\0\0\0\375\0\0\0\314\0\0\0\203\0\0\0;\0\0\0\3\377\0\0\0\0" \ + "\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\5\0\0\0\16\0\0\0D\0\0\0\200\0\0" \ + "\0\263\0\0\0\357\260\0\0\0\377\5\0\0\0\351\0\0\0\252\0\0\0o\0\0\0<\0" \ + "\0\0\12\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\210\0\0\0\0\6" \ + "\0\0\0\10\0\0\0:\0\0\0f\0\0\0\217\0\0\0\272\0\0\0\343\245\0\0\0\377\7" \ + "\0\0\0\374\0\0\0\332\0\0\0\257\0\0\0\206\0\0\0[\0\0\0.\0\0\0\3\377\0" \ + "\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\222\0\0\0\0\11\0\0\0\17\0" \ + "\0\0""5\0\0\0R\0\0\0p\0\0\0\217\0\0\0\255\0\0\0\312\0\0\0\341\0\0\0\363" \ + "\224\0\0\0\377\11\0\0\0\356\0\0\0\334\0\0\0\304\0\0\0\245\0\0\0\207\0" \ + "\0\0j\0\0\0L\0\0\0-\0\0\0\7\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0" \ + "\0\0\0\241\0\0\0\0\4\0\0\0\5\0\0\0\27\0\0\0)\0\0\0;\202\0\0\0D\1\0\0" \ + "\0O\206\0\0\0U\1\0\0\0K\202\0\0\0D\4\0\0\0""7\0\0\0%\0\0\0\23\0\0\0\2" \ + "\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0" \ + "\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\220" \ + "\0\0\0\0") + + diff --git a/bsp/meta-raspberrypi/recipes-core/psplash/psplash_%.bbappend b/bsp/meta-raspberrypi/recipes-core/psplash/psplash_%.bbappend new file mode 100644 index 00000000000..41622aa5069 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-core/psplash/psplash_%.bbappend @@ -0,0 +1,2 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" +SPLASH_IMAGES_rpi = "file://psplash-raspberrypi-img.h;outsuffix=raspberrypi" diff --git a/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-rpi.bb b/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-rpi.bb new file mode 100644 index 00000000000..42cfcdd4d5a --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-rpi.bb @@ -0,0 +1,18 @@ +DESCRIPTION = "udev rules for Raspberry Pi Boards" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +SRC_URI = " \ + file://99-com.rules \ + file://can.rules \ + " + +S = "${WORKDIR}" + +INHIBIT_DEFAULT_DEPS = "1" + +do_install () { + install -d ${D}${sysconfdir}/udev/rules.d + install -m 0644 ${WORKDIR}/99-com.rules ${D}${sysconfdir}/udev/rules.d/ + install -m 0644 ${WORKDIR}/can.rules ${D}${sysconfdir}/udev/rules.d/ +} diff --git a/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-rpi/99-com.rules b/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-rpi/99-com.rules new file mode 100644 index 00000000000..ddd1e1743e5 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-rpi/99-com.rules @@ -0,0 +1,21 @@ +KERNEL=="ttyAMA[01]", PROGRAM="/bin/sh -c '\ + ALIASES=/proc/device-tree/aliases; \ + if cmp -s $$ALIASES/uart0 $$ALIASES/serial0; then \ + echo 0;\ + elif cmp -s $$ALIASES/uart0 $$ALIASES/serial1; then \ + echo 1; \ + else \ + exit 1; \ + fi\ +'", SYMLINK+="serial%c" + +KERNEL=="ttyS0", PROGRAM="/bin/sh -c '\ + ALIASES=/proc/device-tree/aliases; \ + if cmp -s $$ALIASES/uart1 $$ALIASES/serial0; then \ + echo 0; \ + elif cmp -s $$ALIASES/uart1 $$ALIASES/serial1; then \ + echo 1; \ + else \ + exit 1; \ + fi \ +'", SYMLINK+="serial%c" diff --git a/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-rpi/can.rules b/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-rpi/can.rules new file mode 100644 index 00000000000..a47d57de8be --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-rpi/can.rules @@ -0,0 +1 @@ +SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/3f204000.spi/spi_master/spi0/spi0.0/net/can0", RUN+="/sbin/ip link set can0 up type can bitrate 500000" diff --git a/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-udisks-rpi/80-udisks-rpi.rules b/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-udisks-rpi/80-udisks-rpi.rules new file mode 100644 index 00000000000..3eff66dbc31 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-udisks-rpi/80-udisks-rpi.rules @@ -0,0 +1,10 @@ +############################################################################################################## + +# Partitions which desktops should not display +# + +# boot partition +ENV{ID_FS_TYPE}=="vfat", ENV{ID_FS_LABEL}=="raspberrypi", \ + ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1" + +############################################################################################################## diff --git a/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-udisks-rpi_1.0.bb b/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-udisks-rpi_1.0.bb new file mode 100644 index 00000000000..ae35521d439 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-core/udev/udev-rules-udisks-rpi_1.0.bb @@ -0,0 +1,13 @@ +DESCRIPTION = "add udisk/udev rule to hide boot partition from udev" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" +SRC_URI = "file://80-udisks-rpi.rules" + +INHIBIT_DEFAULT_DEPS = "1" + +do_install () { + install -d ${D}${base_libdir}/udev/rules.d + install -m 644 ${WORKDIR}/80-udisks-rpi.rules ${D}${base_libdir}/udev/rules.d +} + +FILES_${PN} = "${base_libdir}/udev/rules.d" diff --git a/bsp/meta-raspberrypi/recipes-devtools/bcm2835/bcm2835_1.52.bb b/bsp/meta-raspberrypi/recipes-devtools/bcm2835/bcm2835_1.52.bb new file mode 100644 index 00000000000..eef6afd1c31 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/bcm2835/bcm2835_1.52.bb @@ -0,0 +1,42 @@ +DESCRIPTION = "Package that provides access to GPIO and other IO\ +functions on the Broadcom BCM 2835 chip, allowing access to the\ +GPIO pins on the 26 pin IDE plug on the RPi board" +SECTION = "base" +HOMEPAGE = "http://www.open.com.au/mikem/bcm2835" +AUTHOR = "Mike McCauley (mikem@open.com.au)" + +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263" + +COMPATIBLE_MACHINE = "^rpi$" + +SRC_URI = "http://www.airspayce.com/mikem/bcm2835/bcm2835-${PV}.tar.gz" + +SRC_URI[md5sum] = "b5dc426b4ff258bb1397442f98e40236" +SRC_URI[sha256sum] = "b9fd10f7a80aadaed28a77168709b7c519568a63b6e98d0a50e9c5fe31bea6bb" + +inherit autotools + +do_compile_append() { + # Now compiling the examples provided by the package + mkdir -p ${B}/examples + for file in `ls ${S}/examples`; do + ${CC} ${LDFLAGS} ${S}/examples/${file}/${file}.c -o ${B}/examples/${file} -Bstatic -L${B}/src -lbcm2835 -I${S}/src + done +} + +do_install_append() { + install -d ${D}/${libdir}/${BPN} + for file in ${B}/examples/* + do + install -m 0755 ${file} ${D}/${libdir}/${BPN} + done +} + +PACKAGES += "${PN}-tests" + +RDEPENDS_${PN}-dev = "" + +FILES_${PN} = "" +FILES_${PN}-tests = "${libdir}/${BPN}" +FILES_${PN}-dbg += "${libdir}/${BPN}/.debug" diff --git a/bsp/meta-raspberrypi/recipes-devtools/pi-blaster/files/remove-initscript-lsb-dependency.patch b/bsp/meta-raspberrypi/recipes-devtools/pi-blaster/files/remove-initscript-lsb-dependency.patch new file mode 100644 index 00000000000..c8afe60ee87 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/pi-blaster/files/remove-initscript-lsb-dependency.patch @@ -0,0 +1,96 @@ +From 1338f98a279616f4e5e9ea30a25d1dfa0c7df5d6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petter=20Mab=C3=A4cker?= +Date: Sun, 4 Jun 2017 12:22:40 +0200 +Subject: [PATCH] Remove dependencies on LSB functions +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +See this as a rebase of the previous 'Remove dependencies on LSB +functions patch' with only minor modifications from the original version, +based on the work done by Alex Lennon in +'25fd817 pi-blaster: Added recipe'. + +Upstream-Status: Inappropriate [configuration] + +Signed-off-by: Petter Mabäcker +--- + debian/pi-blaster.init | 38 +++++++------------------------------- + 1 file changed, 7 insertions(+), 31 deletions(-) + +diff --git a/debian/pi-blaster.init b/debian/pi-blaster.init +index b142d70..01a686c 100644 +--- a/debian/pi-blaster.init ++++ b/debian/pi-blaster.init +@@ -28,12 +28,12 @@ SCRIPTNAME=/etc/init.d/$NAME + [ -r /etc/default/$NAME ] && . /etc/default/$NAME + + # Load the VERBOSE setting and other rcS variables +-. /lib/init/vars.sh ++#. /lib/init/vars.sh + + # Define LSB log_* functions. + # Depend on lsb-base (>= 3.2-14) to ensure that this file is present + # and status_of_proc is working. +-. /lib/lsb/init-functions ++#. /lib/lsb/init-functions + + # + # Function that starts the daemon/service +@@ -77,48 +77,24 @@ do_stop() + + case "$1" in + start) +- [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" ++ [ "$VERBOSE" != no ] && echo "Starting $DESC" "$NAME" + do_start +- case "$?" in +- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; +- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; +- esac + ;; + stop) +- [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" ++ [ "$VERBOSE" != no ] && echo "Stopping $DESC" "$NAME" + do_stop +- case "$?" in +- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; +- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; +- esac +- ;; +- status) +- status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? + ;; + restart|force-reload) + # + # If the "reload" option is implemented then remove the + # 'force-reload' alias + # +- log_daemon_msg "Restarting $DESC" "$NAME" ++ echo "Restarting $DESC" "$NAME" + do_stop +- case "$?" in +- 0|1) +- do_start +- case "$?" in +- 0) log_end_msg 0 ;; +- 1) log_end_msg 1 ;; # Old process is still running +- *) log_end_msg 1 ;; # Failed to start +- esac +- ;; +- *) +- # Failed to stop +- log_end_msg 1 +- ;; +- esac ++ do_start + ;; + *) +- echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 ++ echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2 + exit 3 + ;; + esac +-- +1.9.1 + diff --git a/bsp/meta-raspberrypi/recipes-devtools/pi-blaster/pi-blaster_git.bb b/bsp/meta-raspberrypi/recipes-devtools/pi-blaster/pi-blaster_git.bb new file mode 100644 index 00000000000..4b2d1ba2002 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/pi-blaster/pi-blaster_git.bb @@ -0,0 +1,23 @@ +DESCRIPTION = "This project enables PWM on the GPIO pins you request of a Raspberry Pi." +HOMEPAGE = "https://github.com/sarfata/pi-blaster/" +SECTION = "devel/libs" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://README.md;beginline=268;endline=292;md5=86d10e4bcf4b4014d306dde7c1d2a80d" + +SRC_URI = "git://github.com/sarfata/pi-blaster;branch=master;protocol=https \ + file://remove-initscript-lsb-dependency.patch \ + " + +S = "${WORKDIR}/git" + +SRCREV = "befd8ef36e5066e4d444ef47fe4020787e541248" + +inherit update-rc.d autotools + +INITSCRIPT_PACKAGES = "${PN}" +INITSCRIPT_NAME_${PN} = "${PN}.boot.sh" +INITSCRIPT_PARAMS_${PN} = "defaults 15 85" + +COMPATIBLE_MACHINE = "^rpi$" + +PACKAGE_ARCH = "${MACHINE_ARCH}" diff --git a/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-blinka_6.2.2.bb b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-blinka_6.2.2.bb new file mode 100644 index 00000000000..ac7a549ef84 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-blinka_6.2.2.bb @@ -0,0 +1,30 @@ +SUMMARY = "CircuitPython APIs for non-CircuitPython versions of Python such as CPython on Linux and MicroPython." +HOMEPAGE = "https://github.com/adafruit/Adafruit_Blinka" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=660e614bc7efb0697cc793d8a22a55c2" + +SRC_URI = "git://github.com/adafruit/Adafruit_Blinka.git;branch=main;protocol=https" +SRCREV = "dc688f354fe779c9267c208b99f310af87e79272" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +DEPENDS += "python3-setuptools-scm-native" + +do_install_append() { +# it ships ./bcm283x/pulseio/libgpiod_pulsein which is a prebuilt +# 32bit binary therefore we should make this specific to 32bit rpi machines (based on bcm283x) only + if [ ${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', '1', '0', d)} = "0" ]; then + rm -rf ${D}${PYTHON_SITEPACKAGES_DIR}/adafruit_blinka/microcontroller/bcm283x + fi +} + +RDEPENDS_${PN} += " \ + libgpiod \ + python3-adafruit-platformdetect \ + python3-adafruit-pureio \ + python3-core \ +" + +RDEPENDS_${PN}_append_rpi = " rpi-gpio" diff --git a/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-busdevice_5.0.5.bb b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-busdevice_5.0.5.bb new file mode 100644 index 00000000000..bb33bccbf68 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-busdevice_5.0.5.bb @@ -0,0 +1,18 @@ +SUMMARY = "CircuitPython bus device classes to manage bus sharing." +HOMEPAGE = "https://github.com/adafruit/Adafruit_CircuitPython_BusDevice" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6ec69d6e9e6c85adfb7799d7f8cf044e" + +SRC_URI = "git://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git;branch=main;protocol=https" +SRCREV = "1bfe8005293205e2f7b2cc498ab5a946f1133b40" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS_${PN} += " \ + python3-adafruit-blinka \ + python3-core \ +" diff --git a/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-motor_3.2.6.bb b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-motor_3.2.6.bb new file mode 100644 index 00000000000..25207fe521f --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-motor_3.2.6.bb @@ -0,0 +1,18 @@ +SUMMARY = "CircuitPython helper library provides higher level objects to control motors and servos." +HOMEPAGE = "https://github.com/adafruit/Adafruit_CircuitPython_Motor" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b72678307cc7c10910b5ef460216af07" + +SRC_URI = "git://github.com/adafruit/Adafruit_CircuitPython_Motor.git;branch=main;protocol=https" +SRCREV = "2251bfc0501d0acfb96c0a43f4f2b4c6a10ca14e" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS_${PN} += " \ + python3-adafruit-blinka \ + python3-core \ +" diff --git a/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-motorkit_1.6.1.bb b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-motorkit_1.6.1.bb new file mode 100644 index 00000000000..baf9c85b35e --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-motorkit_1.6.1.bb @@ -0,0 +1,22 @@ +SUMMARY = "CircuitPython helper library for DC & Stepper Motor FeatherWing, Shield, and Pi Hat kits." +HOMEPAGE = "https://github.com/adafruit/Adafruit_CircuitPython_MotorKit" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6ad4a8854b39ad474755ef1aea813bac" + +SRC_URI = "git://github.com/adafruit/Adafruit_CircuitPython_MotorKit.git;branch=main;protocol=https" +SRCREV = "8c1462b4129b21f6db156d1517abb017bb74b982" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS_${PN} += " \ + python3-adafruit-blinka \ + python3-adafruit-circuitpython-busdevice \ + python3-adafruit-circuitpython-motor \ + python3-adafruit-circuitpython-pca9685 \ + python3-adafruit-circuitpython-register \ + python3-core \ +" diff --git a/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-pca9685_3.3.4.bb b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-pca9685_3.3.4.bb new file mode 100644 index 00000000000..f287b5e31dd --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-pca9685_3.3.4.bb @@ -0,0 +1,20 @@ +SUMMARY = "CircuitPython driver for motor, stepper, and servo based on PCA9685." +HOMEPAGE = "https://github.com/adafruit/Adafruit_CircuitPython_PCA9685" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=e7eb6b599fb0cfb06485c64cd4242f62" + +SRC_URI = "git://github.com/adafruit/Adafruit_CircuitPython_PCA9685.git;branch=main;protocol=https" +SRCREV = "2780c4102f4c23fbab252aa1198b61ba7e2d1b2c" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS_${PN} += " \ + python3-adafruit-blinka \ + python3-adafruit-circuitpython-busdevice \ + python3-adafruit-circuitpython-register \ + python3-core \ +" diff --git a/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-register_1.9.4.bb b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-register_1.9.4.bb new file mode 100644 index 00000000000..c1a70aa38c2 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-circuitpython-register_1.9.4.bb @@ -0,0 +1,15 @@ +SUMMARY = "CircuitPython data descriptor classes to represent hardware registers on I2C and SPI devices." +HOMEPAGE = "https://github.com/adafruit/Adafruit_CircuitPython_Register" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=6ec69d6e9e6c85adfb7799d7f8cf044e" + +SRC_URI = "git://github.com/adafruit/Adafruit_CircuitPython_Register.git;branch=main;protocol=https" + +S = "${WORKDIR}/git" +SRCREV = "5fee6e0c3878110844bc51e16063eeae7d94c457" + +DEPENDS += "python3-setuptools-scm-native" + +inherit setuptools3 + +RDEPENDS_${PN} += "python3-core" diff --git a/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-platformdetect_3.1.1.bb b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-platformdetect_3.1.1.bb new file mode 100644 index 00000000000..5ab08bb4020 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-platformdetect_3.1.1.bb @@ -0,0 +1,15 @@ +SUMMARY = "Platform detection for use by libraries like Adafruit-Blinka." +HOMEPAGE = "https://github.com/adafruit/Adafruit_Python_PlatformDetect" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=fccd531dce4b989c05173925f0bbb76c" + +SRC_URI = "git://github.com/adafruit/Adafruit_Python_PlatformDetect.git;branch=main;protocol=https" +SRCREV = "e0fe1b012898fa824944d6805ca74be0fa027968" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS_${PN} += "python3-core" diff --git a/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-pureio_1.1.8.bb b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-pureio_1.1.8.bb new file mode 100644 index 00000000000..3201dd26758 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/python/python3-adafruit-pureio_1.1.8.bb @@ -0,0 +1,19 @@ +SUMMARY = "Pure python (i.e. no native extensions) access to Linux IO including I2C and SPI. Drop in replacement for smbus and spidev modules." +HOMEPAGE = "https://github.com/adafruit/Adafruit_Python_PureIO" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=2a21fcca821a506d4c36f7bbecc0d009" + +SRC_URI = "git://github.com/adafruit/Adafruit_Python_PureIO.git;branch=main;protocol=https" +SRCREV = "f4d0973da05b8b21905ff6bab69cdb652128f342" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +DEPENDS += "python3-setuptools-scm-native" + +RDEPENDS_${PN} += " \ + python3-core \ + python3-ctypes \ + python3-fcntl \ +" diff --git a/bsp/meta-raspberrypi/recipes-devtools/python/python3-rtimu/0001-include-asm-ioctl.h-for-ioctl-define.patch b/bsp/meta-raspberrypi/recipes-devtools/python/python3-rtimu/0001-include-asm-ioctl.h-for-ioctl-define.patch new file mode 100644 index 00000000000..4a93a1ce93c --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/python/python3-rtimu/0001-include-asm-ioctl.h-for-ioctl-define.patch @@ -0,0 +1,33 @@ +From c3aa4af56652b403e304ea5f321acfe289e42922 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 30 Jan 2016 16:07:14 -0800 +Subject: [PATCH] include asm/ioctl.h for ioctl() define + +also fixes errors e.g. + +../../RTIMULib/RTIMUHal.cpp:208:29: error: '_IOC_SIZEBITS' was not +declared in this scope + return ioctl(m_SPI, SPI_IOC_MESSAGE(1), &wrIOC); + +Signed-off-by: Khem Raj +--- +Upstream-Status: Submitted + + RTIMULib/RTIMUHal.cpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/RTIMULib/RTIMUHal.cpp b/RTIMULib/RTIMUHal.cpp +index f9c3d15..d968326 100644 +--- a/RTIMULib/RTIMUHal.cpp ++++ b/RTIMULib/RTIMUHal.cpp +@@ -29,6 +29,7 @@ + #if !defined(WIN32) && !defined(__APPLE__) + + #include ++#include + + RTIMUHal::RTIMUHal() + { +-- +2.7.0 + diff --git a/bsp/meta-raspberrypi/recipes-devtools/python/python3-rtimu_git.bb b/bsp/meta-raspberrypi/recipes-devtools/python/python3-rtimu_git.bb new file mode 100644 index 00000000000..fb8d0ae7ba0 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/python/python3-rtimu_git.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "RTIMULib is a C++ and Python library that makes it easy to use 9-dof and \ +10-dof IMUs with embedded Linux systems" +HOMEPAGE = "https://github.com/RPi-Distro/RTIMULib/" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://../../LICENSE;md5=96cdecb41125f498958e09b72faf318e" + +SRC_URI = "git://github.com/RPi-Distro/RTIMULib.git;branch=master;protocol=https \ + file://0001-include-asm-ioctl.h-for-ioctl-define.patch;patchdir=../.. \ + " +SRCREV = "b949681af69b45f0f7f4bb53b6770037b5b02178" + +S = "${WORKDIR}/git/Linux/python" + +inherit setuptools3 diff --git a/bsp/meta-raspberrypi/recipes-devtools/python/rpi-gpio/0001-Remove-nested-functions.patch b/bsp/meta-raspberrypi/recipes-devtools/python/rpi-gpio/0001-Remove-nested-functions.patch new file mode 100644 index 00000000000..5c94bc24f77 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/python/rpi-gpio/0001-Remove-nested-functions.patch @@ -0,0 +1,265 @@ +From 23d7ab77865f8b17042f5cd4c6720cca475e0eb5 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Wed, 13 Jan 2016 14:27:10 -0800 +Subject: [PATCH] Remove nested functions + +nested functions are not supported on llvm/clang compiler, replacing +them helps make code portable and be compilable with non-gcc compilers +additionally fix the diagnostic messages clang reported + +source/c_gpio.c:130:18: warning: comparison of distinct pointer types +('volatile uint32_t *' (aka 'volatile unsigned int *') an +d 'void *') [-Wcompare-distinct-pointer-types] + if (gpio_map < MAP_FAILED) + ~~~~~~~~ ^ ~~~~~~~~~~ + + source/c_gpio.c:89:13: warning: variable 'peri_base' is used +uninitialized whenever 'if' condition is false [-Wsometimes-uninit +ialized] + if (fread(buf, 1, sizeof buf, fp) == sizeof buf) { + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +source/c_gpio.c:116:17: note: uninitialized use occurs here + gpio_base = peri_base + GPIO_BASE_OFFSET; + ^~~~~~~~~ +source/c_gpio.c:89:9: note: remove the 'if' if its condition is always +true + if (fread(buf, 1, sizeof buf, fp) == sizeof buf) { + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +source/c_gpio.c:64:23: note: initialize the variable 'peri_base' to +silence this warning + uint32_t peri_base; + +Signed-off-by: Khem Raj +[Pierre-Jean: update for version 0.7.0] +Signed-off-by: Pierre-Jean Texier +--- +Upstream-Status: Submitted + + source/c_gpio.c | 6 +-- + source/py_gpio.c | 135 ++++++++++++++++++++++++++++--------------------------- + 2 files changed, 71 insertions(+), 70 deletions(-) + +diff --git a/source/py_gpio.c b/source/py_gpio.c +index d54cc7f..007bad5 100644 +--- a/source/py_gpio.c ++++ b/source/py_gpio.c +@@ -69,6 +69,20 @@ static int mmap_gpio_mem(void) + return 0; + } + } ++static inline int cleanup_one(unsigned int gpio) ++{ ++ // clean up any /sys/class exports ++ event_cleanup(gpio); ++ ++ // set everything back to input ++ if (gpio_direction[gpio] != -1) { ++ setup_gpio(gpio, INPUT, PUD_OFF); ++ gpio_direction[gpio] = -1; ++ return 1; ++ } ++ return 0; ++} ++ + + // python function cleanup(channel=None) + static PyObject *py_cleanup(PyObject *self, PyObject *args, PyObject *kwargs) +@@ -83,19 +97,6 @@ static PyObject *py_cleanup(PyObject *self, PyObject *args, PyObject *kwargs) + PyObject *tempobj; + static char *kwlist[] = {"channel", NULL}; + +- void cleanup_one(void) +- { +- // clean up any /sys/class exports +- event_cleanup(gpio); +- +- // set everything back to input +- if (gpio_direction[gpio] != -1) { +- setup_gpio(gpio, INPUT, PUD_OFF); +- gpio_direction[gpio] = -1; +- found = 1; +- } +- } +- + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O", kwlist, &chanlist)) + return NULL; + +@@ -140,7 +141,7 @@ static PyObject *py_cleanup(PyObject *self, PyObject *args, PyObject *kwargs) + } else if (channel != -666) { // channel was an int indicating single channel + if (get_gpio_number(channel, &gpio)) + return NULL; +- cleanup_one(); ++ found = cleanup_one(gpio); + } else { // channel was a list/tuple + for (i=0; i +Date: Sat, 30 Jan 2016 17:12:37 -0800 +Subject: [PATCH] include sys/types.h explicitly for getting caddr_t definition + +Helps fixing build on musl where sys/types.h is not included indirectly +as happening on glibc + +Signed-off-by: Khem Raj +--- +Upstream-Status: Submitted + + source/c_gpio/c_gpio.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/source/c_gpio/c_gpio.c b/source/c_gpio/c_gpio.c +index 25a04ca..70df632 100644 +--- a/source/c_gpio/c_gpio.c ++++ b/source/c_gpio/c_gpio.c +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + #include + #include "c_gpio.h" + +-- +2.7.0 + diff --git a/bsp/meta-raspberrypi/recipes-devtools/python/rpio_0.10.0.bb b/bsp/meta-raspberrypi/recipes-devtools/python/rpio_0.10.0.bb new file mode 100644 index 00000000000..d5653cb0dbd --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/python/rpio_0.10.0.bb @@ -0,0 +1,23 @@ +DESCRIPTION = "Advanced GPIO for the Raspberry Pi. Extends RPi.GPIO with PWM, \ +GPIO interrups, TCP socket interrupts, command line tools and more" +HOMEPAGE = "https://github.com/metachris/RPIO" +SECTION = "devel/python" +LICENSE = "LGPLv3+" +LIC_FILES_CHKSUM = "file://README.rst;beginline=41;endline=53;md5=d5d95d7486a4d98c999675c23196b25a" + +PYPI_PACKAGE = "RPIO" +inherit pypi + +SRC_URI += "file://0001-include-sys-types.h-explicitly-for-getting-caddr_t-d.patch" + +inherit setuptools3 + +COMPATIBLE_MACHINE = "^rpi$" + +RDEPENDS_${PN} = "\ + python3-logging \ + python3-threading \ +" + +SRC_URI[md5sum] = "cefc45422833dcafcd59b78dffc540f4" +SRC_URI[sha256sum] = "b89f75dec9de354681209ebfaedfe22b7c178aacd91a604a7bd6d92024e4cf7e" diff --git a/bsp/meta-raspberrypi/recipes-devtools/raspi-gpio/raspi-gpio_git.bb b/bsp/meta-raspberrypi/recipes-devtools/raspi-gpio/raspi-gpio_git.bb new file mode 100644 index 00000000000..02a3f5585b0 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-devtools/raspi-gpio/raspi-gpio_git.bb @@ -0,0 +1,16 @@ +DESCRIPTION = "Tool to help debug / hack at the BCM283x GPIO" +HOMEPAGE = "https://github.com/RPi-Distro/raspi-gpio" +SECTION = "devel/libs" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=a14affa234debc057b47cdca615b2192" + +COMPATIBLE_MACHINE = "^rpi$" + +inherit autotools + +SRCREV = "4edfde183ff3ac9ed66cdc015ae25e45f3a5502d" +SRC_URI = "git://github.com/RPi-Distro/raspi-gpio.git;protocol=https;branch=master \ + " + +S = "${WORKDIR}/git" + diff --git a/bsp/meta-raspberrypi/recipes-graphics/cairo/cairo_%.bbappend b/bsp/meta-raspberrypi/recipes-graphics/cairo/cairo_%.bbappend new file mode 100644 index 00000000000..7ba13e2099e --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/cairo/cairo_%.bbappend @@ -0,0 +1,3 @@ +PACKAGECONFIG_GLESV2 = " ${@bb.utils.contains('DISTRO_FEATURES', 'x11', '', 'glesv2', d)}" + +PACKAGECONFIG_append_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', ' egl ${PACKAGECONFIG_GLESV2}', d)}" diff --git a/bsp/meta-raspberrypi/recipes-graphics/kmscube/kmscube_%.bbappend b/bsp/meta-raspberrypi/recipes-graphics/kmscube/kmscube_%.bbappend new file mode 100644 index 00000000000..9343fb00ffc --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/kmscube/kmscube_%.bbappend @@ -0,0 +1,2 @@ +# userland driver EGL implementation does not have all needed bits for it so remove it from build +COMPATIBLE_HOST_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '(.*)', 'null', d)}" diff --git a/bsp/meta-raspberrypi/recipes-graphics/libsdl2/libsdl2_%.bbappend b/bsp/meta-raspberrypi/recipes-graphics/libsdl2/libsdl2_%.bbappend new file mode 100644 index 00000000000..cb9c24e4d41 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/libsdl2/libsdl2_%.bbappend @@ -0,0 +1,5 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +# when using userland graphic KHR/khrplatform.h is provided by userland but virtual/libgl is provided by mesa-gl where +# we explicitly delete KHR/khrplatform.h since its already coming from userland package +DEPENDS_append_rpi = " ${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', 'userland', d)}" diff --git a/bsp/meta-raspberrypi/recipes-graphics/libva/libva_%.bbappend b/bsp/meta-raspberrypi/recipes-graphics/libva/libva_%.bbappend new file mode 100644 index 00000000000..56ff4213aa1 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/libva/libva_%.bbappend @@ -0,0 +1,3 @@ +# when using userland graphic KHR/khrplatform.h is provided by userland but virtual/libgl is provided by mesa-gl where +# we explicitly delete KHR/khrplatform.h since its already coming from userland package +DEPENDS_append_rpi = " ${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', 'userland', d)}" diff --git a/bsp/meta-raspberrypi/recipes-graphics/mesa/libglu_%.bbappend b/bsp/meta-raspberrypi/recipes-graphics/mesa/libglu_%.bbappend new file mode 100644 index 00000000000..56ff4213aa1 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/mesa/libglu_%.bbappend @@ -0,0 +1,3 @@ +# when using userland graphic KHR/khrplatform.h is provided by userland but virtual/libgl is provided by mesa-gl where +# we explicitly delete KHR/khrplatform.h since its already coming from userland package +DEPENDS_append_rpi = " ${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', 'userland', d)}" diff --git a/bsp/meta-raspberrypi/recipes-graphics/mesa/mesa-demos_%.bbappend b/bsp/meta-raspberrypi/recipes-graphics/mesa/mesa-demos_%.bbappend new file mode 100644 index 00000000000..c187ab9c103 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/mesa/mesa-demos_%.bbappend @@ -0,0 +1,2 @@ +# mesa-demos need libgles1 and userland driver does not have it +COMPATIBLE_HOST_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '(.*)', 'null', d)}" diff --git a/bsp/meta-raspberrypi/recipes-graphics/mesa/mesa-gl_%.bbappend b/bsp/meta-raspberrypi/recipes-graphics/mesa/mesa-gl_%.bbappend new file mode 100644 index 00000000000..e561a1b02f8 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/mesa/mesa-gl_%.bbappend @@ -0,0 +1,8 @@ +PACKAGECONFIG_append_rpi = " gbm" +PROVIDES_append_rpi = " virtual/libgbm" + +GALLIUMDRIVERS_append_rpi = ",swrast" + +do_install_append_rpi() { + rm -rf ${D}${includedir}/KHR/khrplatform.h +} diff --git a/bsp/meta-raspberrypi/recipes-graphics/mesa/mesa_%.bbappend b/bsp/meta-raspberrypi/recipes-graphics/mesa/mesa_%.bbappend new file mode 100644 index 00000000000..eaa46f27b68 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/mesa/mesa_%.bbappend @@ -0,0 +1,6 @@ +# DRI3 note: +# With oe-core commit 8509e2e1a87578882b71948ccef3b50ccf1228b3 dri3 is set +# as default. To state out clearly that Raspi needs dri3 and to avoid surprises +# in case oe-core changes this default, we set dri3 explicitly. +PACKAGECONFIG_append_rpi = " gallium vc4 v3d kmsro ${@bb.utils.contains('DISTRO_FEATURES', 'x11 opengl', 'x11 dri3', '', d)}" +DRIDRIVERS_class-target_rpi = "" diff --git a/bsp/meta-raspberrypi/recipes-graphics/piglit/piglit_%.bbappend b/bsp/meta-raspberrypi/recipes-graphics/piglit/piglit_%.bbappend new file mode 100644 index 00000000000..0503fd0c346 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/piglit/piglit_%.bbappend @@ -0,0 +1,5 @@ +# mesa-demos need libgles1 and userland driver does not have it so remove it from piglit rdeps +RDEPENDS_${PN}_remove_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', 'mesa-demos', d)}" +# it needs EGL >= 11 but userland says it provided version 10, remove it from build +# | -- Requested 'egl >= 11.0' but version of EGL is 10 +COMPATIBLE_HOST_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '(.*)', 'null', d)}" diff --git a/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0001-gitignore-add-archives-from-lib-directory.patch b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0001-gitignore-add-archives-from-lib-directory.patch new file mode 100644 index 00000000000..de9d5c31b2d --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0001-gitignore-add-archives-from-lib-directory.patch @@ -0,0 +1,24 @@ +From 070b114fd54b6ad38b4eff04279fe89ccaaef61b Mon Sep 17 00:00:00 2001 +From: Trevor Woerner +Date: Fri, 4 Dec 2020 01:39:30 -0500 +Subject: [PATCH] gitignore: add archives from lib directory + +The build creates two *.a files in the lib directory, add these to .gitignore. + +Upstream-status: submitted [https://github.com/AndrewFromMelbourne/raspidmx/pull/29] +Signed-off-by: Trevor Woerner +--- + .gitignore | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/.gitignore b/.gitignore +index 633f325..4a1ca0c 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -21,5 +21,6 @@ test_pattern/test_pattern + worms/worms + + # other directories ++lib/*.a + + *_/ diff --git a/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0002-add-install-targets-to-Makefiles.patch b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0002-add-install-targets-to-Makefiles.patch new file mode 100644 index 00000000000..c02a7674220 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0002-add-install-targets-to-Makefiles.patch @@ -0,0 +1,214 @@ +From 3b60fa1598385fb36fef1c47f59cb08d3a6fba35 Mon Sep 17 00:00:00 2001 +From: Trevor Woerner +Date: Fri, 4 Dec 2020 01:54:37 -0500 +Subject: [PATCH] add "install" targets to Makefiles + +Upstream-status: submitted [https://github.com/AndrewFromMelbourne/raspidmx/pull/29] +Signed-off-by: Trevor Woerner +--- + Makefile | 3 +++ + game/Makefile | 4 ++++ + lib/Makefile | 1 + + life/Makefile | 4 ++++ + mandelbrot/Makefile | 4 ++++ + offscreen/Makefile | 4 ++++ + pngview/Makefile | 4 ++++ + radar_sweep/Makefile | 4 ++++ + radar_sweep_alpha/Makefile | 4 ++++ + rgb_triangle/Makefile | 4 ++++ + spriteview/Makefile | 4 ++++ + test_pattern/Makefile | 4 ++++ + worms/Makefile | 4 ++++ + 13 files changed, 48 insertions(+) + +diff --git a/Makefile b/Makefile +index 4e14e18..4a06de9 100644 +--- a/Makefile ++++ b/Makefile +@@ -16,6 +16,9 @@ default :all + all: + for target in $(TARGETS); do ($(MAKE) -C $$target); done + ++install: ++ for target in $(TARGETS); do ($(MAKE) -C $$target install); done ++ + clean: + for target in $(TARGETS); do ($(MAKE) -C $$target clean); done + +diff --git a/game/Makefile b/game/Makefile +index ced9cce..6da6a6d 100644 +--- a/game/Makefile ++++ b/game/Makefile +@@ -15,6 +15,10 @@ all: $(BIN) + $(BIN): $(OBJS) + $(CC) -o $@ -Wl,--whole-archive $(OBJS) $(LDFLAGS) -Wl,--no-whole-archive -rdynamic + ++install: $(BIN) ++ install -d $(DESTDIR)/usr/bin ++ install -m 0755 $(BIN) $(DESTDIR)/usr/bin ++ + clean: + @rm -f $(OBJS) + @rm -f $(BIN) +diff --git a/lib/Makefile b/lib/Makefile +index 15d7c37..2765c91 100644 +--- a/lib/Makefile ++++ b/lib/Makefile +@@ -29,6 +29,7 @@ $(LIB): $(OBJS) + $(LIBPNG): $(OBJSPNG) + $(AR) rcs lib$(LIBPNG).a $(OBJSPNG) + ++install: + + clean: + @rm -f $(OBJS) +diff --git a/life/Makefile b/life/Makefile +index 2fcb034..44f1edb 100644 +--- a/life/Makefile ++++ b/life/Makefile +@@ -15,6 +15,10 @@ all: $(BIN) + $(BIN): $(OBJS) + $(CC) -o $@ -Wl,--whole-archive $(OBJS) $(LDFLAGS) -pthread -Wl,--no-whole-archive -rdynamic + ++install: $(BIN) ++ install -d $(DESTDIR)/usr/bin ++ install -m 0755 $(BIN) $(DESTDIR)/usr/bin ++ + clean: + @rm -f $(OBJS) + @rm -f $(BIN) +diff --git a/mandelbrot/Makefile b/mandelbrot/Makefile +index e61beb3..a6e6735 100644 +--- a/mandelbrot/Makefile ++++ b/mandelbrot/Makefile +@@ -15,6 +15,10 @@ all: $(BIN) + $(BIN): $(OBJS) + $(CC) -o $@ -Wl,--whole-archive $(OBJS) $(LDFLAGS) -pthread -Wl,--no-whole-archive -rdynamic + ++install: $(BIN) ++ install -d $(DESTDIR)/usr/bin ++ install -m 0755 $(BIN) $(DESTDIR)/usr/bin ++ + clean: + @rm -f $(OBJS) + @rm -f $(BIN) +diff --git a/offscreen/Makefile b/offscreen/Makefile +index 2bc81b9..8d23354 100644 +--- a/offscreen/Makefile ++++ b/offscreen/Makefile +@@ -15,6 +15,10 @@ all: $(BIN) + $(BIN): $(OBJS) + $(CC) -o $@ -Wl,--whole-archive $(OBJS) $(LDFLAGS) -Wl,--no-whole-archive -rdynamic + ++install: $(BIN) ++ install -d $(DESTDIR)/usr/bin ++ install -m 0755 $(BIN) $(DESTDIR)/usr/bin ++ + clean: + @rm -f $(OBJS) + @rm -f $(BIN) +diff --git a/pngview/Makefile b/pngview/Makefile +index f947320..8c037ec 100644 +--- a/pngview/Makefile ++++ b/pngview/Makefile +@@ -15,6 +15,10 @@ all: $(BIN) + $(BIN): $(OBJS) + $(CC) -o $@ -Wl,--whole-archive $(OBJS) $(LDFLAGS) -Wl,--no-whole-archive -rdynamic + ++install: $(BIN) ++ install -d $(DESTDIR)/usr/bin ++ install -m 0755 $(BIN) $(DESTDIR)/usr/bin ++ + clean: + @rm -f $(OBJS) + @rm -f $(BIN) +diff --git a/radar_sweep/Makefile b/radar_sweep/Makefile +index 3a46150..5f814b7 100644 +--- a/radar_sweep/Makefile ++++ b/radar_sweep/Makefile +@@ -15,6 +15,10 @@ all: $(BIN) + $(BIN): $(OBJS) + $(CC) -o $@ -Wl,--whole-archive $(OBJS) $(LDFLAGS) -Wl,--no-whole-archive -rdynamic + ++install: $(BIN) ++ install -d $(DESTDIR)/usr/bin ++ install -m 0755 $(BIN) $(DESTDIR)/usr/bin ++ + clean: + @rm -f $(OBJS) + @rm -f $(BIN) +diff --git a/radar_sweep_alpha/Makefile b/radar_sweep_alpha/Makefile +index 5680b9b..f66c338 100644 +--- a/radar_sweep_alpha/Makefile ++++ b/radar_sweep_alpha/Makefile +@@ -15,6 +15,10 @@ all: $(BIN) + $(BIN): $(OBJS) + $(CC) -o $@ -Wl,--whole-archive $(OBJS) $(LDFLAGS) -Wl,--no-whole-archive -rdynamic + ++install: $(BIN) ++ install -d $(DESTDIR)/usr/bin ++ install -m 0755 $(BIN) $(DESTDIR)/usr/bin ++ + clean: + @rm -f $(OBJS) + @rm -f $(BIN) +diff --git a/rgb_triangle/Makefile b/rgb_triangle/Makefile +index 2017956..2ce779d 100644 +--- a/rgb_triangle/Makefile ++++ b/rgb_triangle/Makefile +@@ -15,6 +15,10 @@ all: $(BIN) + $(BIN): $(OBJS) + $(CC) -o $@ -Wl,--whole-archive $(OBJS) $(LDFLAGS) -Wl,--no-whole-archive -rdynamic + ++install: $(BIN) ++ install -d $(DESTDIR)/usr/bin ++ install -m 0755 $(BIN) $(DESTDIR)/usr/bin ++ + clean: + @rm -f $(OBJS) + @rm -f $(BIN) +diff --git a/spriteview/Makefile b/spriteview/Makefile +index 2713936..ada9277 100644 +--- a/spriteview/Makefile ++++ b/spriteview/Makefile +@@ -15,6 +15,10 @@ all: $(BIN) + $(BIN): $(OBJS) + $(CC) -o $@ -Wl,--whole-archive $(OBJS) $(LDFLAGS) -Wl,--no-whole-archive -rdynamic + ++install: $(BIN) ++ install -d $(DESTDIR)/usr/bin ++ install -m 0755 $(BIN) $(DESTDIR)/usr/bin ++ + clean: + @rm -f $(OBJS) + @rm -f $(BIN) +diff --git a/test_pattern/Makefile b/test_pattern/Makefile +index be434d9..1e02b0a 100644 +--- a/test_pattern/Makefile ++++ b/test_pattern/Makefile +@@ -15,6 +15,10 @@ all: $(BIN) + $(BIN): $(OBJS) + $(CC) -o $@ -Wl,--whole-archive $(OBJS) $(LDFLAGS) -Wl,--no-whole-archive -rdynamic + ++install: $(BIN) ++ install -d $(DESTDIR)/usr/bin ++ install -m 0755 $(BIN) $(DESTDIR)/usr/bin ++ + clean: + @rm -f $(OBJS) + @rm -f $(BIN) +diff --git a/worms/Makefile b/worms/Makefile +index 2a21a4b..c249c8c 100644 +--- a/worms/Makefile ++++ b/worms/Makefile +@@ -15,6 +15,10 @@ all: $(BIN) + $(BIN): $(OBJS) + $(CC) -o $@ -Wl,--whole-archive $(OBJS) $(LDFLAGS) -Wl,--no-whole-archive -rdynamic + ++install: $(BIN) ++ install -d $(DESTDIR)/usr/bin ++ install -m 0755 $(BIN) $(DESTDIR)/usr/bin ++ + clean: + @rm -f $(OBJS) + @rm -f $(BIN) diff --git a/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0003-switch-to-pkg-config.patch b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0003-switch-to-pkg-config.patch new file mode 100644 index 00000000000..7adb12bb3b4 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0003-switch-to-pkg-config.patch @@ -0,0 +1,114 @@ +From 314fbde187e9187b1b3e18e50dd937c070e93633 Mon Sep 17 00:00:00 2001 +From: Trevor Woerner +Date: Fri, 4 Dec 2020 01:58:59 -0500 +Subject: [PATCH] switch to "pkg-config" + +I get a build error saying: + + ERROR: /usr/bin/libpng16-config should not be used, use an alternative such as pkg-config + +Therefore switch to the more common and more generic "pkg-config" instead of +using a libpng-specific tool for flags and libraries. + +Upstream-status: submitted [https://github.com/AndrewFromMelbourne/raspidmx/pull/29] +Signed-off-by: Trevor Woerner +--- + game/Makefile | 4 ++-- + lib/Makefile | 4 ++-- + mandelbrot/Makefile | 4 ++-- + offscreen/Makefile | 4 ++-- + pngview/Makefile | 4 ++-- + spriteview/Makefile | 4 ++-- + 6 files changed, 12 insertions(+), 12 deletions(-) + +diff --git a/game/Makefile b/game/Makefile +index 6da6a6d..0a90a38 100644 +--- a/game/Makefile ++++ b/game/Makefile +@@ -1,8 +1,8 @@ + OBJS=main.o + BIN=game + +-CFLAGS+=-Wall -g -O3 -I../common $(shell libpng-config --cflags) +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell libpng-config --ldflags) -L../lib -lraspidmx -lraspidmxPng ++CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) ++LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/lib/Makefile b/lib/Makefile +index 2765c91..1e8c759 100644 +--- a/lib/Makefile ++++ b/lib/Makefile +@@ -11,9 +11,9 @@ OBJS=../common/backgroundLayer.o ../common/imageGraphics.o ../common/key.o \ + + OBJSPNG=../common/spriteLayer.o ../common/loadpng.o ../common/savepng.o ../common/scrollingLayer.o + +-CFLAGS+=-Wall -g -O3 -I../common $(shell libpng-config --cflags) ++CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) + LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm +-LDFLAGSPNG=${LDFLAGS} $(shell libpng-config --ldflags) ++LDFLAGSPNG=${LDFLAGS} $(shell pkg-config --libs libpng) + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/mandelbrot/Makefile b/mandelbrot/Makefile +index a6e6735..82910bb 100644 +--- a/mandelbrot/Makefile ++++ b/mandelbrot/Makefile +@@ -1,8 +1,8 @@ + OBJS=main.o mandelbrot.o info.o + BIN=mandelbrot + +-CFLAGS+=-Wall -g -O3 -I../common $(shell libpng-config --cflags) +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell libpng-config --ldflags) -L../lib -lraspidmx -lraspidmxPng ++CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) ++LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/offscreen/Makefile b/offscreen/Makefile +index 8d23354..0120796 100644 +--- a/offscreen/Makefile ++++ b/offscreen/Makefile +@@ -1,8 +1,8 @@ + OBJS=pngresize.o resizeDispmanX.o + BIN=pngresize + +-CFLAGS+=-Wall -g -O3 -I../common $(shell libpng-config --cflags) +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell libpng-config --ldflags) -L../lib -lraspidmx -lraspidmxPng ++CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) ++LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/pngview/Makefile b/pngview/Makefile +index 8c037ec..71a5d76 100644 +--- a/pngview/Makefile ++++ b/pngview/Makefile +@@ -1,8 +1,8 @@ + OBJS=pngview.o + BIN=pngview + +-CFLAGS+=-Wall -g -O3 -I../common $(shell libpng-config --cflags) +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell libpng-config --ldflags) -L../lib -lraspidmx -lraspidmxPng ++CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) ++LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/spriteview/Makefile b/spriteview/Makefile +index ada9277..904c1e8 100644 +--- a/spriteview/Makefile ++++ b/spriteview/Makefile +@@ -1,8 +1,8 @@ + OBJS=spriteview.o + BIN=spriteview + +-CFLAGS+=-Wall -g -O3 -I../common $(shell libpng-config --cflags) +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell libpng-config --ldflags) -L../lib -lraspidmx -lraspidmxPng ++CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) ++LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + diff --git a/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0004-add-libvchostif-to-link.patch b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0004-add-libvchostif-to-link.patch new file mode 100644 index 00000000000..908be62cffa --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0004-add-libvchostif-to-link.patch @@ -0,0 +1,170 @@ +From bde71fc22bde61ef8fe319c60f478ec370f5bc5d Mon Sep 17 00:00:00 2001 +From: Trevor Woerner +Date: Fri, 4 Dec 2020 02:13:39 -0500 +Subject: [PATCH] add libvchostif to link + +I end up with link errors of the type: + + libvchostif.so: error adding symbols: DSO missing from command line + +Which is caused by not having -lvchostif in the link. + +Upstream-status: submitted [https://github.com/AndrewFromMelbourne/raspidmx/pull/29] +Signed-off-by: Trevor Woerner +--- + game/Makefile | 2 +- + life/Makefile | 2 +- + mandelbrot/Makefile | 2 +- + offscreen/Makefile | 2 +- + pngview/Makefile | 2 +- + radar_sweep/Makefile | 2 +- + radar_sweep_alpha/Makefile | 2 +- + rgb_triangle/Makefile | 2 +- + spriteview/Makefile | 2 +- + test_pattern/Makefile | 2 +- + worms/Makefile | 2 +- + 11 files changed, 11 insertions(+), 11 deletions(-) + +diff --git a/game/Makefile b/game/Makefile +index 0a90a38..b756fa2 100644 +--- a/game/Makefile ++++ b/game/Makefile +@@ -2,7 +2,7 @@ OBJS=main.o + BIN=game + + CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/life/Makefile b/life/Makefile +index 44f1edb..2addf69 100644 +--- a/life/Makefile ++++ b/life/Makefile +@@ -2,7 +2,7 @@ OBJS=main.o life.o info.o + BIN=life + + CFLAGS+=-Wall -g -O3 -I../common +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -L../lib -lraspidmx ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -L../lib -lraspidmx + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/mandelbrot/Makefile b/mandelbrot/Makefile +index 82910bb..31097f2 100644 +--- a/mandelbrot/Makefile ++++ b/mandelbrot/Makefile +@@ -2,7 +2,7 @@ OBJS=main.o mandelbrot.o info.o + BIN=mandelbrot + + CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/offscreen/Makefile b/offscreen/Makefile +index 0120796..4f13fd0 100644 +--- a/offscreen/Makefile ++++ b/offscreen/Makefile +@@ -2,7 +2,7 @@ OBJS=pngresize.o resizeDispmanX.o + BIN=pngresize + + CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/pngview/Makefile b/pngview/Makefile +index 71a5d76..cce8d63 100644 +--- a/pngview/Makefile ++++ b/pngview/Makefile +@@ -2,7 +2,7 @@ OBJS=pngview.o + BIN=pngview + + CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/radar_sweep/Makefile b/radar_sweep/Makefile +index 5f814b7..aa1d32c 100644 +--- a/radar_sweep/Makefile ++++ b/radar_sweep/Makefile +@@ -2,7 +2,7 @@ OBJS=radar_sweep.o + BIN=radar_sweep + + CFLAGS+=-Wall -O3 -g -I../common +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm -L../lib -lraspidmx ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm -L../lib -lraspidmx + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/radar_sweep_alpha/Makefile b/radar_sweep_alpha/Makefile +index f66c338..571d47b 100644 +--- a/radar_sweep_alpha/Makefile ++++ b/radar_sweep_alpha/Makefile +@@ -2,7 +2,7 @@ OBJS=radar_sweep_alpha.o + BIN=radar_sweep_alpha + + CFLAGS+=-Wall -O3 -g -I../common +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm -L../lib -lraspidmx ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm -L../lib -lraspidmx + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/rgb_triangle/Makefile b/rgb_triangle/Makefile +index 2ce779d..0266715 100644 +--- a/rgb_triangle/Makefile ++++ b/rgb_triangle/Makefile +@@ -2,7 +2,7 @@ OBJS=rgb_triangle.o + BIN=rgb_triangle + + CFLAGS+=-Wall -O3 -g -I../common +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm -L../lib -lraspidmx ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm -L../lib -lraspidmx + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/spriteview/Makefile b/spriteview/Makefile +index 904c1e8..d2fb3c8 100644 +--- a/spriteview/Makefile ++++ b/spriteview/Makefile +@@ -2,7 +2,7 @@ OBJS=spriteview.o + BIN=spriteview + + CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/test_pattern/Makefile b/test_pattern/Makefile +index 1e02b0a..c231fb6 100644 +--- a/test_pattern/Makefile ++++ b/test_pattern/Makefile +@@ -2,7 +2,7 @@ OBJS=test_pattern.o + BIN=test_pattern + + CFLAGS+=-Wall -g -O3 -I../common +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm -L../lib -lraspidmx ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm -L../lib -lraspidmx + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/worms/Makefile b/worms/Makefile +index c249c8c..3b6c830 100644 +--- a/worms/Makefile ++++ b/worms/Makefile +@@ -2,7 +2,7 @@ OBJS=main.o worms.o + BIN=worms + + CFLAGS+=-Wall -g -O3 -I../common +-LDFLAGS+=-L/opt/vc/lib/ -lbcm_host -lm -L../lib -lraspidmx ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm -L../lib -lraspidmx + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + diff --git a/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0005-change-library-linking-order.patch b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0005-change-library-linking-order.patch new file mode 100644 index 00000000000..ceefd035f86 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0005-change-library-linking-order.patch @@ -0,0 +1,87 @@ +From 07e7b727b7df7fc5bf0e1f296ba136e0653202ea Mon Sep 17 00:00:00 2001 +From: Trevor Woerner +Date: Fri, 4 Dec 2020 03:25:08 -0500 +Subject: [PATCH] change library linking order + +Since -lraspidmxPng requires the png library (libpng), re-arrange the order of +linking so that it succeeds. Otherwise I get errors like the following: + + undefined reference to `png_create_write_struct' + +...as well as undefined references to various other libpng objects. + +Upstream-status: submitted [https://github.com/AndrewFromMelbourne/raspidmx/pull/29] +Signed-off-by: Trevor Woerner +--- + game/Makefile | 2 +- + mandelbrot/Makefile | 2 +- + offscreen/Makefile | 2 +- + pngview/Makefile | 2 +- + spriteview/Makefile | 2 +- + 5 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/game/Makefile b/game/Makefile +index b756fa2..f33916d 100644 +--- a/game/Makefile ++++ b/game/Makefile +@@ -2,7 +2,7 @@ OBJS=main.o + BIN=game + + CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) +-LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm -L../lib -lraspidmx -lraspidmxPng $(shell pkg-config --libs libpng) + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/mandelbrot/Makefile b/mandelbrot/Makefile +index 31097f2..08d1113 100644 +--- a/mandelbrot/Makefile ++++ b/mandelbrot/Makefile +@@ -2,7 +2,7 @@ OBJS=main.o mandelbrot.o info.o + BIN=mandelbrot + + CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) +-LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm -L../lib -lraspidmx -lraspidmxPng $(shell pkg-config --libs libpng) + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/offscreen/Makefile b/offscreen/Makefile +index 4f13fd0..49fc744 100644 +--- a/offscreen/Makefile ++++ b/offscreen/Makefile +@@ -2,7 +2,7 @@ OBJS=pngresize.o resizeDispmanX.o + BIN=pngresize + + CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) +-LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm -L../lib -lraspidmx -lraspidmxPng $(shell pkg-config --libs libpng) + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/pngview/Makefile b/pngview/Makefile +index cce8d63..bd6c154 100644 +--- a/pngview/Makefile ++++ b/pngview/Makefile +@@ -2,7 +2,7 @@ OBJS=pngview.o + BIN=pngview + + CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) +-LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm -L../lib -lraspidmx -lraspidmxPng $(shell pkg-config --libs libpng) + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + +diff --git a/spriteview/Makefile b/spriteview/Makefile +index d2fb3c8..89d9e01 100644 +--- a/spriteview/Makefile ++++ b/spriteview/Makefile +@@ -2,7 +2,7 @@ OBJS=spriteview.o + BIN=spriteview + + CFLAGS+=-Wall -g -O3 -I../common $(shell pkg-config --cflags libpng) +-LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm $(shell pkg-config --libs libpng) -L../lib -lraspidmx -lraspidmxPng ++LDFLAGS+=-L/opt/vc/lib/ -lvchostif -lbcm_host -lm -L../lib -lraspidmx -lraspidmxPng $(shell pkg-config --libs libpng) + + INCLUDES+=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux + diff --git a/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0006-game-Makefile-install-sample-png-files.patch b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0006-game-Makefile-install-sample-png-files.patch new file mode 100644 index 00000000000..dae847dad66 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0006-game-Makefile-install-sample-png-files.patch @@ -0,0 +1,24 @@ +From 1868a111450be0053ab124df501cfcb7542f5e77 Mon Sep 17 00:00:00 2001 +From: Trevor Woerner +Date: Fri, 4 Dec 2020 03:47:17 -0500 +Subject: [PATCH] game/Makefile: install sample png files + +Upstream-status: submitted [https://github.com/AndrewFromMelbourne/raspidmx/pull/29] +Signed-off-by: Trevor Woerner +--- + game/Makefile | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/game/Makefile b/game/Makefile +index f33916d..d007972 100644 +--- a/game/Makefile ++++ b/game/Makefile +@@ -18,6 +18,8 @@ $(BIN): $(OBJS) + install: $(BIN) + install -d $(DESTDIR)/usr/bin + install -m 0755 $(BIN) $(DESTDIR)/usr/bin ++ install -d $(DESTDIR)/usr/share/raspidmx ++ install -m 444 spotlight.png sprite.png texture.png $(DESTDIR)/usr/share/raspidmx + + clean: + @rm -f $(OBJS) diff --git a/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0007-Makefile-reorganize.patch b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0007-Makefile-reorganize.patch new file mode 100644 index 00000000000..b5c743e549c --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx/0007-Makefile-reorganize.patch @@ -0,0 +1,57 @@ +From f195ffffb133c9cda88d5eac41c0f584fd4540c9 Mon Sep 17 00:00:00 2001 +From: Trevor Woerner +Date: Fri, 4 Dec 2020 03:48:36 -0500 +Subject: [PATCH] Makefile: reorganize + +Reorganize the main Makefile in order to: +1. be able to build in parallel +2. have build failures in subdirectories stop the build + +Now the "-j <#threads>" option can be used with 'make'. + +Also, if a build failure occurs in a subdirectory, this new arrangement will +cause the build to stop and fail instead of silently ignoring it. + +To build simply invoke 'make' with or without a -j option. +To install simply invoke: make TARGET=install +To clean simply invoke: make TARGET=clean + +Upstream-status: submitted [https://github.com/AndrewFromMelbourne/raspidmx/pull/29] +Signed-off-by: Trevor Woerner +--- + Makefile | 19 +++++++------------ + 1 file changed, 7 insertions(+), 12 deletions(-) + +diff --git a/Makefile b/Makefile +index 4a06de9..1f9f7c4 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,5 +1,4 @@ +-TARGETS=lib \ +- life \ ++TARGETS=life \ + mandelbrot \ + offscreen \ + pngview \ +@@ -10,15 +9,11 @@ TARGETS=lib \ + spriteview \ + test_pattern \ + worms ++.PHONY: all lib install clean $(TARGETS) + +-default :all +- +-all: +- for target in $(TARGETS); do ($(MAKE) -C $$target); done +- +-install: +- for target in $(TARGETS); do ($(MAKE) -C $$target install); done +- +-clean: +- for target in $(TARGETS); do ($(MAKE) -C $$target clean); done ++all: $(TARGETS) + ++$(TARGETS): lib ++ $(MAKE) -C $@ $(TARGET) ++lib: ++ $(MAKE) -C $@ $(TARGET) diff --git a/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx_git.bb b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx_git.bb new file mode 100644 index 00000000000..1a1ecfa595a --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/raspidmx/raspidmx_git.bb @@ -0,0 +1,31 @@ +SUMMARY = "Some examples using the DispmanX API on the Raspberry Pi" +HOMEPAGE = "https://github.com/AndrewFromMelbourne/raspidmx" +SECTION = "graphics" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=52962875ab02c36df6cde47b1f463024" + +COMPATIBLE_HOST = "null" +COMPATIBLE_HOST_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', 'null', '(.*)', d)}" + +SRC_URI = "git://github.com/AndrewFromMelbourne/raspidmx;protocol=https;branch=master \ + file://0001-gitignore-add-archives-from-lib-directory.patch \ + file://0002-add-install-targets-to-Makefiles.patch \ + file://0003-switch-to-pkg-config.patch \ + file://0004-add-libvchostif-to-link.patch \ + file://0005-change-library-linking-order.patch \ + file://0006-game-Makefile-install-sample-png-files.patch \ + file://0007-Makefile-reorganize.patch \ + " + +PV = "0.0+git${SRCPV}" +SRCREV = "e2ee6faa0d01a5ece06bcc74a47f37d7e6837310" + +S = "${WORKDIR}/git" + +inherit pkgconfig + +DEPENDS += "libpng userland" + +do_install () { + oe_runmake 'DESTDIR=${D}' 'TARGET=install' +} diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0001-Allow-applications-to-set-next-resource-handle.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0001-Allow-applications-to-set-next-resource-handle.patch new file mode 100644 index 00000000000..295309c4d32 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0001-Allow-applications-to-set-next-resource-handle.patch @@ -0,0 +1,205 @@ +From 8a734f44beea9b10548ba696eaea1f5a76148fd5 Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Tue, 9 Jul 2013 09:26:26 -0400 +Subject: [PATCH] Allow applications to set next resource handle + +This patch adds provisions in userland to +let apps callers set the next rendereing dispmanx resource. +It's useful for implementing, say, a buffer carousel. +--- + interface/khronos/common/khrn_client_rpc.h | 2 ++ + interface/khronos/common/khrn_int_ids.h | 2 ++ + interface/khronos/egl/egl_client.c | 30 +++++++++++++++++++--- + interface/khronos/egl/egl_client_surface.c | 24 ++++++++++++++++- + interface/khronos/egl/egl_client_surface.h | 3 ++- + interface/khronos/egl/egl_int_impl.h | 5 ++-- + 6 files changed, 59 insertions(+), 7 deletions(-) + +diff --git a/interface/khronos/common/khrn_client_rpc.h b/interface/khronos/common/khrn_client_rpc.h +index dc4351d..10ea060 100644 +--- a/interface/khronos/common/khrn_client_rpc.h ++++ b/interface/khronos/common/khrn_client_rpc.h +@@ -685,6 +685,7 @@ static INLINE void rpc_call12_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id + static INLINE void rpc_call13_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); } + static INLINE void rpc_call14_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, uint32_t p12, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); } + static INLINE void rpc_call15_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, uint32_t p12, uint32_t p13, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); } ++static INLINE void rpc_call16_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, uint32_t p12, uint32_t p13, uint32_t p14, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); } + #endif + + #define RPC_CALL1_OUT_CTRL(fn, thread, id, out) rpc_call1_out_ctrl(thread, id, out) +@@ -702,6 +703,7 @@ static INLINE void rpc_call15_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id + #define RPC_CALL13_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, out) rpc_call13_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, out) + #define RPC_CALL14_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, out) rpc_call14_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, out) + #define RPC_CALL15_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, out) rpc_call15_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, out) ++#define RPC_CALL16_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, out) rpc_call16_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, out) + + # if !defined(__SYMBIAN32__) //use functions defined in khrpc.cpp + static INLINE uint32_t rpc_call1_out_ctrl_res(CLIENT_THREAD_STATE_T *thread,uint32_t id, void *out) { uint32_t res; rpc_begin(thread); RPC_CALL(thread, id); res = rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_RES | RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); return res; } +diff --git a/interface/khronos/common/khrn_int_ids.h b/interface/khronos/common/khrn_int_ids.h +index 8378f4a..ec961e0 100644 +--- a/interface/khronos/common/khrn_int_ids.h ++++ b/interface/khronos/common/khrn_int_ids.h +@@ -367,6 +367,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + #define EGLINTCREATESURFACE_ID 0x4000 ++#define EGLINTCREATESURFACE_ID_V2 0x4100 + #define EGLINTCREATEGLES11_ID 0x4001 + #define EGLINTCREATEGLES20_ID 0x4002 + #define EGLINTCREATEVG_ID 0x4003 +@@ -377,6 +378,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #define EGLINTMAKECURRENT_ID 0x4008 + #define EGLINTFLUSHANDWAIT_ID 0x4009 + #define EGLINTSWAPBUFFERS_ID 0x400a ++#define EGLINTSWAPBUFFERS_ID_V2 0x410a + #define EGLINTSELECTMIPMAP_ID 0x400b + #define EGLINTFLUSH_ID 0x400c + #define EGLINTGETCOLORDATA_ID 0x400d +diff --git a/interface/khronos/egl/egl_client.c b/interface/khronos/egl/egl_client.c +index 9d617c8..b8bb374 100644 +--- a/interface/khronos/egl/egl_client.c ++++ b/interface/khronos/egl/egl_client.c +@@ -162,6 +162,17 @@ static void egl_current_release(CLIENT_PROCESS_STATE_T *process, EGL_CURRENT_T * + void egl_gl_flush_callback(bool wait); + void egl_vg_flush_callback(bool wait); + ++#include "interface/vmcs_host/vc_dispmanx_types.h" ++/**HACKHACK - give us the ability to inject a DispmanX ++ * resource handle into the CreateWindowSurface and ++ * SwapBuffers calls */ ++static DISPMANX_RESOURCE_HANDLE_T next_resource_handle; ++ ++EGLAPI EGLBoolean EGLAPIENTRY eglSetNextResourceHandle(DISPMANX_RESOURCE_HANDLE_T handle) ++{ ++ next_resource_handle = handle; ++} ++ + /* + TODO: do an RPC call to make sure the Khronos vll is loaded (and that it stays loaded until eglTerminate) + Also affects global image (and possibly others?) +@@ -644,7 +655,8 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig c + false, + EGL_NO_TEXTURE, + EGL_NO_TEXTURE, +- 0, 0); ++ 0, 0, ++ next_resource_handle); + + if (surface) { + if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { +@@ -889,7 +901,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig + mipmap_texture, + texture_format, + texture_target, +- 0, 0); ++ 0, 0, 0); + + if (surface) { + if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { +@@ -1031,7 +1043,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig c + false, + EGL_NO_TEXTURE, + EGL_NO_TEXTURE, +- pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle); ++ pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle, 0); + + if (surface) { + if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { +@@ -2303,6 +2315,18 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + + vcos_log_trace("eglSwapBuffers server call"); + ++ if (next_resource_handle) ++ RPC_CALL7(eglIntSwapBuffers_impl, ++ thread, ++ EGLINTSWAPBUFFERS_ID_V2, ++ RPC_UINT(surface->serverbuffer), ++ RPC_UINT(surface->width), ++ RPC_UINT(surface->height), ++ RPC_UINT(surface->internal_handle), ++ RPC_UINT(surface->swap_behavior == EGL_BUFFER_PRESERVED ? 1 : 0), ++ RPC_UINT(khrn_platform_get_window_position(surface->win)), ++ RPC_INT(next_resource_handle)); ++ else + RPC_CALL6(eglIntSwapBuffers_impl, + thread, + EGLINTSWAPBUFFERS_ID, +diff --git a/interface/khronos/egl/egl_client_surface.c b/interface/khronos/egl/egl_client_surface.c +index 6846dfa..128325e 100644 +--- a/interface/khronos/egl/egl_client_surface.c ++++ b/interface/khronos/egl/egl_client_surface.c +@@ -314,7 +314,8 @@ EGL_SURFACE_T *egl_surface_create( + EGLenum texture_format, + EGLenum texture_target, + EGLNativePixmapType pixmap, +- const uint32_t *pixmap_server_handle) ++ const uint32_t *pixmap_server_handle, ++ DISPMANX_RESOURCE_HANDLE_T next_resource_handle) + { + KHRN_IMAGE_FORMAT_T color; + KHRN_IMAGE_FORMAT_T depth; +@@ -473,6 +474,27 @@ EGL_SURFACE_T *egl_surface_create( + #endif + uint32_t results[3]; + ++ if (next_resource_handle) ++ RPC_CALL16_OUT_CTRL(eglIntCreateSurface_impl, ++ thread, ++ EGLINTCREATESURFACE_ID_V2, ++ RPC_UINT(serverwin), ++ RPC_UINT(buffers), ++ RPC_UINT(width), ++ RPC_UINT(height), ++ RPC_UINT(color), ++ RPC_UINT(depth), ++ RPC_UINT(mask), ++ RPC_UINT(multi), ++ RPC_UINT(largest_pbuffer), ++ RPC_UINT(mipmap_texture), ++ RPC_UINT(config_depth_bits), ++ RPC_UINT(config_stencil_bits), ++ RPC_UINT(sem_name), ++ RPC_UINT(type), ++ RPC_INT(next_resource_handle), ++ results); ++ else + RPC_CALL15_OUT_CTRL(eglIntCreateSurface_impl, + thread, + EGLINTCREATESURFACE_ID, +diff --git a/interface/khronos/egl/egl_client_surface.h b/interface/khronos/egl/egl_client_surface.h +index c99d44c..b5bf70a 100644 +--- a/interface/khronos/egl/egl_client_surface.h ++++ b/interface/khronos/egl/egl_client_surface.h +@@ -322,7 +322,8 @@ extern EGL_SURFACE_T *egl_surface_create( + EGLenum texture_format, + EGLenum texture_target, + EGLNativePixmapType pixmap, +- const uint32_t *pixmap_server_handle); ++ const uint32_t *pixmap_server_handle, ++ DISPMANX_RESOURCE_HANDLE_T next_resource_handle); + extern EGL_SURFACE_T *egl_surface_from_vg_image( + VGImage vg_handle, + EGLSurface name, +diff --git a/interface/khronos/egl/egl_int_impl.h b/interface/khronos/egl/egl_int_impl.h +index 8a5734c..51b3580 100644 +--- a/interface/khronos/egl/egl_int_impl.h ++++ b/interface/khronos/egl/egl_int_impl.h +@@ -56,7 +56,8 @@ FN(int, eglIntCreateSurface_impl, ( + uint32_t config_stencil_bits, + uint32_t sem, + uint32_t type, +- uint32_t *results)) ++ uint32_t *results, ++ DISPMANX_RESOURCE_HANDLE_T next_resource_handle)) + + FN(int, eglIntCreatePbufferFromVGImage_impl, ( + VGImage vg_handle, +@@ -110,7 +111,7 @@ FN(void, eglIntMakeCurrent_impl, (uint32_t pid_0, uint32_t pid_1, uint32_t glver + FN(int, eglIntFlushAndWait_impl, (uint32_t flushgl, uint32_t flushvg)) + FN(void, eglIntFlush_impl, (uint32_t flushgl, uint32_t flushvg)) + +-FN(void, eglIntSwapBuffers_impl, (EGL_SURFACE_ID_T s, uint32_t width, uint32_t height, uint32_t handle, uint32_t preserve, uint32_t position)) ++FN(void, eglIntSwapBuffers_impl, (EGL_SURFACE_ID_T s, uint32_t width, uint32_t height, uint32_t handle, uint32_t preserve, uint32_t position, DISPMANX_RESOURCE_HANDLE_T new_back_buffer)) + FN(void, eglIntSelectMipmap_impl, (EGL_SURFACE_ID_T s, int level)) + + FN(void, eglIntGetColorData_impl, (EGL_SURFACE_ID_T s, KHRN_IMAGE_FORMAT_T format, uint32_t width, uint32_t height, int32_t stride, uint32_t y_offset, void *data)) diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0002-wayland-Add-support-for-the-Wayland-winsys.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0002-wayland-Add-support-for-the-Wayland-winsys.patch new file mode 100644 index 00000000000..7945bfff941 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0002-wayland-Add-support-for-the-Wayland-winsys.patch @@ -0,0 +1,1891 @@ +From 3c1566e9c3b356cfcd8327fed0e537ed978c8e78 Mon Sep 17 00:00:00 2001 +From: Tomeu Vizoso +Date: Tue, 1 Oct 2013 13:19:20 +0200 +Subject: [PATCH] wayland: Add support for the Wayland winsys + +* Adds EGL_WL_bind_wayland_display extension +* Adds wayland-egl library +* Adds wl_dispmanx_buffer protocol extension + +TODO: Check that platform_get_dimensions() returning swapchain_count == 1 is correct + +TODO: Remove the requirement of passing a valid DispmanX element handle to +the SwapBuffers and CreateSurface RPC calls. This will remove the need to open +a DispmanX display from the clients. + +TODO: wl_dispmanx_server_buffer should probably be defined in a +private header that can be included from EGL and vc_* instead of in +vc_vchi_dispmanx.h + +Signed-off-by: Khem Raj +--- + .gitignore | 1 + + CMakeLists.txt | 11 + + README.md | 4 + + buildme | 10 +- + .../linux/apps/raspicam/CMakeLists.txt | 2 +- + interface/khronos/CMakeLists.txt | 54 +++- + interface/khronos/common/khrn_client.c | 15 ++ + interface/khronos/common/khrn_client.h | 10 + + interface/khronos/common/khrn_client_mangle.h | 3 + + .../khronos/common/khrn_client_platform.h | 8 + + .../khronos/common/khrn_client_unmangle.h | 3 + + .../common/linux/khrn_client_platform_linux.c | 115 +++++++- + interface/khronos/common/linux/khrn_wayland.c | 215 +++++++++++++++ + .../common/linux/khrn_wayland.h} | 46 +--- + interface/khronos/egl/egl_client.c | 92 +++++-- + interface/khronos/egl/egl_client_get_proc.c | 11 + + interface/khronos/egl/egl_client_surface.c | 42 ++- + interface/khronos/egl/egl_client_surface.h | 38 ++- + interface/khronos/egl/egl_int_impl.h | 2 +- + interface/khronos/ext/egl_wayland.c | 246 ++++++++++++++++++ + interface/khronos/include/EGL/eglext.h | 23 ++ + .../khronos/wayland-egl/wayland-egl-priv.h | 53 ++++ + interface/khronos/wayland-egl/wayland-egl.c | 59 +++++ + .../khronos/wayland-egl/wayland-egl.pc.in | 10 + + interface/vmcs_host/CMakeLists.txt | 13 +- + interface/vmcs_host/vc_dispmanx.h | 10 + + interface/vmcs_host/vc_vchi_dispmanx.c | 42 +++ + interface/vmcs_host/vc_vchi_dispmanx.h | 15 ++ + interface/wayland/dispmanx.xml | 123 +++++++++ + makefiles/cmake/Wayland.cmake | 72 +++++ + 30 files changed, 1253 insertions(+), 95 deletions(-) + create mode 100644 interface/khronos/common/linux/khrn_wayland.c + copy interface/{vmcs_host/vc_vchi_dispmanx.h => khronos/common/linux/khrn_wayland.h} (56%) + create mode 100644 interface/khronos/ext/egl_wayland.c + create mode 100644 interface/khronos/wayland-egl/wayland-egl-priv.h + create mode 100644 interface/khronos/wayland-egl/wayland-egl.c + create mode 100644 interface/khronos/wayland-egl/wayland-egl.pc.in + create mode 100644 interface/wayland/dispmanx.xml + create mode 100644 makefiles/cmake/Wayland.cmake + +diff --git a/.gitignore b/.gitignore +index 63570f1..1459436 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -30,3 +30,4 @@ build/ + *.pts + *.ppm + *.mkv ++*~ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index fe67fc8..80337b2 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -24,6 +24,17 @@ include(makefiles/cmake/global_settings.cmake) + include(makefiles/cmake/arm-linux.cmake) + include(makefiles/cmake/vmcs.cmake) + ++if (BUILD_WAYLAND) ++ include(makefiles/cmake/Wayland.cmake) ++ ++ # Find Wayland libraries ++ find_package(PkgConfig) ++ pkg_check_modules(WAYLAND_CLIENT wayland-client REQUIRED) ++ pkg_check_modules(WAYLAND_SERVER wayland-server REQUIRED) ++ ++ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_WAYLAND") ++endif() ++ + enable_language(ASM) + + # Global include paths +diff --git a/README.md b/README.md +index 404e4d4..97a6b8f 100644 +--- a/README.md ++++ b/README.md +@@ -8,3 +8,7 @@ https://github.com/raspberrypi/tools/tree/master/arm-bcm2708/gcc-linaro-arm-linu + Whilst 64-bit userspace is not officially supported, some of the libraries will work for it. To cross compile, install gcc-aarch64-linux-gnu and g++-aarch64-linux-gnu first. For both native and cross compiles, add the option ```--aarch64``` to the buildme command. + + Note that this repository does not contain the source for the edidparser and vcdbg binaries due to licensing restrictions. ++ ++To build support for the Wayland winsys in EGL, execute the buildme script like this: ++ ++$ BUILD_WAYLAND=1 ./buildme. +diff --git a/buildme b/buildme +index 9e2d405..7b8c0d6 100755 +--- a/buildme ++++ b/buildme +@@ -17,6 +17,10 @@ fi + + BUILDSUBDIR=`echo $BUILDTYPE | tr '[A-Z]' '[a-z]'`; + ++if [ -n "$BUILD_WAYLAND" ]; then ++ WAYLAND_VARS="-DBUILD_WAYLAND=TRUE" ++fi ++ + if [ $ARCH = "armv6l" ] || [ $ARCH = "armv7l" ] || [ $ARCH = "aarch64" ]; then + # Native compile on the Raspberry Pi + mkdir -p build/raspberry/$BUILDSUBDIR +@@ -41,9 +45,13 @@ elif [ "$1" = "--native" ]; then + make -j `nproc` $* + else + # Cross compile on a more capable machine ++ if [ -n "$BUILD_WAYLAND" ]; then ++ # Use wayland-scanner from the build platform ++ WAYLAND_VARS+=" -DWAYLAND_SCANNER_EXECUTABLE:FILEPATH=/usr/bin/wayland-scanner" ++ fi + mkdir -p build/arm-linux/$BUILDSUBDIR + pushd build/arm-linux/$BUILDSUBDIR +- cmake -DCMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN_FILE -DCMAKE_BUILD_TYPE=$BUILDTYPE -DARM64=$ARM64 ../../.. ++ cmake -DCMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN_FILE -DCMAKE_BUILD_TYPE=$BUILDTYPE -DARM64=$ARM64 $WAYLAND_VARS ../../.. + make -j `nproc` + + if [ "$1" != "" ]; then +diff --git a/host_applications/linux/apps/raspicam/CMakeLists.txt b/host_applications/linux/apps/raspicam/CMakeLists.txt +index eb1ef7c..5aeeb2e 100644 +--- a/host_applications/linux/apps/raspicam/CMakeLists.txt ++++ b/host_applications/linux/apps/raspicam/CMakeLists.txt +@@ -61,7 +61,7 @@ add_executable(raspivid ${COMMON_SOURCES} RaspiVid.c) + add_executable(raspividyuv ${COMMON_SOURCES} RaspiVidYUV.c) + + set (MMAL_LIBS mmal_core mmal_util mmal_vc_client) +-target_link_libraries(raspistill ${MMAL_LIBS} vcos bcm_host ${EGL_LIBS} m dl) ++target_link_libraries(raspistill ${MMAL_LIBS} vcos bcm_host ${EGL_LIBS} m dl ${WAYLAND_SERVER_LIBRARIES} ${WAYLAND_CLIENT_LIBRARIES}) + target_link_libraries(raspiyuv ${MMAL_LIBS} vcos bcm_host m) + target_link_libraries(raspivid ${MMAL_LIBS} vcos bcm_host m) + target_link_libraries(raspividyuv ${MMAL_LIBS} vcos bcm_host m) +diff --git a/interface/khronos/CMakeLists.txt b/interface/khronos/CMakeLists.txt +index 9ad615b..95c0e11 100644 +--- a/interface/khronos/CMakeLists.txt ++++ b/interface/khronos/CMakeLists.txt +@@ -6,6 +6,12 @@ + # have quite a few circular dependencies, and so the only way + # to make it work seems to be to have everything static. + ++if (BUILD_WAYLAND) ++include_directories( ++ ${WAYLAND_SERVER_INCLUDE_DIRS} ++) ++endif () ++ + set(EGL_SOURCE + egl/egl_client_config.c + egl/egl_client_context.c +@@ -55,12 +61,55 @@ set(CLIENT_SOURCE + common/khrn_int_hash_asm.s + common/khrn_client_cache.c) + ++set(EGL_LIBS ++ khrn_client ++ vchiq_arm ++ vcos ++ bcm_host) ++ ++if (BUILD_WAYLAND) ++ set(EGL_SOURCE ++ ${EGL_SOURCE} ++ ext/egl_wayland.c ++ common/linux/khrn_wayland.c) ++ ++ set(EGL_LIBS ++ ${EGL_LIBS} ++ wayland-client ++ wayland-server) ++ ++ set(WAYLAND_EGL_SOURCE ++ wayland-egl/wayland-egl.c) ++ ++ wayland_add_protocol_server( ++ EGL_SOURCE ++ ../../interface/wayland/dispmanx.xml ++ dispmanx ++ ) ++ ++ wayland_add_protocol_client( ++ EGL_SOURCE ++ ../../interface/wayland/dispmanx.xml ++ dispmanx ++ ) ++ ++ add_library(wayland-egl ${SHARED} ${WAYLAND_EGL_SOURCE}) ++ install(TARGETS wayland-egl DESTINATION lib) ++ ++ configure_file ("wayland-egl/wayland-egl.pc.in" "wayland-egl/wayland-egl.pc" @ONLY) ++ install (FILES "${CMAKE_CURRENT_BINARY_DIR}/wayland-egl/wayland-egl.pc" ++ DESTINATION lib/pkgconfig) ++endif () ++ + add_library(EGL ${SHARED} ${EGL_SOURCE}) + add_library(GLESv2 ${SHARED} ${GLES_SOURCE}) + add_library(OpenVG ${SHARED} ${VG_SOURCE}) + add_library(WFC ${SHARED} ${WFC_SOURCE}) + add_library(khrn_client ${CLIENT_SOURCE}) + ++set_target_properties(EGL PROPERTIES SOVERSION 1 VERSION 1.0.0) ++set_target_properties(GLESv2 PROPERTIES SOVERSION 2 VERSION 2.0.0) ++ + # TODO do we need EGL_static and GLESv2_static now that khrn_static exists? + add_library(EGL_static STATIC ${EGL_SOURCE}) + add_library(GLESv2_static STATIC ${GLES_SOURCE}) +@@ -72,8 +121,7 @@ include_directories (../../host_applications/linux/libs/sm ) + set(VCSM_LIBS vcsm) + add_definitions(-DKHRONOS_HAVE_VCSM) + endif() +- +-target_link_libraries(EGL khrn_client vchiq_arm vcos bcm_host ${VCSM_LIBS} -lm) ++target_link_libraries(EGL ${EGL_LIBS} ${VCSM_LIBS} -lm) + target_link_libraries(GLESv2 EGL khrn_client vcos) + target_link_libraries(WFC EGL) + target_link_libraries(OpenVG EGL) +@@ -87,7 +135,7 @@ add_library(brcmGLESv2 ${SHARED} ${GLES_SOURCE}) + add_library(brcmOpenVG ${SHARED} ${VG_SOURCE}) + add_library(brcmWFC ${SHARED} ${WFC_SOURCE}) + +-target_link_libraries(brcmEGL khrn_client vchiq_arm vcos bcm_host ${VCSM_LIBS} -lm) ++target_link_libraries(brcmEGL ${EGL_LIBS} ${VCSM_LIBS} -lm) + target_link_libraries(brcmGLESv2 brcmEGL khrn_client vcos) + target_link_libraries(brcmWFC brcmEGL) + target_link_libraries(brcmOpenVG brcmEGL) +diff --git a/interface/khronos/common/khrn_client.c b/interface/khronos/common/khrn_client.c +index ef4babd..d7e798e 100644 +--- a/interface/khronos/common/khrn_client.c ++++ b/interface/khronos/common/khrn_client.c +@@ -54,6 +54,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "applications/vmcs/khronos/khronos_server.h" + #endif + ++#ifdef BUILD_WAYLAND ++#include "interface/khronos/common/linux/khrn_wayland.h" ++#endif ++ + VCOS_LOG_CAT_T khrn_client_log = VCOS_LOG_INIT("khrn_client", VCOS_LOG_WARN); + + /* +@@ -142,6 +146,10 @@ void client_try_unload_server(CLIENT_PROCESS_STATE_T *process) + bool client_process_state_init(CLIENT_PROCESS_STATE_T *process) + { + if (!process->inited) { ++#ifdef BUILD_WAYLAND ++ process->wl_global = NULL; ++#endif ++ + if (!khrn_pointer_map_init(&process->contexts, 64)) + return false; + +@@ -194,6 +202,13 @@ bool client_process_state_init(CLIENT_PROCESS_STATE_T *process) + } + #endif + ++#ifdef BUILD_WAYLAND ++ struct wl_display *wl_display = khrn_platform_get_wl_display(); ++ if (wl_display) ++ if (!init_process_wayland(process)) ++ return false; ++#endif ++ + process->inited = true; + } + +diff --git a/interface/khronos/common/khrn_client.h b/interface/khronos/common/khrn_client.h +index 804039b..615f7b4 100644 +--- a/interface/khronos/common/khrn_client.h ++++ b/interface/khronos/common/khrn_client.h +@@ -310,6 +310,16 @@ struct CLIENT_PROCESS_STATE { + #ifdef RPC_LIBRARY + KHRONOS_SERVER_CONNECTION_T khrn_connection; + #endif ++ ++#ifdef BUILD_WAYLAND ++ /* Client-side Wayland state */ ++ struct wl_registry *wl_registry; ++ struct wl_dispmanx *wl_dispmanx; ++ struct wl_event_queue *wl_queue; ++ ++ /* Compositor-side Wayland state */ ++ struct wl_global *wl_global; ++#endif + }; + + extern bool client_process_state_init(CLIENT_PROCESS_STATE_T *process); +diff --git a/interface/khronos/common/khrn_client_mangle.h b/interface/khronos/common/khrn_client_mangle.h +index b3c04f4..b7b21c5 100644 +--- a/interface/khronos/common/khrn_client_mangle.h ++++ b/interface/khronos/common/khrn_client_mangle.h +@@ -83,6 +83,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #define eglReleaseGlobalImageBRCM mangled_eglReleaseGlobalImageBRCM + #define eglInitGlobalImageBRCM mangled_eglInitGlobalImageBRCM + #define eglTermGlobalImageBRCM mangled_eglTermGlobalImageBRCM ++#define eglBindWaylandDisplayWL mangled_eglBindWaylandDisplayWL ++#define eglUnbindWaylandDisplayWL mangled_eglUnbindWaylandDisplayWL ++#define eglQueryWaylandBufferWL mangled_eglQueryWaylandBufferWL + + /* OpenGL ES 1.1 and 2.0 functions */ + +diff --git a/interface/khronos/common/khrn_client_platform.h b/interface/khronos/common/khrn_client_platform.h +index 1c9da3a..715c67e 100644 +--- a/interface/khronos/common/khrn_client_platform.h ++++ b/interface/khronos/common/khrn_client_platform.h +@@ -48,6 +48,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "interface/khronos/common/vcos/khrn_client_platform_filler_vcos.h" + #endif + ++#ifdef BUILD_WAYLAND ++#include ++#endif ++ + #ifdef __cplusplus + extern "C" { + #endif +@@ -328,4 +332,8 @@ typedef struct + + void *platform_wfc_bounce_thread(void *param); + ++#ifdef BUILD_WAYLAND ++struct wl_display *khrn_platform_get_wl_display(); ++#endif ++ + #endif // KHRN_CLIENT_PLATFORM_H +diff --git a/interface/khronos/common/khrn_client_unmangle.h b/interface/khronos/common/khrn_client_unmangle.h +index 4f3ce49..84f6ec0 100644 +--- a/interface/khronos/common/khrn_client_unmangle.h ++++ b/interface/khronos/common/khrn_client_unmangle.h +@@ -83,6 +83,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #undef eglReleaseGlobalImageBRCM + #undef eglInitGlobalImageBRCM + #undef eglTermGlobalImageBRCM ++#undef eglBindWaylandDisplayWL ++#undef eglUnbindWaylandDisplayWL ++#undef eglQueryWaylandBufferWL + + /* OpenGL ES 1.1 and 2.0 functions */ + +diff --git a/interface/khronos/common/linux/khrn_client_platform_linux.c b/interface/khronos/common/linux/khrn_client_platform_linux.c +index 710d20f..50d60a6 100644 +--- a/interface/khronos/common/linux/khrn_client_platform_linux.c ++++ b/interface/khronos/common/linux/khrn_client_platform_linux.c +@@ -37,6 +37,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "X11/Xlib.h" + #endif + ++#ifdef BUILD_WAYLAND ++#include ++#include "interface/khronos/wayland-egl/wayland-egl-priv.h" ++#endif ++ + extern VCOS_LOG_CAT_T khrn_client_log; + + extern void vc_vchi_khronos_init(); +@@ -464,13 +469,36 @@ EGLDisplay khrn_platform_set_display_id(EGLNativeDisplayType display_id) + return EGL_NO_DISPLAY; + } + #else ++ ++#ifdef BUILD_WAYLAND ++static struct wl_display *hacky_display = NULL; ++#endif ++ + EGLDisplay khrn_platform_set_display_id(EGLNativeDisplayType display_id) + { + if (display_id == EGL_DEFAULT_DISPLAY) + return (EGLDisplay)1; +- else +- return EGL_NO_DISPLAY; ++ else { ++#ifdef BUILD_WAYLAND ++ void *first_pointer = *(void **) display_id; ++ ++ /* wl_display is a wl_proxy, which is a wl_object. ++ * wl_object's first element points to the interfacetype. */ ++ if (first_pointer == &wl_display_interface) { ++ hacky_display = (struct wl_display*)display_id; ++ return (EGLDisplay)1; ++ } else ++#endif ++ return EGL_NO_DISPLAY; ++ } + } ++ ++#ifdef BUILD_WAYLAND ++struct wl_display *khrn_platform_get_wl_display() ++{ ++ return hacky_display; ++} ++#endif + #endif + + #ifdef WANT_X +@@ -805,22 +833,81 @@ static EGL_DISPMANX_WINDOW_T *check_default(EGLNativeWindowType win) + void platform_get_dimensions(EGLDisplay dpy, EGLNativeWindowType win, + uint32_t *width, uint32_t *height, uint32_t *swapchain_count) + { +- EGL_DISPMANX_WINDOW_T *dwin = check_default(win); +- vcos_assert(dwin); +- vcos_assert(dwin->width < 1<<16); // sanity check +- vcos_assert(dwin->height < 1<<16); // sanity check +- *width = dwin->width; +- *height = dwin->height; +- *swapchain_count = 0; ++#ifdef BUILD_WAYLAND ++ if(khrn_platform_get_wl_display()) { ++ struct wl_egl_window *wl_egl_window = (struct wl_egl_window*)win; ++ *width = wl_egl_window->width; ++ *height = wl_egl_window->height; ++ /* This seems to be used for sync'ing with the VC on buffer creation, but ++ we are managing them on the CPU side */ ++ *swapchain_count = 1; ++ } else { ++#endif ++ EGL_DISPMANX_WINDOW_T *dwin = check_default(win); ++ vcos_assert(dwin); ++ vcos_assert(dwin->width < 1<<16); // sanity check ++ vcos_assert(dwin->height < 1<<16); // sanity check ++ *width = dwin->width; ++ *height = dwin->height; ++ *swapchain_count = 0; ++#ifdef BUILD_WAYLAND ++ } ++#endif + } + ++#ifdef BUILD_WAYLAND ++static DISPMANX_ELEMENT_HANDLE_T create_dummy_element() ++{ ++ DISPMANX_DISPLAY_HANDLE_T display = vc_dispmanx_display_open(0); ++ DISPMANX_UPDATE_HANDLE_T update = vc_dispmanx_update_start(0); ++ DISPMANX_ELEMENT_HANDLE_T element; ++ VC_DISPMANX_ALPHA_T alpha = {DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS, 255, 0}; ++ VC_RECT_T src_rect; ++ VC_RECT_T dst_rect; ++ ++ src_rect.x = 0; ++ src_rect.y = 0; ++ src_rect.width = 1 << 16; ++ src_rect.height = 1 << 16; ++ ++ dst_rect.x = 0; ++ dst_rect.y = 0; ++ dst_rect.width = 1; ++ dst_rect.height = 1; ++ ++ element = vc_dispmanx_element_add(update, display, 0/*layer*/, &dst_rect, ++ 0/*src*/, &src_rect, ++ DISPMANX_PROTECTION_NONE, &alpha, ++ 0/*clamp*/, 0/*transform*/); ++ ++ vc_dispmanx_update_submit_sync(update); ++ ++ vc_dispmanx_display_close(display); ++ ++ return element; ++} ++#endif ++ + uint32_t platform_get_handle(EGLDisplay dpy, EGLNativeWindowType win) + { +- EGL_DISPMANX_WINDOW_T *dwin = check_default(win); +- vcos_assert(dwin); +- vcos_assert(dwin->width < 1<<16); // sanity check +- vcos_assert(dwin->height < 1<<16); // sanity check +- return dwin->element; ++#ifdef BUILD_WAYLAND ++ if(khrn_platform_get_wl_display()) { ++ struct wl_egl_window *wl_egl_window = (struct wl_egl_window*)win; ++ ++ if (wl_egl_window->dummy_element == PLATFORM_WIN_NONE) ++ wl_egl_window->dummy_element = create_dummy_element(); ++ ++ return wl_egl_window->dummy_element; ++ } else { ++#endif ++ EGL_DISPMANX_WINDOW_T *dwin = check_default(win); ++ vcos_assert(dwin); ++ vcos_assert(dwin->width < 1<<16); // sanity check ++ vcos_assert(dwin->height < 1<<16); // sanity check ++ return dwin->element; ++#ifdef BUILD_WAYLAND ++ } ++#endif + } + + #endif +diff --git a/interface/khronos/common/linux/khrn_wayland.c b/interface/khronos/common/linux/khrn_wayland.c +new file mode 100644 +index 0000000..0e1b9e7 +--- /dev/null ++++ b/interface/khronos/common/linux/khrn_wayland.c +@@ -0,0 +1,215 @@ ++/* ++Copyright (c) 2013, Raspberry Pi Foundation ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ * Redistributions of source code must retain the above copyright ++ notice, this list of conditions and the following disclaimer. ++ * Redistributions in binary form must reproduce the above copyright ++ notice, this list of conditions and the following disclaimer in the ++ documentation and/or other materials provided with the distribution. ++ * Neither the name of the copyright holder nor the ++ names of its contributors may be used to endorse or promote products ++ derived from this software without specific prior written permission. ++ ++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ++ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY ++DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ++(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ++LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ++ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++*/ ++ ++#define VCOS_LOG_CATEGORY (&khrn_client_log) ++ ++#include "interface/khronos/common/linux/khrn_wayland.h" ++#include "interface/khronos/wayland-dispmanx-client-protocol.h" ++#include "interface/khronos/wayland-egl/wayland-egl-priv.h" ++ ++extern VCOS_LOG_CAT_T khrn_client_log; ++ ++static void handle_dispmanx_format(void *data, struct wl_dispmanx *dispmanx, ++ uint32_t format) ++{ ++} ++ ++static void handle_dispmanx_allocated(void *data, struct wl_dispmanx *dispmanx, ++ struct wl_buffer *wl_buffer, ++ uint32_t resource_handle) ++{ ++ struct wl_dispmanx_client_buffer *buffer = wl_buffer_get_user_data(wl_buffer); ++ ++ buffer->pending_allocation = 0; ++ buffer->resource = resource_handle; ++} ++ ++static const struct wl_dispmanx_listener dispmanx_listener = { ++ handle_dispmanx_format, ++ handle_dispmanx_allocated, ++}; ++ ++static void ++sync_callback(void *data, struct wl_callback *callback, uint32_t serial) ++{ ++ int *done = data; ++ ++ *done = 1; ++ ++ wl_callback_destroy(callback); ++} ++ ++static const struct wl_callback_listener sync_listener = { ++ sync_callback ++}; ++ ++static int ++roundtrip(CLIENT_PROCESS_STATE_T *process) ++{ ++ struct wl_display *wl_display = khrn_platform_get_wl_display(); ++ struct wl_callback *callback; ++ int done = 0, ret = 0; ++ ++ callback = wl_display_sync(wl_display); ++ wl_callback_add_listener(callback, &sync_listener, &done); ++ wl_proxy_set_queue((struct wl_proxy *) callback, process->wl_queue); ++ while (ret != -1 && !done) ++ ret = wl_display_dispatch_queue(wl_display, process->wl_queue); ++ ++ if (!done) ++ wl_callback_destroy(callback); ++ ++ return ret; ++} ++ ++int do_wl_roundtrip() ++{ ++ CLIENT_PROCESS_STATE_T *process = CLIENT_GET_PROCESS_STATE(); ++ return roundtrip(process); ++} ++ ++static void ++registry_handle_global(void *data, struct wl_registry *registry, ++ uint32_t name, const char *interface, uint32_t version) ++{ ++ struct wl_display *wl_display = khrn_platform_get_wl_display(); ++ CLIENT_PROCESS_STATE_T *process = (CLIENT_PROCESS_STATE_T *)data; ++ ++ if (strcmp(interface, "wl_dispmanx") == 0) { ++ process->wl_dispmanx = wl_registry_bind(registry, name, ++ &wl_dispmanx_interface, 1); ++ ++ wl_proxy_set_queue((struct wl_proxy *) process->wl_dispmanx, ++ process->wl_queue); ++ wl_dispmanx_add_listener(process->wl_dispmanx, &dispmanx_listener, wl_display); ++ roundtrip(process); ++ } ++} ++ ++static void ++registry_handle_global_remove(void *data, struct wl_registry *registry, ++ uint32_t name) ++{ ++} ++ ++static const struct wl_registry_listener registry_listener = { ++ registry_handle_global, ++ registry_handle_global_remove ++}; ++ ++int ++init_process_wayland(CLIENT_PROCESS_STATE_T *process) ++{ ++ struct wl_display *wl_display = khrn_platform_get_wl_display(); ++ ++ process->wl_queue = wl_display_create_queue(wl_display); ++ if (!process->wl_queue) { ++ vcos_log_error("wl_display_create_queue failed\n"); ++ return false; ++ } ++ wl_display_dispatch_pending(wl_display); ++ ++ process->wl_registry = wl_display_get_registry(wl_display); ++ if (!process->wl_registry) { ++ vcos_log_error("wl_display_get_registry failed\n"); ++ return false; ++ } ++ ++ wl_proxy_set_queue((struct wl_proxy *) process->wl_registry, ++ process->wl_queue); ++ ++ wl_registry_add_listener(process->wl_registry, ®istry_listener, process); ++ ++ if (roundtrip(process) < 0 || process->wl_dispmanx == NULL) { ++ vcos_log_error("failed to get wl_dispmanx\n"); ++ return false; ++ } ++ ++ return true; ++} ++ ++#ifndef ALIGN_UP ++#define ALIGN_UP(x,y) ((x + (y)-1) & ~((y)-1)) ++#endif ++ ++static void handle_buffer_release(void *data, struct wl_buffer *buffer_wl) ++{ ++ struct wl_dispmanx_client_buffer *wl_dispmanx_client_buffer = data; ++ wl_dispmanx_client_buffer->in_use = 0; ++} ++ ++static const struct wl_buffer_listener buffer_listener = { ++ handle_buffer_release ++}; ++ ++struct wl_dispmanx_client_buffer * ++allocate_wl_buffer(struct wl_egl_window *window, KHRN_IMAGE_FORMAT_T color) ++{ ++ CLIENT_PROCESS_STATE_T *process = CLIENT_GET_PROCESS_STATE(); ++ struct wl_dispmanx_client_buffer *wl_dispmanx_client_buffer; ++ struct wl_buffer *wl_buffer; ++ uint32_t stride = ALIGN_UP(window->width * 4, 16); ++ uint32_t buffer_height = ALIGN_UP(window->height, 16); ++ enum wl_dispmanx_format color_format; ++ int ret = 0; ++ ++ switch (color) { ++ case ABGR_8888: ++ color_format = WL_DISPMANX_FORMAT_ABGR8888; ++ break; ++ case XBGR_8888: ++ color_format = WL_DISPMANX_FORMAT_XBGR8888; ++ break; ++ case RGB_565: ++ color_format = WL_DISPMANX_FORMAT_RGB565; ++ break; ++ default: ++ vcos_log_error("unknown KHRN_IMAGE_FORMAT_T 0x%x\n", color); ++ return NULL; ++ } ++ ++ wl_buffer = wl_dispmanx_create_buffer(process->wl_dispmanx, window->width, ++ window->height, stride, buffer_height, ++ color_format); ++ if (wl_buffer == NULL) ++ return NULL; ++ ++ wl_dispmanx_client_buffer = calloc(1, sizeof(struct wl_dispmanx_client_buffer)); ++ wl_dispmanx_client_buffer->wl_buffer = wl_buffer; ++ wl_dispmanx_client_buffer->in_use = 0; ++ wl_dispmanx_client_buffer->pending_allocation = 1; ++ wl_dispmanx_client_buffer->width = window->width; ++ wl_dispmanx_client_buffer->height = window->height; ++ ++ wl_proxy_set_queue((struct wl_proxy *) wl_buffer, process->wl_queue); ++ wl_buffer_add_listener(wl_buffer, &buffer_listener, wl_dispmanx_client_buffer); ++ ++ while (ret != -1 && wl_dispmanx_client_buffer->pending_allocation) ++ ret = do_wl_roundtrip(); ++ ++ return wl_dispmanx_client_buffer; ++} +diff --git a/interface/vmcs_host/vc_vchi_dispmanx.h b/interface/khronos/common/linux/khrn_wayland.h +similarity index 56% +copy from interface/vmcs_host/vc_vchi_dispmanx.h +copy to interface/khronos/common/linux/khrn_wayland.h +index b723b76..b9bf08c 100644 +--- a/interface/vmcs_host/vc_vchi_dispmanx.h ++++ b/interface/khronos/common/linux/khrn_wayland.h +@@ -1,5 +1,5 @@ + /* +-Copyright (c) 2012, Broadcom Europe Ltd ++Copyright (c) 2013, Raspberry Pi Foundation + All rights reserved. + + Redistribution and use in source and binary forms, with or without +@@ -25,45 +25,9 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +-#ifndef VC_VCHI_DISPMANX_H +-#define VC_VCHI_DISPMANX_H ++#include "interface/khronos/common/khrn_client.h" + +-#include "interface/peer/vc_vchi_dispmanx_common.h" ++int init_process_wayland(CLIENT_PROCESS_STATE_T *process); ++int do_wl_roundtrip(); + +-#define VC_NUM_HOST_RESOURCES 64 +-#define DISPMANX_MSGFIFO_SIZE 1024 +-#define DISPMANX_CLIENT_NAME MAKE_FOURCC("DISP") +-#define DISPMANX_NOTIFY_NAME MAKE_FOURCC("UPDH") +- +-//Or with command to indicate we don't need a response +-#define DISPMANX_NO_REPLY_MASK (1<<31) +- +-typedef struct { +- char description[32]; +- uint32_t width; +- uint32_t height; +- uint32_t aspect_pixwidth; +- uint32_t aspect_pixheight; +- uint32_t fieldrate_num; +- uint32_t fieldrate_denom; +- uint32_t fields_per_frame; +- uint32_t transform; +-} GET_MODES_DATA_T; +- +-typedef struct { +- int32_t response; +- uint32_t width; +- uint32_t height; +- uint32_t transform; +- uint32_t input_format; +-} GET_INFO_DATA_T; +- +-//Attributes changes flag mask +-#define ELEMENT_CHANGE_LAYER (1<<0) +-#define ELEMENT_CHANGE_OPACITY (1<<1) +-#define ELEMENT_CHANGE_DEST_RECT (1<<2) +-#define ELEMENT_CHANGE_SRC_RECT (1<<3) +-#define ELEMENT_CHANGE_MASK_RESOURCE (1<<4) +-#define ELEMENT_CHANGE_TRANSFORM (1<<5) +- +-#endif ++struct wl_dispmanx_client_buffer *allocate_wl_buffer(struct wl_egl_window *window, KHRN_IMAGE_FORMAT_T color); +diff --git a/interface/khronos/egl/egl_client.c b/interface/khronos/egl/egl_client.c +index b8bb374..03fe67b 100644 +--- a/interface/khronos/egl/egl_client.c ++++ b/interface/khronos/egl/egl_client.c +@@ -153,6 +153,10 @@ by an attribute value" + #include + #include + ++#ifdef BUILD_WAYLAND ++#include "interface/khronos/wayland-egl/wayland-egl-priv.h" ++#include "interface/khronos/common/linux/khrn_wayland.h" ++#endif + + #include "interface/khronos/egl/egl_client_cr.c" + +@@ -162,17 +166,6 @@ static void egl_current_release(CLIENT_PROCESS_STATE_T *process, EGL_CURRENT_T * + void egl_gl_flush_callback(bool wait); + void egl_vg_flush_callback(bool wait); + +-#include "interface/vmcs_host/vc_dispmanx_types.h" +-/**HACKHACK - give us the ability to inject a DispmanX +- * resource handle into the CreateWindowSurface and +- * SwapBuffers calls */ +-static DISPMANX_RESOURCE_HANDLE_T next_resource_handle; +- +-EGLAPI EGLBoolean EGLAPIENTRY eglSetNextResourceHandle(DISPMANX_RESOURCE_HANDLE_T handle) +-{ +- next_resource_handle = handle; +-} +- + /* + TODO: do an RPC call to make sure the Khronos vll is loaded (and that it stays loaded until eglTerminate) + Also affects global image (and possibly others?) +@@ -450,6 +443,9 @@ EGLAPI const char EGLAPIENTRY * eglQueryString(EGLDisplay dpy, EGLint name) + #ifdef EGL_KHR_fence_sync + "EGL_KHR_fence_sync " + #endif ++#endif ++#if EGL_WL_bind_wayland_display ++ "EGL_WL_bind_wayland_display " + #endif + ; + break; +@@ -655,8 +651,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig c + false, + EGL_NO_TEXTURE, + EGL_NO_TEXTURE, +- 0, 0, +- next_resource_handle); ++ 0, 0); + + if (surface) { + if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { +@@ -901,7 +896,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig + mipmap_texture, + texture_format, + texture_target, +- 0, 0, 0); ++ 0, 0); + + if (surface) { + if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { +@@ -1043,7 +1038,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig c + false, + EGL_NO_TEXTURE, + EGL_NO_TEXTURE, +- pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle, 0); ++ pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle); + + if (surface) { + if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { +@@ -2245,6 +2240,9 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + CLIENT_THREAD_STATE_T *thread; + CLIENT_PROCESS_STATE_T *process; + EGLBoolean result; ++#ifdef BUILD_WAYLAND ++ struct wl_display *wl_display = khrn_platform_get_wl_display(); ++#endif + + vcos_log_trace("eglSwapBuffers start. dpy=%d. surf=%d.", (int)dpy, (int)surf); + +@@ -2315,18 +2313,58 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + + vcos_log_trace("eglSwapBuffers server call"); + +- if (next_resource_handle) +- RPC_CALL7(eglIntSwapBuffers_impl, +- thread, +- EGLINTSWAPBUFFERS_ID_V2, +- RPC_UINT(surface->serverbuffer), +- RPC_UINT(surface->width), +- RPC_UINT(surface->height), +- RPC_UINT(surface->internal_handle), +- RPC_UINT(surface->swap_behavior == EGL_BUFFER_PRESERVED ? 1 : 0), +- RPC_UINT(khrn_platform_get_window_position(surface->win)), +- RPC_INT(next_resource_handle)); +- else ++#ifdef BUILD_WAYLAND ++ if (wl_display) { ++ struct wl_egl_window *wl_egl_window = surface->wl_egl_window; ++ struct wl_dispmanx_client_buffer *buffer_temp; ++ uint32_t configid; ++ KHRN_IMAGE_FORMAT_T color; ++ int ret = 0; ++ ++ buffer_temp = surface->front_wl_buffer; ++ surface->front_wl_buffer = surface->back_wl_buffer; ++ surface->back_wl_buffer = buffer_temp; ++ ++ configid = egl_config_to_id(surface->config); ++ color = egl_config_get_color_format(configid); ++ ++ if (surface->back_wl_buffer == NULL) ++ surface->back_wl_buffer = allocate_wl_buffer(wl_egl_window, color); ++ else if (surface->back_wl_buffer->width != width || ++ surface->back_wl_buffer->height != height) { ++ ++ struct wl_dispmanx_client_buffer *buffer; ++ ++ wl_buffer_destroy(surface->back_wl_buffer->wl_buffer); ++ free(surface->back_wl_buffer); ++ ++ buffer = allocate_wl_buffer(wl_egl_window, color); ++ surface->back_wl_buffer = buffer; ++ } ++ ++ RPC_CALL7(eglIntSwapBuffers_impl, ++ thread, ++ EGLINTSWAPBUFFERS_ID_V2, ++ RPC_UINT(surface->serverbuffer), ++ RPC_UINT(surface->width), ++ RPC_UINT(surface->height), ++ RPC_UINT(surface->internal_handle), ++ RPC_UINT(surface->swap_behavior == EGL_BUFFER_PRESERVED ? 1 : 0), ++ RPC_UINT(khrn_platform_get_window_position(surface->win)), ++ RPC_INT(surface->back_wl_buffer->resource)); ++ ++ surface->front_wl_buffer->in_use = 1; ++ wl_surface_attach(wl_egl_window->wl_surface, ++ surface->front_wl_buffer->wl_buffer, ++ 0, 0); ++ wl_surface_damage(wl_egl_window->wl_surface, 0, 0, ++ surface->width, surface->height); ++ wl_surface_commit(wl_egl_window->wl_surface); ++ ++ while(ret != -1 && surface->back_wl_buffer->in_use) ++ ret = wl_display_dispatch_queue(wl_display, process->wl_queue); ++ } else ++#endif + RPC_CALL6(eglIntSwapBuffers_impl, + thread, + EGLINTSWAPBUFFERS_ID, +diff --git a/interface/khronos/egl/egl_client_get_proc.c b/interface/khronos/egl/egl_client_get_proc.c +index 4cfa9ff..6a715af 100644 +--- a/interface/khronos/egl/egl_client_get_proc.c ++++ b/interface/khronos/egl/egl_client_get_proc.c +@@ -254,6 +254,17 @@ EGLAPI void EGLAPIENTRY (* eglGetProcAddress(const char *procname))(void) + return (void(*)(void))eglQueryGlobalImageBRCM; + #endif + ++#ifdef BUILD_WAYLAND ++#if EGL_WL_bind_wayland_display ++ if (!strcmp(procname, "eglBindWaylandDisplayWL")) ++ return (void(*)(void))eglBindWaylandDisplayWL; ++ if (!strcmp(procname, "eglUnbindWaylandDisplayWL")) ++ return (void(*)(void))eglUnbindWaylandDisplayWL; ++ if (!strcmp(procname, "eglQueryWaylandBufferWL")) ++ return (void(*)(void))eglQueryWaylandBufferWL; ++#endif ++#endif ++ + return (void(*)(void)) NULL; + } + +diff --git a/interface/khronos/egl/egl_client_surface.c b/interface/khronos/egl/egl_client_surface.c +index 128325e..42350bf 100644 +--- a/interface/khronos/egl/egl_client_surface.c ++++ b/interface/khronos/egl/egl_client_surface.c +@@ -46,6 +46,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "interface/khronos/egl/egl_int_impl.h" + #endif + ++#ifdef BUILD_WAYLAND ++#include "interface/khronos/wayland-egl/wayland-egl-priv.h" ++#include "interface/khronos/common/linux/khrn_wayland.h" ++#endif ++ + #include + + +@@ -314,8 +319,7 @@ EGL_SURFACE_T *egl_surface_create( + EGLenum texture_format, + EGLenum texture_target, + EGLNativePixmapType pixmap, +- const uint32_t *pixmap_server_handle, +- DISPMANX_RESOURCE_HANDLE_T next_resource_handle) ++ const uint32_t *pixmap_server_handle) + { + KHRN_IMAGE_FORMAT_T color; + KHRN_IMAGE_FORMAT_T depth; +@@ -326,6 +330,10 @@ EGL_SURFACE_T *egl_surface_create( + EGLint config_depth_bits; + EGLint config_stencil_bits; + CLIENT_THREAD_STATE_T *thread = CLIENT_GET_THREAD_STATE(); ++#ifdef BUILD_WAYLAND ++ struct wl_display *wl_display = khrn_platform_get_wl_display(); ++ DISPMANX_RESOURCE_HANDLE_T resource; ++#endif + + EGL_SURFACE_T *surface = egl_surface_pool_alloc(); + +@@ -390,6 +398,18 @@ EGL_SURFACE_T *egl_surface_create( + + vcos_assert(color != IMAGE_FORMAT_INVALID); + ++#ifdef BUILD_WAYLAND ++ if (type == WINDOW && wl_display) { ++ surface->wl_egl_window = (struct wl_egl_window*)win; ++ surface->back_wl_buffer = allocate_wl_buffer( ++ surface->wl_egl_window, color); ++ resource = surface->back_wl_buffer->resource; ++ } else { ++ surface->wl_egl_window = NULL; ++ resource = DISPMANX_NO_HANDLE; ++ } ++#endif ++ + #ifdef KHRONOS_EGL_PLATFORM_OPENWFC + // Create stream for this window + if(type != PBUFFER) +@@ -474,7 +494,8 @@ EGL_SURFACE_T *egl_surface_create( + #endif + uint32_t results[3]; + +- if (next_resource_handle) ++#ifdef BUILD_WAYLAND ++ if (resource != DISPMANX_NO_HANDLE) + RPC_CALL16_OUT_CTRL(eglIntCreateSurface_impl, + thread, + EGLINTCREATESURFACE_ID_V2, +@@ -492,9 +513,10 @@ EGL_SURFACE_T *egl_surface_create( + RPC_UINT(config_stencil_bits), + RPC_UINT(sem_name), + RPC_UINT(type), +- RPC_INT(next_resource_handle), ++ RPC_INT(resource), + results); + else ++#endif + RPC_CALL15_OUT_CTRL(eglIntCreateSurface_impl, + thread, + EGLINTCREATESURFACE_ID, +@@ -663,6 +685,18 @@ void egl_surface_free(EGL_SURFACE_T *surface) + if( surface->type == WINDOW ) { + vcos_log_trace("egl_surface_free: calling platform_destroy_winhandle..."); + platform_destroy_winhandle( surface->win, surface->internal_handle ); ++ ++#ifdef BUILD_WAYLAND ++ if (surface->back_wl_buffer) { ++ wl_buffer_destroy(surface->back_wl_buffer->wl_buffer); ++ free(surface->back_wl_buffer); ++ } ++ ++ if (surface->front_wl_buffer) { ++ wl_buffer_destroy(surface->front_wl_buffer->wl_buffer); ++ free(surface->front_wl_buffer); ++ } ++#endif + } + /* return value ignored -- read performed to ensure blocking. we want this to + * block so clients can safely destroy the surface's window as soon as the +diff --git a/interface/khronos/egl/egl_client_surface.h b/interface/khronos/egl/egl_client_surface.h +index b5bf70a..e328b77 100644 +--- a/interface/khronos/egl/egl_client_surface.h ++++ b/interface/khronos/egl/egl_client_surface.h +@@ -288,6 +288,41 @@ typedef struct { + type == PIXMAP + */ + bool server_owned; ++ ++#ifdef BUILD_WAYLAND ++ /* ++ wl_egl_window ++ ++ Validity: ++ type == WINDOW ++ ++ Invariant: ++ wayland EGL window ++ */ ++ struct wl_egl_window *wl_egl_window; ++ ++ /* ++ front_wl_buffer ++ ++ Validity: ++ type == WINDOW ++ ++ Invariant: ++ client-side information about the wl_buffer in the front ++ */ ++ struct wl_dispmanx_client_buffer *front_wl_buffer; ++ ++ /* ++ back_wl_buffer ++ ++ Validity: ++ type == WINDOW ++ ++ Invariant: ++ client-side information about the wl_buffer in the back ++ */ ++ struct wl_dispmanx_client_buffer *back_wl_buffer; ++#endif + } EGL_SURFACE_T; + + extern bool egl_surface_check_attribs( +@@ -322,8 +357,7 @@ extern EGL_SURFACE_T *egl_surface_create( + EGLenum texture_format, + EGLenum texture_target, + EGLNativePixmapType pixmap, +- const uint32_t *pixmap_server_handle, +- DISPMANX_RESOURCE_HANDLE_T next_resource_handle); ++ const uint32_t *pixmap_server_handle); + extern EGL_SURFACE_T *egl_surface_from_vg_image( + VGImage vg_handle, + EGLSurface name, +diff --git a/interface/khronos/egl/egl_int_impl.h b/interface/khronos/egl/egl_int_impl.h +index 51b3580..6863a3b 100644 +--- a/interface/khronos/egl/egl_int_impl.h ++++ b/interface/khronos/egl/egl_int_impl.h +@@ -57,7 +57,7 @@ FN(int, eglIntCreateSurface_impl, ( + uint32_t sem, + uint32_t type, + uint32_t *results, +- DISPMANX_RESOURCE_HANDLE_T next_resource_handle)) ++ DISPMANX_RESOURCE_HANDLE_T resource_handle)) + + FN(int, eglIntCreatePbufferFromVGImage_impl, ( + VGImage vg_handle, +diff --git a/interface/khronos/ext/egl_wayland.c b/interface/khronos/ext/egl_wayland.c +new file mode 100644 +index 0000000..5730743 +--- /dev/null ++++ b/interface/khronos/ext/egl_wayland.c +@@ -0,0 +1,246 @@ ++/* ++Copyright (c) 2013, Raspberry Pi Foundation ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ * Redistributions of source code must retain the above copyright ++ notice, this list of conditions and the following disclaimer. ++ * Redistributions in binary form must reproduce the above copyright ++ notice, this list of conditions and the following disclaimer in the ++ documentation and/or other materials provided with the distribution. ++ * Neither the name of the copyright holder nor the ++ names of its contributors may be used to endorse or promote products ++ derived from this software without specific prior written permission. ++ ++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ++ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY ++DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ++(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ++LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ++ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++*/ ++ ++#include "interface/khronos/common/khrn_client_mangle.h" ++#include "interface/khronos/common/khrn_client_rpc.h" ++ ++#include "interface/khronos/ext/egl_khr_sync_client.h" ++#include "interface/khronos/include/EGL/egl.h" ++#include "interface/khronos/include/EGL/eglext.h" ++ ++#include "interface/vmcs_host/vc_vchi_dispmanx.h" ++ ++#include ++#include "interface/khronos/wayland-dispmanx-server-protocol.h" ++ ++static void ++destroy_buffer(struct wl_resource *resource) ++{ ++ struct wl_dispmanx_server_buffer *buffer = wl_resource_get_user_data(resource); ++ ++ if(!buffer->in_use) ++ vc_dispmanx_resource_delete(buffer->handle); ++ ++ free(buffer); ++} ++ ++static void ++buffer_destroy(struct wl_client *client, struct wl_resource *resource) ++{ ++ wl_resource_destroy(resource); ++} ++ ++static const struct wl_buffer_interface dispmanx_buffer_interface = { ++ buffer_destroy ++}; ++ ++static VC_IMAGE_TYPE_T ++get_vc_format(enum wl_dispmanx_format format) ++{ ++ /* XXX: The app is likely to have been premultiplying in its shaders, ++ * but the VC scanout hardware on the RPi cannot mix premultiplied alpha ++ * channel with the element's alpha. ++ */ ++ switch (format) { ++ case WL_DISPMANX_FORMAT_ABGR8888: ++ return VC_IMAGE_RGBA32; ++ case WL_DISPMANX_FORMAT_XBGR8888: ++ return VC_IMAGE_BGRX8888; ++ case WL_DISPMANX_FORMAT_RGB565: ++ return VC_IMAGE_RGB565; ++ default: ++ /* invalid format */ ++ return VC_IMAGE_MIN; ++ } ++} ++ ++static void ++dispmanx_create_buffer(struct wl_client *client, struct wl_resource *resource, ++ uint32_t id, int32_t width, int32_t height, ++ uint32_t stride, uint32_t buffer_height, uint32_t format) ++{ ++ struct wl_dispmanx_server_buffer *buffer; ++ VC_IMAGE_TYPE_T vc_format = get_vc_format(format); ++ uint32_t dummy; ++ ++ if(vc_format == VC_IMAGE_MIN) { ++ wl_resource_post_error(resource, ++ WL_DISPMANX_ERROR_INVALID_FORMAT, ++ "invalid format"); ++ return; ++ } ++ ++ buffer = calloc(1, sizeof *buffer); ++ if (buffer == NULL) { ++ wl_resource_post_no_memory(resource); ++ return; ++ } ++ ++ buffer->handle = vc_dispmanx_resource_create(vc_format, ++ width | (stride << 16), ++ height | (buffer_height << 16), ++ &dummy); ++ if(buffer->handle == DISPMANX_NO_HANDLE) { ++ wl_resource_post_error(resource, ++ WL_DISPMANX_ERROR_ALLOC_FAILED, ++ "allocation failed"); ++ free(buffer); ++ return; ++ } ++ ++ buffer->width = width; ++ buffer->height = height; ++ buffer->format = format; ++ ++ buffer->resource = wl_resource_create(resource->client, &wl_buffer_interface, ++ 1, id); ++ if (!buffer->resource) { ++ wl_resource_post_no_memory(resource); ++ vc_dispmanx_resource_delete(buffer->handle); ++ free(buffer); ++ return; ++ } ++ ++ wl_resource_set_implementation(buffer->resource, ++ (void (**)(void)) &dispmanx_buffer_interface, ++ buffer, destroy_buffer); ++ ++ wl_dispmanx_send_buffer_allocated(resource, buffer->resource, ++ buffer->handle); ++} ++ ++static const struct wl_dispmanx_interface dispmanx_interface = { ++ dispmanx_create_buffer, ++}; ++ ++static void ++bind_dispmanx(struct wl_client *client, void *data, uint32_t version, uint32_t id) ++{ ++ struct wl_resource *resource; ++ ++ resource = wl_resource_create(client, &wl_dispmanx_interface, 1, id); ++ wl_resource_set_implementation(resource, &dispmanx_interface, NULL, NULL); ++ ++ wl_resource_post_event(resource, WL_DISPMANX_FORMAT, ++ WL_DISPMANX_FORMAT_ARGB8888); ++ ++ wl_resource_post_event(resource, WL_DISPMANX_FORMAT, ++ WL_DISPMANX_FORMAT_XRGB8888); ++ ++ wl_resource_post_event(resource, WL_DISPMANX_FORMAT, ++ WL_DISPMANX_FORMAT_ABGR8888); ++ ++ wl_resource_post_event(resource, WL_DISPMANX_FORMAT, ++ WL_DISPMANX_FORMAT_XBGR8888); ++ ++ wl_resource_post_event(resource, WL_DISPMANX_FORMAT, ++ WL_DISPMANX_FORMAT_RGB565); ++} ++ ++EGLBoolean EGLAPIENTRY ++eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display) ++{ ++ CLIENT_THREAD_STATE_T *thread; ++ CLIENT_PROCESS_STATE_T *process; ++ ++ if (!CLIENT_LOCK_AND_GET_STATES(dpy, &thread, &process)) ++ return EGL_FALSE; ++ ++ if (process->wl_global != NULL) ++ goto error; ++ ++ process->wl_global = wl_global_create(display, &wl_dispmanx_interface, 1, ++ NULL, bind_dispmanx); ++ if (process->wl_global == NULL) ++ goto error; ++ ++ return EGL_TRUE; ++ ++error: ++ CLIENT_UNLOCK(); ++ return EGL_FALSE; ++} ++ ++EGLBoolean EGLAPIENTRY ++eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display) ++{ ++ CLIENT_THREAD_STATE_T *thread; ++ CLIENT_PROCESS_STATE_T *process; ++ ++ if (!CLIENT_LOCK_AND_GET_STATES(dpy, &thread, &process)) ++ return EGL_FALSE; ++ ++ wl_global_destroy(process->wl_global); ++ process->wl_global = NULL; ++ ++ CLIENT_UNLOCK(); ++ ++ return EGL_TRUE; ++} ++ ++static int ++get_egl_format(enum wl_dispmanx_format format) ++{ ++ switch (format) { ++ case WL_DISPMANX_FORMAT_ABGR8888: ++ return EGL_TEXTURE_RGBA; ++ case WL_DISPMANX_FORMAT_XBGR8888: ++ return EGL_TEXTURE_RGB; ++ case WL_DISPMANX_FORMAT_RGB565: ++ return EGL_TEXTURE_RGB; ++ default: ++ /* invalid format */ ++ return EGL_NO_TEXTURE; ++ } ++} ++ ++EGLBoolean EGLAPIENTRY ++eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *_buffer, ++ EGLint attribute, EGLint *value) ++{ ++ struct wl_dispmanx_server_buffer *buffer = wl_resource_get_user_data(_buffer); ++ ++ if (wl_resource_instance_of(_buffer, &wl_dispmanx_interface, ++ &dispmanx_buffer_interface)) ++ return EGL_FALSE; ++ ++ switch (attribute) { ++ case EGL_TEXTURE_FORMAT: ++ *value = get_egl_format(buffer->format); ++ if (*value == EGL_NO_TEXTURE) ++ return EGL_FALSE; ++ return EGL_TRUE; ++ case EGL_WIDTH: ++ *value = buffer->width; ++ return EGL_TRUE; ++ case EGL_HEIGHT: ++ *value = buffer->height; ++ return EGL_TRUE; ++ } ++ ++ return EGL_FALSE; ++} +diff --git a/interface/khronos/include/EGL/eglext.h b/interface/khronos/include/EGL/eglext.h +index 89a3369..d7e5ba7 100755 +--- a/interface/khronos/include/EGL/eglext.h ++++ b/interface/khronos/include/EGL/eglext.h +@@ -191,6 +191,29 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EG + #endif + + ++#ifndef EGL_WL_bind_wayland_display ++#define EGL_WL_bind_wayland_display 1 ++ ++#define EGL_WAYLAND_BUFFER_WL 0x31D5 /* eglCreateImageKHR target */ ++#define EGL_WAYLAND_PLANE_WL 0x31D6 /* eglCreateImageKHR target */ ++#define EGL_TEXTURE_Y_U_V_WL 0x31D7 ++#define EGL_TEXTURE_Y_UV_WL 0x31D8 ++#define EGL_TEXTURE_Y_XUXV_WL 0x31D9 ++ ++struct wl_display; ++struct wl_resource; ++#ifdef EGL_EGLEXT_PROTOTYPES ++EGLAPI EGLBoolean EGLAPIENTRY eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display); ++EGLAPI EGLBoolean EGLAPIENTRY eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display); ++EGLAPI EGLBoolean EGLAPIENTRY eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value); ++#endif ++typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display); ++typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display); ++typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWL) (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value); ++ ++#endif ++ ++ + #ifdef __cplusplus + } + #endif +diff --git a/interface/khronos/wayland-egl/wayland-egl-priv.h b/interface/khronos/wayland-egl/wayland-egl-priv.h +new file mode 100644 +index 0000000..8e38d36 +--- /dev/null ++++ b/interface/khronos/wayland-egl/wayland-egl-priv.h +@@ -0,0 +1,53 @@ ++/* Copied from Mesa */ ++ ++#ifndef _WAYLAND_EGL_PRIV_H ++#define _WAYLAND_EGL_PRIV_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/* GCC visibility */ ++#if defined(__GNUC__) && __GNUC__ >= 4 ++#define WL_EGL_EXPORT __attribute__ ((visibility("default"))) ++#else ++#define WL_EGL_EXPORT ++#endif ++ ++#include "interface/vmcs_host/vc_dispmanx.h" ++#include "interface/khronos/egl/egl_client_surface.h" ++ ++#include ++ ++struct wl_dispmanx_client_buffer { ++ struct wl_buffer *wl_buffer; ++ DISPMANX_RESOURCE_HANDLE_T resource; ++ ++ int pending_allocation; ++ int in_use; ++ int width; ++ int height; ++}; ++ ++struct wl_egl_window { ++ struct wl_surface *wl_surface; ++ ++ int width; ++ int height; ++ int dx; ++ int dy; ++ ++ int attached_width; ++ int attached_height; ++ ++ /* XXX: The VC side seems to expect a valid element handle to be ++ passed to eglIntCreateSurface_impl and/or eglIntSwapBuffers_impl, ++ even for host-managed surfaces. */ ++ DISPMANX_ELEMENT_HANDLE_T dummy_element; ++}; ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +diff --git a/interface/khronos/wayland-egl/wayland-egl.c b/interface/khronos/wayland-egl/wayland-egl.c +new file mode 100644 +index 0000000..b8f050b +--- /dev/null ++++ b/interface/khronos/wayland-egl/wayland-egl.c +@@ -0,0 +1,59 @@ ++/* Copied from Mesa */ ++ ++#include ++ ++#include ++#include ++#include "wayland-egl-priv.h" ++ ++WL_EGL_EXPORT void ++wl_egl_window_resize(struct wl_egl_window *egl_window, ++ int width, int height, ++ int dx, int dy) ++{ ++ if (egl_window->width == width && ++ egl_window->height == height && ++ egl_window->dx == dx && ++ egl_window->dy == dy) ++ return; ++ ++ egl_window->width = width; ++ egl_window->height = height; ++ egl_window->dx = dx; ++ egl_window->dy = dy; ++} ++ ++WL_EGL_EXPORT struct wl_egl_window * ++wl_egl_window_create(struct wl_surface *surface, ++ int width, int height) ++{ ++ struct wl_egl_window *egl_window; ++ ++ egl_window = calloc(1, sizeof *egl_window); ++ if (!egl_window) ++ return NULL; ++ ++ egl_window->wl_surface = surface; ++ wl_egl_window_resize(egl_window, width, height, 0, 0); ++ egl_window->attached_width = 0; ++ egl_window->attached_height = 0; ++ egl_window->dummy_element = PLATFORM_WIN_NONE; ++ ++ return egl_window; ++} ++ ++WL_EGL_EXPORT void ++wl_egl_window_destroy(struct wl_egl_window *egl_window) ++{ ++ free(egl_window); ++} ++ ++WL_EGL_EXPORT void ++wl_egl_window_get_attached_size(struct wl_egl_window *egl_window, ++ int *width, int *height) ++{ ++ if (width) ++ *width = egl_window->attached_width; ++ if (height) ++ *height = egl_window->attached_height; ++} +diff --git a/interface/khronos/wayland-egl/wayland-egl.pc.in b/interface/khronos/wayland-egl/wayland-egl.pc.in +new file mode 100644 +index 0000000..8bafc15 +--- /dev/null ++++ b/interface/khronos/wayland-egl/wayland-egl.pc.in +@@ -0,0 +1,10 @@ ++prefix=@CMAKE_INSTALL_PREFIX@ ++exec_prefix=${prefix} ++libdir=${exec_prefix}/lib ++includedir=${prefix}/include ++ ++Name: wayland-egl ++Description: VideoCore wayland-egl library ++Version: @PROJECT_APIVER@ ++Libs: -L${libdir} -lwayland-egl ++Cflags: -I${includedir} +diff --git a/interface/vmcs_host/CMakeLists.txt b/interface/vmcs_host/CMakeLists.txt +index cbef80c..552312a 100755 +--- a/interface/vmcs_host/CMakeLists.txt ++++ b/interface/vmcs_host/CMakeLists.txt +@@ -7,13 +7,24 @@ + # vc_vchi_gencmd.c has a type-punning problem in vc_gencmd_read_response + add_definitions(-fno-strict-aliasing) + +-add_library(vchostif ++set(VCHOSTIF_SOURCE + ${VMCS_TARGET}/vcmisc.c + vc_vchi_gencmd.c vc_vchi_gpuserv.c + vc_vchi_tvservice.c vc_vchi_cecservice.c + vc_vchi_dispmanx.c vc_service_common.c) + # ${VMCS_TARGET}/vmcs_main.c + # vc_vchi_haud.c ++ ++if (BUILD_WAYLAND) ++wayland_add_protocol_server( ++ VCHOSTIF_SOURCE ++ ../../interface/wayland/dispmanx.xml ++ dispmanx ++) ++endif () ++ ++add_library(vchostif ${VCHOSTIF_SOURCE}) ++ + #add_library(bufman vc_vchi_bufman.c ) + set(INSTALL_TARGETS vchostif) + +diff --git a/interface/vmcs_host/vc_dispmanx.h b/interface/vmcs_host/vc_dispmanx.h +index 37fdae1..fe3619a 100755 +--- a/interface/vmcs_host/vc_dispmanx.h ++++ b/interface/vmcs_host/vc_dispmanx.h +@@ -39,6 +39,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #ifdef __cplusplus + extern "C" { + #endif ++ ++#ifdef BUILD_WAYLAND ++struct wl_resource; ++#endif ++ + // Same function as above, to aid migration of code. + VCHPRE_ int VCHPOST_ vc_dispman_init( void ); + // Stop the service from being used +@@ -135,6 +140,11 @@ VCHPRE_ int VCHPOST_ vc_dispmanx_resource_set_palette( DISPMANX_RESOURCE_HANDLE_ + // Start triggering callbacks synced to vsync + VCHPRE_ int VCHPOST_ vc_dispmanx_vsync_callback( DISPMANX_DISPLAY_HANDLE_T display, DISPMANX_CALLBACK_FUNC_T cb_func, void *cb_arg ); + ++#ifdef BUILD_WAYLAND ++VCHPRE_ DISPMANX_RESOURCE_HANDLE_T VCHPOST_ vc_dispmanx_get_handle_from_wl_buffer( struct wl_resource *_buffer ); ++ ++VCHPRE_ void VCHPOST_ vc_dispmanx_set_wl_buffer_in_use( struct wl_resource *_buffer, int in_use ); ++#endif + #ifdef __cplusplus + } + #endif +diff --git a/interface/vmcs_host/vc_vchi_dispmanx.c b/interface/vmcs_host/vc_vchi_dispmanx.c +index 7a6cdcd..eab146e 100755 +--- a/interface/vmcs_host/vc_vchi_dispmanx.c ++++ b/interface/vmcs_host/vc_vchi_dispmanx.c +@@ -1319,3 +1319,45 @@ static void *dispmanx_notify_func( void *arg ) { + } + return 0; + } ++ ++ ++#ifdef BUILD_WAYLAND ++/*********************************************************** ++ * Name: vc_dispmanx_get_handle_from_wl_buffer ++ * ++ * Arguments: ++ * struct wl_resource *_buffer ++ * ++ * Description: Return the handle of the resource associated to this Wayland buffer ++ * ++ * Returns: A resource handle ++ * ++ ***********************************************************/ ++VCHPRE_ DISPMANX_RESOURCE_HANDLE_T VCHPOST_ vc_dispmanx_get_handle_from_wl_buffer( struct wl_resource *_buffer ) ++{ ++ struct wl_dispmanx_server_buffer *buffer = (struct wl_dispmanx_server_buffer*)_buffer->data; ++ if (!buffer) ++ return DISPMANX_NO_HANDLE; ++ ++ return buffer->handle; ++} ++ ++/*********************************************************** ++ * Name: vc_dispmanx_set_wl_buffer_in_use ++ * ++ * Arguments: ++ * struct wl_resource *_buffer ++ * int in_use ++ * ++ * Description: Mark this Wayland buffer as being in use by the compositor ++ * ++ ***********************************************************/ ++VCHPRE_ void VCHPOST_ vc_dispmanx_set_wl_buffer_in_use( struct wl_resource *_buffer, int in_use ) ++{ ++ struct wl_dispmanx_server_buffer *buffer = (struct wl_dispmanx_server_buffer*)_buffer->data; ++ if (!buffer) ++ return; ++ ++ buffer->in_use = in_use; ++} ++#endif +diff --git a/interface/vmcs_host/vc_vchi_dispmanx.h b/interface/vmcs_host/vc_vchi_dispmanx.h +index b723b76..f0bae30 100644 +--- a/interface/vmcs_host/vc_vchi_dispmanx.h ++++ b/interface/vmcs_host/vc_vchi_dispmanx.h +@@ -66,4 +66,19 @@ typedef struct { + #define ELEMENT_CHANGE_MASK_RESOURCE (1<<4) + #define ELEMENT_CHANGE_TRANSFORM (1<<5) + ++#ifdef BUILD_WAYLAND ++/* XXX: This should be in a private header that can be included from EGL and vc_* */ ++#include ++#include "interface/vmcs_host/wayland-dispmanx-server-protocol.h" ++struct wl_dispmanx_server_buffer { ++ struct wl_resource *resource; ++ struct wl_dispmanx *dispmanx; ++ enum wl_dispmanx_format format; ++ DISPMANX_RESOURCE_HANDLE_T handle; ++ int32_t width; ++ int32_t height; ++ int in_use; ++}; ++#endif ++ + #endif +diff --git a/interface/wayland/dispmanx.xml b/interface/wayland/dispmanx.xml +new file mode 100644 +index 0000000..c18626d +--- /dev/null ++++ b/interface/wayland/dispmanx.xml +@@ -0,0 +1,123 @@ ++ ++ ++ ++ ++ Copyright © 2008-2011 Kristian Høgsberg ++ Copyright © 2010-2011 Intel Corporation ++ Copyright © 2013 Raspberry Pi Foundation ++ ++ Permission to use, copy, modify, distribute, and sell this ++ software and its documentation for any purpose is hereby granted ++ without fee, provided that\n the above copyright notice appear in ++ all copies and that both that copyright notice and this permission ++ notice appear in supporting documentation, and that the name of ++ the copyright holders not be used in advertising or publicity ++ pertaining to distribution of the software without specific, ++ written prior permission. The copyright holders make no ++ representations about the suitability of this software for any ++ purpose. It is provided "as is" without express or implied ++ warranty. ++ ++ THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS ++ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND ++ FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY ++ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN ++ AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ++ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF ++ THIS SOFTWARE. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/makefiles/cmake/Wayland.cmake b/makefiles/cmake/Wayland.cmake +new file mode 100644 +index 0000000..ad90d30 +--- /dev/null ++++ b/makefiles/cmake/Wayland.cmake +@@ -0,0 +1,72 @@ ++#============================================================================= ++# Copyright (C) 2012-2013 Pier Luigi Fiorini ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions ++# are met: ++# ++# * Redistributions of source code must retain the above copyright ++# notice, this list of conditions and the following disclaimer. ++# ++# * Redistributions in binary form must reproduce the above copyright ++# notice, this list of conditions and the following disclaimer in the ++# documentation and/or other materials provided with the distribution. ++# ++# * Neither the name of Pier Luigi Fiorini nor the names of his ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++#============================================================================= ++ ++find_program(WAYLAND_SCANNER_EXECUTABLE NAMES wayland-scanner) ++ ++# wayland_add_protocol_client(outfiles inputfile basename) ++function(WAYLAND_ADD_PROTOCOL_CLIENT _sources _protocol _basename) ++ if(NOT WAYLAND_SCANNER_EXECUTABLE) ++ message(FATAL "The wayland-scanner executable has nto been found on your system. You must install it.") ++ endif() ++ ++ get_filename_component(_infile ${_protocol} ABSOLUTE) ++ set(_client_header "${CMAKE_CURRENT_BINARY_DIR}/wayland-${_basename}-client-protocol.h") ++ set(_code "${CMAKE_CURRENT_BINARY_DIR}/wayland-${_basename}-protocol.c") ++ ++ add_custom_command(OUTPUT "${_client_header}" ++ COMMAND ${WAYLAND_SCANNER_EXECUTABLE} client-header < ${_infile} > ${_client_header} ++ DEPENDS ${_infile} VERBATIM) ++ ++ add_custom_command(OUTPUT "${_code}" ++ COMMAND ${WAYLAND_SCANNER_EXECUTABLE} code < ${_infile} > ${_code} ++ DEPENDS ${_infile} VERBATIM) ++ ++ list(APPEND ${_sources} "${_client_header}" "${_code}") ++ set(${_sources} ${${_sources}} PARENT_SCOPE) ++endfunction() ++ ++# wayland_add_protocol_server(outfiles inputfile basename) ++function(WAYLAND_ADD_PROTOCOL_SERVER _sources _protocol _basename) ++ if(NOT WAYLAND_SCANNER_EXECUTABLE) ++ message(FATAL "The wayland-scanner executable has nto been found on your system. You must install it.") ++ endif() ++ ++ get_filename_component(_infile ${_protocol} ABSOLUTE) ++ set(_server_header "${CMAKE_CURRENT_BINARY_DIR}/wayland-${_basename}-server-protocol.h") ++ ++ add_custom_command(OUTPUT "${_server_header}" ++ COMMAND ${WAYLAND_SCANNER_EXECUTABLE} server-header < ${_infile} > ${_server_header} ++ DEPENDS ${_infile} VERBATIM) ++ ++ list(APPEND ${_sources} "${_server_header}") ++ set(${_sources} ${${_sources}} PARENT_SCOPE) ++endfunction() diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0003-wayland-Add-Wayland-example.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0003-wayland-Add-Wayland-example.patch new file mode 100644 index 00000000000..e10f9ab88dc --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0003-wayland-Add-Wayland-example.patch @@ -0,0 +1,863 @@ +From 03053b119a625a03e28a86be0f0ab2aa9e2a6a49 Mon Sep 17 00:00:00 2001 +From: Tomeu Vizoso +Date: Tue, 1 Oct 2013 13:19:20 +0200 +Subject: [PATCH] wayland: Add Wayland example + +--- + .../linux/apps/hello_pi/CMakeLists.txt | 1 + + .../linux/apps/hello_pi/Makefile | 2 + + .../hello_pi/hello_wayland/CMakeLists.txt | 8 + + .../hello_pi/hello_wayland/Djenne_128_128.raw | 3 + + .../apps/hello_pi/hello_wayland/Makefile | 5 + + .../hello_wayland/cube_texture_and_coords.h | 100 +++ + .../apps/hello_pi/hello_wayland/triangle.c | 666 ++++++++++++++++++ + 7 files changed, 785 insertions(+) + create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt + create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw + create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/Makefile + create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h + create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/triangle.c + +diff --git a/host_applications/linux/apps/hello_pi/CMakeLists.txt b/host_applications/linux/apps/hello_pi/CMakeLists.txt +index b28a94a..2849fad 100644 +--- a/host_applications/linux/apps/hello_pi/CMakeLists.txt ++++ b/host_applications/linux/apps/hello_pi/CMakeLists.txt +@@ -25,6 +25,7 @@ add_subdirectory(hello_encode) + add_subdirectory(hello_jpeg) + add_subdirectory(hello_videocube) + add_subdirectory(hello_teapot) ++add_subdirectory(hello_wayland) + + if(BUILD_FONT) + set(VGFONT_SRCS libs/vgfont/font.c libs/vgfont/vgft.c libs/vgfont/graphics.c) +diff --git a/host_applications/linux/apps/hello_pi/Makefile b/host_applications/linux/apps/hello_pi/Makefile +index 4c2b2ef..d2b2555 100644 +--- a/host_applications/linux/apps/hello_pi/Makefile ++++ b/host_applications/linux/apps/hello_pi/Makefile +@@ -24,6 +24,7 @@ apps: libs/ilclient/libilclient.a libs/vgfont/libvgfont.a libs/revision/librevis + $(MAKE) -C hello_teapot + $(MAKE) -C hello_fft + $(MAKE) -C hello_mmal_encode ++ $(MAKE) -C hello_wayland + + clean: + $(MAKE) -C libs/ilclient clean +@@ -43,4 +44,5 @@ clean: + $(MAKE) -C hello_teapot clean + $(MAKE) -C hello_fft clean + $(MAKE) -C hello_mmal_encode clean ++ $(MAKE) -C hello_wayland clean + +diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt b/host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt +new file mode 100644 +index 0000000..9a2f75c +--- /dev/null ++++ b/host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt +@@ -0,0 +1,8 @@ ++set(EXEC hello_wayland.bin) ++set(SRCS triangle.c) ++ ++add_executable(${EXEC} ${SRCS}) ++target_link_libraries(${EXEC} ${HELLO_PI_LIBS} -lwayland-client -lwayland-egl) ++ ++install(TARGETS ${EXEC} ++ RUNTIME DESTINATION bin) +diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw b/host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw +new file mode 100644 +index 0000000..de9173c +--- /dev/null ++++ b/host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw +@@ -0,0 +1,3 @@ ++ֿֿվֿվվվվվվվվվվԽԽվվվվӼԽԽӼһһһһккккккккиѹииζϷϷѹ͵ϷϷ͵ζ͵͵͵͵͵̴̴̴˳˳˳˱˱˱˱˱˱˱ʰʰʰɯɯȮǭǭǭƬƬƬūūūƬƬéĪĪéééé¨ֿֿֿֿֿֿֿվվվվվӽӽӽӽҼҼҼҼӺӻӻӻѹҺҺҺиѹѹииииϷиϷϷϷϷζζζδδδδδδͳͳͳ̲̲̲˱ʰʰʰɯɯɯȮɯȮȮǭǭȮȮǭƬƬūūֿֿֿֿֿֿվվվվվӽӽӽӽҼҼҼҼӺӻӻҺҺҺҺҺѹѹѹѹѹѹиииииϷϷϷζζδδδδδδͳͳͳ̲̲̲˱˱ʰʰʰɯɯɯʰɯȮǭǭǭǭƬǭƬƬƬֿֿվվվվվӽӽӽӽҼҼҼҼӺӻӻҺӻӻҺҺѹиѹҺѹѹииѹиииϷϷϷζϵϵϵϵδδͳͳͳ̲̲̲˱˱˱ʰʰʰɯɯɯɯɯɯȮɯɯȮǭǭƬƬ׿ս׿ֿֿֿվվԾԼԼս־ѹԼսսӻӻӻӻҺҺҺҺѹѹѹѹѹѹѹѹѹѹѹѹииϷϷжϵϵϵδδͳͳ̲̲̲̲̲̲˱˱˱˱˱ʰʰɯɯɯʰɯɯɯǭǭǭƬ׿ֿտ־־׿׿ԼսսԼսսսսԼԼԼԼӻӻӻӻӻӻӻӻѹѹѹѹѹииижжжϵжжϵϵδδδδͳ̲̲̲̲̲˱˱˱ʰʰʰʰʰɯɯɯɯɯȮ׿׿׿׿׿־սսսսսսԼԼԼԼԼԼԼԼӻӻӻӻӻӻӻӻҺҺѹѹҸѷѷѷжжϵϵжϵϵϵδδͳͳͳͳͳ̲̲̲˱˱˱˱˱ʰʰʰɯȮ׿־־׿־־־־սսսսսսսսԼԼԼԼԼԼԼԼӻӻҺҺӹҸҸҸѷѷѷжжжϵδϵϵδδδδδͳͳͳͳ̲̲̲̲˱˱̲˱ʰٿٿٿٿٿٿٿؾֿֿֿֿ־սսսսսսսԼսԼӻӻӻӻҺѹҺѹиѹииииϷϷϷииииϷϷϷζζζ͵͵ͳͳͳ̲̲̲˱˱׿׿־־־־ս־սԼ־սսԼԼԼӻҺӻӻҺҺҺѹѹѹϷϷϷϷϷϷζζϷζζζϵϵϵδδδͳͳؿؿؿؿ׿׿־־־־սսսսԼӻӻӻӻӻҺҺѹѹииииииϷϷииϷϷϵϵϵδδδͳͳ׿׿׿׿׿׿־սսսԼԼԼӻӻӻҺҺҺҺҺҺѹѹѹѹииѷжжжϵϵϵδؿؿؿؿ׾׾׾ֽ־սսսԼԼԼԼӺӺӺӺӺӺҹҹииϷϷϷϷϷζ׿־־־սսսԼռռռռԻԻԻӺҺѹѹѹииϷϷ׿׿׿׿־־׾׾׾ֽֽֽռռӻӻҺҺѹѹѹиؿؿؿ׾ֽֽֽռռԻԻԻӺӺӺӺҹؿؿؿ׾ֽ׾ֽռռռռԻԻԻӺӺؿؿ׾׾ֽֽֽռռռԻԻԻԻؿ׾׾׾׾ֽֽֽռռռԻnhc׾׾ؿ׾׾ֽֽֽֽռռ]egؿؿ׾׾ֽֽռռռռӬUdlYheؿ׾׾׾׾ֽֽռЁ@Vg:PMؿؿؿ׾ؿ׾ֽlyzB[n>VWIJؿؿ׾׾׾׾A;=?LWI]`AU[ֿGV`=QV@TY.23D2+ð_pzGV]@T\MRShwv͐\m|M[d:T\LSVڦViuˢ /5G\nJS_M_BSg=L`KXhFO]OU]ΰsKRhL]h#>:JM[Ӡv}yx|s^^gv@Q]>N^N\BPEJ]ঠySuqm|]pt:dfNU`^mvZcdûտ?TX˽Zp~Xdrn{usxne|7N]>R^=Q_8MR@U\@V]@S[9MU/6;MVU`@Vc:P\AT[@SZ@RZEX`?OYGXaBS\DT^9WRHX[ԓoh|DTdfvDU^9ITIa[HQbF>H¼fpz9JXT\@S[}U\iZ]h鲶І}ouxu|aue|8KV@S_F[bFV_>OXIZcFW`GU^GV_ET]ES\7Y^G[c@FJǕ~{Ldt=P]_q|?RY;NWCZYWar_^lͧUbl4DTGQ[IHM`ruBZbAT\]addpxKXeZcglzO[kѧXjvAS\ߟ^o 1C!SZ1FN-:)5=JW!.;1?LJUaFR^NXd:XbBUaBDMЕƝ̌Lcr9P[OdoI\cKZCU^ۏTjx>R__eg~D`lA^eglf獗kzxTj|yBWfG^i?R]@U\9NV0?L7GS0>J#1=6DP#/%1"-9"6F2PWDWX;F\)8;GRg詭Ug{T]],9G!,:7=H #,/.3a|Jbh?UZ>MTEDSjHV^;IU:P`mtsrUnt4OYGVXgz~>[e9TZ7EIx8I8I}vzczqQitLPCRP8KY:NR>RR=PW?M\BIVeIRULU_/J]WaexI_c@[h8LXqxwqLdtIZ`2LTHQ`Nj{.?Pet^|rnxo`{8P\=Ua'%,;1;J6FN2DN3FR2ES1DP8IS7HR1?L?P];P_5KX@P\>P^J`rqftBX`9MW=P]7K[Zr|Kbk4MT7PZ.KVwnkhfua}B]jXsd{@Tc?P`=P_8CQ*7+ܣyvssi}^sas;N\I[f@QZ;NU6JP;M\@RV>HQ,3@-7@CEJݥաϒ͆l4DK)9BEOY2;D4=G"0)2?1=I6EN:IQ5EQ7GT8IV9IU5CL(.?L5ER6GTQa:M\H[h6JU6KR2IQ2JV`wd}d|za|qhE6CK8BL6BN4AP5AO5BP:GUDP\8BK1BO5ER8ES8ES2?M8BP)7.8F0EP6HR;KYCS`%6C$5B2BM5EQ7JR=MV&6C+;F/<]lyM^k9IV-8CMnThy0?9LYEWb$4=)0&8?*9B2=C*.sJW^CKP|Khj\mw`t[n{@R\OY^_^[3BS3@P5?M.7D/8F7AJ6BL(9?-6D)5A3@N1=N2>O#0>'/7E7HU8HU6BQ7DRAN\5?M9DR>HV.?L2BP3FP:LW0?L)9E-:H/G #$-(1(1-=F9AGO\`?KSAPY7ITBUbXpTk|1N^@MZqgj{7DP\qsK_q,@R`r9LYEWb:KT8JPCV\BP]?JR4?C +.1@G2O7FV)6C0:H?LW;KX:JW3DQ1AN0MU1?L1;I,6H4GS;IU5?H'0:#'3 )3#0<,:&31>J:ERDQ^DS`@R^?S^9MY1DK6GP+9B +5&2<&1;0@H)207=$(.$17'-:MT?R_J_n,L[CS_z~g{by|[nM`o7KX?Q\>OXL%2@%3?.:I1AQ/?O1AQ/>N00=I8FS$0&.=.6C;GQ:KQ;MT3FMM.>N,O2DP3CO2@H)4=8DO5=K4;M(O&7C->K8HU8IV>O\GWe;LY6FT3CQ8HU+4C#18@O?FUCQ_%3'0G6DX6GS1ANQa3P^@JUEKX6Qb'J_dt &2Pcu/A1@AUbEWb>OX'9@L^c?NdGXf@PWDX^8P]H]fS\`Ζ^fm]{fw}eU^jNYdAPVWehU]X0=I0>J(13J0=K1>M*8D,=I'8E+>M.BN2DN3EM3CI1@M/?K1AN4DQ6EV,;K+9L/P/?Q)9I*7E-*8D+KW4?K4?KCP\,N0AN5EQ3BK1BH3CP4DP->I7GT6FS2AR1@P0@P0@L0@L1BO7FW6EV+:K+8F*6B,>K/?L'4B#.<)1>#/;'3?)7C/;J0@M1AN4ER6JW;N[.EQ/EQ/EP-@K+@K8JUHP)15BJ,4Q4@K7BP0G->J3CP:JW2?K-8B09C0AN2>L)4B(0?)1>%-;)1?*6B/9H0=K2?M3CP:JW=N[8HV7JX7KV5JU7HS7IT:JV1AM6DP;IU5GR4DQ3AM=IU8DP.:FFT`6GR3BS3@N@LX"+5.8B'09*6B0;F2?M0=L2AL8EQES`7FOCR[APYBF妪XW]5GX-=M9IV)6E*7E*9I)9J(;-"0.;K2?N3@P-:H!.$-7".8%0:$09*6@=IR.9F%1=5AM8EL0N/?L&3A,9G2BR-=N!3F08F0:K9GV5@S.;J/7?L)1>',9#)6 &0)2<+3=-6E.7E'2@*4BMV>IT@IS1>H7BL6EN2CL=IX8ES&5@&1>2=D$+2"'4;<(/?$409F7@M?LX7CM&1<&6?1BI8IOMYaGT\VckN[cMZb;IQFQW;JOHU]CS[DR^4DRgx6GYJT\R^dCOU>JPEOWIS[bltN;KXL7DT+9K)8K,7E.7I/:M0?Q/=P6CS/;F/;G+8F&3A,:F)7C/=I,:F+;C$3< ,6(4@&5A-:F*6$+$$(+8)5A)'5*#"-)3%+9)7"08DR;LY:KX6GT!1=&2/;(4)7C*9E.&6>/;E.8B5?I+4>9EO.=F3DM:HT3@N0=L.J.=N)9I+:J%6B*;H0@L&6C*:G.8G&3A*6D'8E/=I'2=(-"-0&4A+7C/7D(1%.#-".5$.6"-<%0>$2@,8F1BN9JW:KX:KX*7C1>J0=I,9E1?K-;G9JV%6B/:E(2<+5@(2<(1;9EO.@I6HQ5AJ04@LAO\AR[N,9J)8H*:K*=N-?P2BR,=J0?K-;O+8K(7G)8I5EQ2CP%5A*:F&3A.;K&6F0?O1AN(7?!.6%16+K6DP4BN3AM3@L2BN3CP7BI7@H;EMELU6AH3@G+?E3GM19C1>J5AP,OX7KSKSJTV^h?IM9EGQZY6>APY]KSYR`VJR]EJ[^fd$@Q$J7?L/;D,=H/@M3CT0=T-J7AI+:B/=H,8F,9I1>O3?M.29B'-63;E2>J-;G@P\IQ>KP>IO:EL3O-:Q0?R5DT3AM/J-N3DP(6B(1;!-4*:L.?K'5A!,3)1!,4%08'3=%0;,8B%4=1>K5ER6HS5ES8KX3EP8JU+=H0CM9IU.>J7GS3CO2IP5HP6IQAR\0@H,8B*4>6?I.=I'3?2>J(2<%/9 )"..6>#,!++7C3@LDI.49?BGJ>LX1?K@NZ5CL;JS=MUEPZ?KU/;E1:D9BL/>J,7C6BO+5>%/9"+5(-9+2;*1:(1;(4@0>J:JV:KW>MV5EL:FR8DP8FS,8@&07)3:,4;"*2-380386:?DLSHRYAMT6BF.:>+7;5BC=FIANNX``LQQPQM5DM6AM=FS,5C/7E-7I/:L"0C&2@,F(7@-9-9H'3D.;K&2@"/;%.&-!+5&2>3?J ,!+"+$*(9J*;G%1 *2$, '/$0;"'5&/<'3%2A:FT7GT'7C!-%5A#/-9#1=$0*6B!- +5 * *#-+5.:D,9C5AK4CO)5A6BN4=G&0:$-7(.9*1:.4=*3=(4@0>J5EQ@P\@OX=NT:GV@NZ;KW9IU9IV>NWFR\8CM:CL;EL4?F8@G-2:3:?8KMBKN@GJ?DEHMLTXW2>H'2>&/<+4B2;I6@Q.'0<)3B%3@7DRJ0@L2?K-;G0?K2>J1=I6BN4@J.:D7BM8DN6BL($.1=G&5A)4@6BN7@J%/9#,6-3>+2;-4=/7A(4@/=I7HT?O\IXaCTZ?KZAR^HS;CMEL=FM06>O.>N3N.>M-=M+;K2CO+;H.>K4EM.>K3CP,;L2AQ9IV*:F,=F4=G*7C&4@4AO7EQ-8B#+4",3+%0?+8F,8F5FR!-$0+7C"+ *4&0)/:+2;.5>.7@(4@-;G:KWDTa(7@"28)5+77GTEV_+=F+:C:GO)4<'0:)18.6=.4;#*126:,/41389AHCMT:FL0<@-9=.:>3@B*46;>B:?@=ACIRQק3CS+;K/?O&3A/J->F/:G.;J'8E0?P8IU+9E%.8)1+NZ1GN;MU8LS=NX;JS0;F&/9;EN)7D&2>:GS0:C%/(!&2(/8(.71:D/;G*8D>NZBR_?MVJP7BH8?H:BI:BI8>E(+326;/271386>EHRYKW]JVZ@LPAMRJVX>HKIKOHLM?IINYWþ׻¼ܬ2EW4EW8GX&6C)5D.=H0AM,>F37M4=P1@P/AM0AM8IV,=J.=N,>F.>K.>K(7H6FV5FS-=J&8@+8G):G$3D/@Q6EV+8F'4@'2*#1A$1@$6C'8E):K1AR3GV5GW9NY:OZ6KV:MX5HS5HS1AM:JW5OV3LT4JR7KS;JT1=G%0:4=G6ER*5B6BN2NTBPVKV\?IO;AK;CJ74L-F4BN)6D0G+6=&06,9F7DQ:DK$.4#*1%,3*3<)2<06>/8@-7@*6?.LU=GRH5BL%2;5AK5?I&/8"+4&-5%,5$-6,5?,4A-9E@MYBR^EV_9MTBRYGW^=MTAQX>NU>OVEV]:LS5?F=GN3=@E9@B;CGFQRizwaupn~b{rl^uid}|[rp[ljcqk}}m|cvw^uvtw|.JT1JT2FQ/?K1@K4@L -8*"+,9/?L,-6"-&0%4@5CN'5A)"*!(#4B0>J#,6'0%+$.%.7#,6'2(0:*3&3$2>6FR3DQ)=K,4!* /8$-!,6*5)3'1%/",&0$/+7B%/#03> )&02>H*3>'/$-6%+4&,5"+4(1;*3@/;G3AM@Q]CT]6JQ&6=-4,IMIVXCQSbwt\sp_tsUthp`|rczucvt[libpn}yz{n4JV8KXL+6D5?M(4C!-<,N-L,;F(5$3<(3=-;H"0<.?L1>J*5?(/ &&7E-;G%/"+ $(1&0)*4=&.<"-,9E:JV2CP(8F$5==NW$5>3AJ/>G.>G2=G'2<3CL-'3?1?K=MZ8HQ(;B7FM?OVGW^BRYBRY=MT/?F0AH4=F@IR5=D@HO(-5.59,/41498=DFNUFPX?KN>NPAMQBNRK.>K5BP/9G/:H0=K.?L(9E.;H1AM3DP,@O+>M7GW/?L+9D1@H)7C+7F"/=1=K7DR2@L-2@LAQ^EV_BU\BRY@PW?OVAQX@PWAQXCSZCT[2>EAJS+5>DLS05<+1947<48<1:@@JQEQWESZFVXBRUAMQF>MVvwlrcvz^qnXkbRdV\naycqxwcp~zv{}fwhwdq(7D*71>K1M(;J7GT8HT)9F.>J-=I.>K&5E4CS7GT3DO,K/=I(8E4DP8HU8FR(4>(0(:G3DQ7CL&18"+ )1%0:'0>'2@+6D*8F0P[8KS8KS9LT9LT6GP5FO:KT>LU5IQ9LT8NU9NV7KR5FO+53RYJY`GW^=MTAQX?OVHX_AQXGW^/:BDOW6>H@IR-6<16=/6=45>/6??HQIU[GU[DRXBRTEQU=IM=JP=IN6BJJ3@L->K$4A-=MK0@M9IVGPLV_ESXCTZCQWCQX?JN=JP9EK6CK;FP;IVUfs[kxSbtcv}kz}bnn{qw_otvarzpbs|ex~lzbrt2IX0ET6IX-M.>K8HX2ET+>M)'4?)9I+:J,;K/?K,1:C=FOHU]BSZFV\CSYESY@LR>GOBKS3?ELW_ERZ>ITM]fZiraqwxz{~{^mvFVbn~x{DPV0M[0LZ7M]1EU0AQ2BR4DT.AO0?L4CT2ET*>P+AP4HT;OU,=E3CO3CP5CT+:J2AQ:IY2CO/?K8FR3CP(8I1AQ9IY7HT2>J)3/@Q1AN:HT(4>$.%.8(0>(5@(5J+9L-(7C?O\HYb:NUBRYEU\CRY;KRFV]IX_:JQGW^1=H>HR.8CAIS09C.5>04>49@/8A>IQER[FW^DTZBRXDRX?JQ@KN=HKK2AQ/?P.?S/CO.AN3FU.>O*:K5EU9JX0@M2BO4DQ4DQ-=J2BO8IU5ER0@N4BN0@M"2?1AR8HT6DP.:C",6+N.=N:JW8KV9MT7JR;NVQYBU]=LUDU^>RZ>PWDV]CV]@RYEX_FX_ASZEY`9EKO8IVJ8ES4CS/?P.?R3FR2ER6IX0@Q,K/=I2BO 0=1AR?O\7DP0N9IU;MX>RY:MU9LT8KS7JR@S[@S[>QYCV^=PX>QY=PX:MU:MU2AJ ,61;D;JV*8D6BN8DN*4>",6%.8&/8%1;)2<+5?,6@7@JAPYGXa-@H7GM2AH+;B1AHCSZ#3:$4;%5<)/4AG09@@KQ08?.7>27>39@9>G:BIIU[ESYCSZCSVBSV9JMO.>O7GW9KW.>K4DQ6FS7GT0@M/?L9IV6FS-=J1?K-=J#3@/?P7GT8FR0;E!+50AN9IU5FO0?H&0!.7&/<,5C+;C,:F):G-;L,;K3CP7IT:MU8KS9LT=PX?RZ9LT=PX@S[CV^AT\?RZ=PX8KS,6@3NW>OX!5=)9@%5<-=DAQXAQX4DK>NU?OV9DJBNT2?DBLS29@/8?27>5;B3:D6=DHTZESY@QW@QTCQT6EHETZJ3CS3EV3FS6IV3FU.>O,K4DQ8HU4DQ/?L2@L3CQ%5B1ARIYf/=I3>H!*42CP6FR0AJ-QYBU]=PX?RZ:NU4CL&2<1;D4BO/=I2=J7DM/8B$.8)2<$-6*6@+5?-7A-7A5>HDBKR+5<19@*3:4:A29B0:AFRX@NTFSZDTVBRT8CGFVXBMR2?A=FEMQRBGG:AD9>CCOSP\^forIUWKV\̳yfm|t|t{lz\er4K[1FT:NZ.?L.>K3CO1AQ4CU/BO3FS6IX/?P*:K4DT6HT1AN1AN3CP7GT0@M0@M8HU7GT/?L2@L4ER3CP+;L3CP4BN3?I)3=->KQY4CL*6@09C6EQ3BN+7CDFRX-8?,3:.6=-6<3:C.8?EQV@OU>MSCNRFRV6@E@PSIVX0<>>FECLKGMP',1/7>?JNEQRNWZ?KM>KR\mx]t[t_t@O_LVgwxr2J]4L\>P`/@M5EQ5ER2BS5EU2ER3FS1DS-=N)9J5EU7IU2AN3CP2BO4DQ.>K3CP9IV7GT.>K=KW.?L"2?3CS1AN1?K3?H,5?,=K9IU6GP-QY?RZ=PX=PXQY:MU?RZ:MU6EN-9C,6?4CO2@L*6B?KU7AK!+5*3=)1:)5@.8B-7A.8B3F>KS(0 )&4:0>D7EK:FL/9@&18+3:/7>18A.8?COU>JP>MS@LP>JN4<@AMQIUY1>?:BFILhtzx>IPDPTN[\?KM8GJ4GNpnh0HZ4JZH1;E.7B$5>,5>43B12A0RW>PWAS\*:C(6<>HMJWT>RW9MR6FL5FL8GM:GL?IP=GN9HK7FI;GK>IM@HLINS:@E=?D4AG?KQANTFPXCMT=GNBIP@FM7BH?JPGV\FTZJV_HX_JZ`P`fN]hO^jM\hO^jM\hL[gM\hN^j*K.>J3CS6JX=Ra*BNG]i5HUQ8IZ2AS/CUt;V`9R\4EP6BN07F0?K8JV7JR2@I.4B2;IBRcOfkEYaEWb1AN5AO;GVQY:MU>QY>QY>PX3SW9NVAMYAP^TnwEYd!3;5AH;HP4AI7GP7CM4AK8BL8AK-AH1RW:OSASZ?PY?MW@PV:LOERT@TYHO=FN;@E@LP=IMDOS>IMBMQ>JMP{8S]?U`7IT4?K27G5CO6JQ7JR4BK09F5=KScsqLglH_fCT_+;I1=L8FQ;LU:KTQY;NV>QY=PX=PX7RXMZ*:GlI`j>MZ1?H:IR8GP5@J8DN7CM;GRAIT0FJ:HN>GPMS@LR=JPBJR=LN8HJ8CG4AD0;>+7:6?B=FJ6JNAMQGVYFUWIW]JZ`HX^HX^P[cR]eS^fVahU`hWbjYdkYdl:T`5K[4JY1CT5GXQ^/@M%6D3DQ6IV2ER1=K3@N1AN-=J.>K9IV7GW/?P,AWЈTlxMY(8D4CP;LU;LU;NVPX2AMFXhyCXgL[h6JP5FO9HQ;GQ8EO=GO>KS?KT6ML:LNBLTAOWJcniDWnDU[ASZ?QW>QX@SZ@TY?TY@UZHX^EU[?PUGU[APU@LQ7CI7CI?MS=KQ?NS@KQ:FL.:@8AI#.58<@>BF9>CAJMDOS;GJ@OR@OQFRVEPUJY[JY\HV\BRXIY^Ufl_hq`ir^gp`hqajsbjt`hr^gp0KWKdp1GV-AO1CT0AT1DZGZosRgr7KV6HS+=H1CN5IT/CN.:I5BP4DQ2BO1AO8HU3DQ3DQ1I`džNfq=S^:LW.;H9DP,=F6HQ2IN7HQ?JV,8IUtF]hG]hDXc9KW*;C3DM=NW6IQ8KSQY8QW>PX>N\Ym|tH_oETdH\g1CO:HQ:EP>IQ>IQKQ9PP;MOBMU=NYiq@UnCV]BU]BS\FX^BT[CV]>PWI]cEV]HY`IV^IV^ANVCPXGT]KX`NZcVckUbjTbjWdlCPXLW_S_g\]fX^dPX_XbiS_eP^dP]cL\cQ]aUadTchYgmWejXhoXio\mt_jq`ksbmtcnualtbmt`ks^iq3GS4ER1AQ4DU7H[3I[|Lbm>R]L1AN2BO6FR>NZ6HS3EPOhqNet?S]BT_7GS8FR5HN4KQ2HN4GO7DQO^noIaqAXgEXcDW_(9B5EN:MU;NVN[mOgyt_z:NY:JW@KUALT?IR=LQ?OU?SUAQWOY@R^EV_BT\FW]CPY-4IV`=JRCPXERZFS[KX`MZbR_gUbjScjRbiPagT`hUbjZgnZgoWdl\enYaj]enWaiZgoZfnWgnVfm\go\goXemYgn\gq\ks\ks]mubmw`lv]irZeo]isalv]hrVak_qx0?HDR_8IV0@P.BS6L^݆Ndo=P[8JU5GR6HS7KV2FQ0J:LR2IN.GM5GO)9Feue]uD[jGZeGZb/BH:MT6IQ9LT;NV=PXQY;PX=NZ(;G~mHavp>T_5ER>GQDMVBNSCQWFV\ARWERZCMW6JUΑrBWm:MZ?Q\8IRARXHUZXaj ++bepSaiYfnYfn[hpWdlZgo\iq]iqYhrWfoYhq[ktUdm[jsZir[js[jr]ktZjrZirZir[js[js]lu\fo^hr]ir_kw^jv\kv\iwYftWgsQamO_kRbnM]iM]iM]iN^jgsy=IQDOY:HT6FS4IX/HX̅BWc6JU8JU:LW7IT6KV4IS0&;B(9A)KR9LM@MVAITHQ^1COݑ`}BWj@QaNbmYjsYhm]gmbjr41@gu|gt|cpxanvcpxamvZkqSdkZhpWfn[irZhq]ktXiqWhq[ltZlxYlvaq}`p|^o{ao{_ny^lxem{fm{amxbl{_hv\huZeuR]nL_lL_lL_lL_lJ^kI\iG[hFYgOjp2IN;LU8FR6FS3HW/JZv>V\8MU3HP7IT4ER1AN1AN18;MX]ozeykj}h~PfsE]iG\gJ[eO_l^n~іɓÃrwOfvI`pG^n{ҰߚЀUrvGam>LT?HPESXAQWHV[HSY[ggO^cZp{d~ޘd@Yi7R^FakXkr`pyv,1>kp~3YhpWgo\gr_ls]jqanu_ltbntWkyWkx[o{Xmx[ny^p{]oz\nz[nx^nz`p|aq}dqdqerercrz^nz[jvVgsPcrL`rKcsNfvOeqNepRerWguVfrUeqZgtWfoPjp;PV5HO;KW@P]2ETYqw:PU6KS4IQ:LW5FSN^kbr~t\nyRdoL`kM`mK^k>T`>T`4LX=S_\lyZkx>Raaxtwwh~\sYq~\tšƦҖƏ†tyׁSZFXcQ]jK\aN`jXq뜺όiCZi=Vb9P[Ymt`kuYclX`mt{06Ebs_o|_o{_o{`nz^lxao{_lx[kxUfsTenTenSdmTfoTfoZirZjv]mxYiuScpScpYiuZhxVduTfpXhtUhuSfuSftRgxThyThzRhtPcpPdqSepXhuZjv\ktXgp\v|=T[3EP5DQ8HUL`lpG]b7LT5JR6GS9KV8IV8HU:IY7JT9KV>P[MZ\myyŪְ֥虵΃^tDYh=T`9MXWhqbnxCLWHS\DMZ%,;as^o|]n{Zkx_p}YjwQboYjx]jq]jr^ksbowiv~dqybowhu|evjzjzfw`o[m|TixPetPfuOfuQetNbsOctRduPbsM_qOcnPdoUfr_q}XiqRclRakQ`i^wCYd/DN6HR8IV6GTlH^j>QY9LT5IP6IT5FS8IU8HY:JZ7JT;MW8JU9LY6IV7JV7L[7L[4N]:Q`@S`BUb=Ra7Qasx|ox}kyd}h[v|tDP`AUf|ʔˏƆ{zuB\l?Q`PduÖ˗lj֫ݚt]qGVgP[9KV7HQ6GP7GS2BN7HU7GW9IX5EU8JT:KX8IV3FS6IV;M]5JY4IX3K]E^nRhs7MY6K[VfCYhBTbFWaBWg>Q^>OXiv~v}$/7S_hz{v}wxxn}mziy]lxWgsN`oObpM^oNasJ_rI_qG_pG_sHbuJcwFbvPfxNdwShy[o~`q~euYiu]luK\eJ]dHZaEX_FV\AQWAPWBRXI`pNeu9N^=P]T`?QbQ^u~„}xx}ݍc{IXgETd8KZUp~e}L^tCXjEYl=OaG[h@R]DUa=RZAV]8O`8N[=QY[goxjt|":CMclsgsxis{lwiw`o{[kwZjvUhwQcrQftLcrG^pG_sG`sG^uF`pFaqHauIbvIcvKcyMe|Nf}Xi}[n~aqZkxXhu[luN`gK[bL\cFV]M\dGV\CSYDTZ=PS;NQLctAXh=Ra9KXCT^DQYEQXIRZDO[6CO-:F,9G$+;-M^BM\ANZNTCTYCSYASU;OR@SVfD_h6P\6P\5O[>YgB]kHcqTjtATaqo~ytrxڥVm|BXdATa?Rb8KZ>TXBZcF\i?ZjF`tkpmwsjg}—ȉ7MY=P_.BSx‚y{ǃdFX^>QY@R]=OZ7HU=NZ9IY;K[;J[ZoA]rB^q9Xr>Yt>XqBZsF^tBZqC[qF`sM_tK_tG_rB_tFcwFbzMgSiNkYtLg}^yWqWo~WlxLanHfkQjoEX_IY`IU]GW^ASZBT[=VV?TV>NTDOWEPXDOUCQT>OR_xPiu7Q]4N\5O]:TbE^nOhxƀəßՕŅVm|F\gI[h@Rb;N]DXXCV[K^fNaoVi|F`pv}|zoqv杻ΕXpxC[g@Ud9M^txÅ{dUpF]q?YjBT[BU]>P\:LW;LZ8JV:JZ9IZ4EQ6GT8IVNUBMUFPXAMS?NQ=OPlSm{6P^2K[5O^:ScC[mLdulv~~mql}{Ζvk?Sb@Ud@Ud=PbKZ^N]dTemZlvK^kYo{Umyw~z{ӟљɄ_{?Ye>Tc.EUw`yk;Sf@Wg>Vf0EUNT9KUThwLcuGbuKfzMgzLezHeyEauLh{Kf~Hg}Gf|IfKlNoSuKkPoSpOkjy}patI]hN_kCV^CT^BQZ@OX?NW?NW>OX:MU9MS@QZ>NV@LVAMW=KQ?MP=OPzXq5N^6N`1I[;SeAYmH`tizXsugWuq{|r}¥ڛΑnXf5Q^9Rb>Uem?TfBUl:P^>Td?R_BVc9KU>P[5GR:IVQY8LT?MN@OU;MS7JUE^mJg{MjJhPmPrXzVzTxJoVzlz‡ǎɎƖ̕Ĉ{]qUgyPdsL]jHYf=OZBU`AR[DU^>LV?MVAPY?PZ;KUMVAQY;IU>IVBNXAOUBSV@RSr_w5M_/GY1I[7OcC[oNfzrvwbIe~=\u6Tp=^{Xwclk}֚|pC]k;Uc:ScWkE]qC^r}ۨܔȑ}VsB`oOX>OV>PX4GNASZ7JQ:LSASZ>QXCQY;GQ7FOBQZ@NX@PV?PS=OPd}>Wg0HZ2J\7OaBZoNfznumXs9Ti5Qj$A]"@]">RJh}squw։VpIcsPY>PX:RW5MR5MQ6OS4JO;OT9LR;LRMT9KS=OVOS|kD]m3L\4M]7OaBZlOgynxs\uIct-H\,Gb4S4GX,CSċz}Ոc~Jdt;Ue6Sb3O`7Ug@_rIf|LhvǏǝӉqWn>VhRYPX:OW8MU=SY9NTEdcDdc8WV+JI1MM2KK=OP:ILCQMDRP9KL@SV=QV>RV>NT=LO{s=We7O_6O_7P`B[kPhzqziXn}=Wd0IZ,G_8T7EO/AN{zאĉu[y9Vd7Tc2Pa;V`A[iLeuTmzup|ȏŇyh|PP:IK=KHBNO=MR6J[2Kd3Qq8Sx8Vw4Uu2Vo9\uMj[p]l~QhtJ\gQ_kJV_T\fO\cDSZ=OU=PX:MU2IP;QX7NT7MT9MT#5>UuuCgfMqpRrsPmnF[].15>CMXPLYUburF[\DY^ATZ?NUN[bse7Sd0JZ3L\6Pa@YmMh|x}}\w7Wj3Sf.F\'5O;R[7M_rˌ~k^yMV6EN8GP7KS5HO9LS5IM6JO9JLP[?Q\9KV4HO-;G7CO4@L2BIAWZ40SyqDyk?uf:oaH|jF{iPpPqNmLsU{p.A>{ENQ0BA9SO4OKub?Yj1JZ4M];SeB[pKg{}tnh4Ue3Sf+CY%3N5LU,BTrßщqhJcw?[o>Yn3Pe5Wf@]nHcwTkd|iuvwsɇvrkIcs:Sc5L\8L]1CT6EV5DV3HR3GR3GR2ES2CP0AN2CP4DR3DM4EN8IR9KT>MV;JS:IR:HR6IP6HO9LS9IPPZXi5N^8Qa;SeB[oLeyslvUq<^m0Qd.DZ 0G/FP2H[}|ڍ{r_xD]r:Sh7Sd7Vi@^qGbwOf}WotttywwrRl|:Sc6M]7K\2CT3EV5DV4HR2FQ1FQ4FQ3EP5HS9IU8GT;MT4FM3FMMR>MSCNT;OS;NS7IP9KRL]fJZfO_k`p|]mzTdq[kwUdpOalHYeGZb>RXBS`=N[AR_;LY7HU9JW:KX4FS1AM6EP6>L!+2;EBNRFXWf|xTwJunN|rM}tExnG|rHqKv?pGwCuiquºrĻ~fB\m?Xh7P`?WiHauIbvtro[u8Zj5Sf)?V!.EE\f?Ug΅~qЉvwZq>Wh4M]:UkC^sHcxNh}Xsw}v~~rUn~KSKS>KSANV:GPALTHP2EK9KR:MSFW`N`hRbnP`lO_kP]kKWfJ[fGWcBT^?S^DYcR$1IAXb8Na׉tƝԈ}Wn~L`oKR;LUEV_^ow[ltO_kTdpQamO`lKXdIWbBR_@P]?O\>Q^:NZ;N[;KX7GT3DP1AN7GS9IV3CP5FR0=K.:F1;E")35;@JOR"'*"''46-/ $"!=:Xurs~rZ:u^oM~zgyoNfx?VfAXhF\nf~t~qf=\k/M^(=R!.E1HRAWi݉}ɜӄ^s3FS7IT3FM9RhE^rIdyPmZyk{{LJ{~|f?Yj2K[6M]3HW1FU4GS4ER6GT7IT6FR8IR1DK6FM;KR;KR=MT7HN?LT>KSCEJM&)- #(-/527:48;7>A!!"1-&FAcrssu^vRiyjpy{x:Zi0N_(=R!-C4>1GYyw{ěԈnZlyJ\g:KT/AG5K_C[mFavKjSrjruvˍąwlNU9IN=MSMS>JP:FL6CL8DM7HO;;LR9GM9EJ/;A5AG7EJ=MT?OUAR[WgpZlwM_jXjuQaoM]kJ\gFXcAS^>P[:LW\o=Wf7Q_;Q]6JU7HS1FQ4HT6KS9KS7IP6FM;IO>IO:PR7LM:MU3EM1AN%7@=KU;KQ?QX:LSWip[msQbkRclVgpPajCV^J]e@S[N.;K$/='4#,!&!%/45#"#(' .,,&!"+"O93D($gRQqgj~rjrnwm~v|i^xOhx@WgCWfMapƉʒǕɛЕɂ~azEZi6FSARZ8GP/BM/CRJ_u\tysuw~Ǧ݈~~r{:Xk5N^9Tb:O[9MW3GR4FQ7IT9LT9MU6IO9IPF:FP1>J@LX?KULWbSfm\nuQcjQcjL]fHYbK\eFW`GZb>QY:MT>P[7IT:LW6GT7HT6FV9IY8HX6FV7GW8HX7GW7GW3CS3CS1AQ3BR/>N,G19FAJWZbp\fpfnyNahFX_GY_@QZHYbEV_;LTFUbDW_:MT;MX5GR:LV3CQ3DQ4FR3CT5EU4DT3CS6FV6FV5EU4DT1BR/?O/>N.=M-P[2DO6GT2CP6GT3EQ3CS3CS4DT7GW4DT5EU3CS->N2AQ.=M0?O.=M.;K+8H2?O#1A"0*& &6<=%%% ebdLNLAIB&!)"&ȋрvŅ{msWss̍Ƃžٓ˞֍ā ӍlOdoDVa;KW8ER7FO/@N*>Quȇҟ֡؏ņ†mRq@[l=Vh9Rb:Qa6M]:MS9JS5DM:FP:DM4@L3AM:JV?U\-ALוmRhsLdkCT]HYb?PY>PX:JWL3DQ4ER4ER3CS3CS2BR3CS1AQ4DT6FV4DT/?O1@P2AQ.=M1>N0=M-;K2(6"/#-$$)*  %!&XWY@ECCJE87.\RKgXRzjjxtlt{foĂvya}ƎˍŌőɕɌ[tKak;MX9HT8ES4DJ2BO.CTBZqÒʌŌĤ۠׏ƎČtn|v`~B]n=Wh:Te9Qa1K[4HO6IQ6DM2=J,8D0>JDVa9KXLguwNfr=Va3/ub]B)%bhqvqvvmp}~{ŃvƄ}̀ǎ|jE\d@RZ:JW6BS9FL/?L/AS0H^Ɇ˒ʏǏƣzs{wgNX:KT9JS7GS2BN:JU6FS9HV2EO.?L5FS1BO0AM1AQ1AQ1AQ2BR2BR2BR2BR1AQ3CS4DT3CS2AQ0=M0=M/K[9FM3CP*Ym=Yj:Te8Rc6Pb1KQ/FO9IR>KX}^x[vf}Oct:L]BQbAN\;GSDMW;MV5GO1AM5EQ5EQ5ER9IV3BO1BO/@M3DQ/@L3CS/?O0@P2BR0@P0@P2BR3CS0@P1AQ1AQ1AQ,9I0=M1>N'4D+5F1;L'1B'1C"-;!*7$.$*&+/&*+"'((,-".+%-,#"%$#!!,+'/+*=98%-& +\ No newline at end of file +diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/Makefile b/host_applications/linux/apps/hello_pi/hello_wayland/Makefile +new file mode 100644 +index 0000000..c9ddf23 +--- /dev/null ++++ b/host_applications/linux/apps/hello_pi/hello_wayland/Makefile +@@ -0,0 +1,5 @@ ++OBJS=triangle.o ++BIN=hello_wayland.bin ++LDFLAGS+=-lwayland-client -lwayland-egl ++ ++include ../Makefile.include +diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h b/host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h +new file mode 100644 +index 0000000..663e23b +--- /dev/null ++++ b/host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h +@@ -0,0 +1,100 @@ ++/* ++Copyright (c) 2012, Broadcom Europe Ltd ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ * Redistributions of source code must retain the above copyright ++ notice, this list of conditions and the following disclaimer. ++ * Redistributions in binary form must reproduce the above copyright ++ notice, this list of conditions and the following disclaimer in the ++ documentation and/or other materials provided with the distribution. ++ * Neither the name of the copyright holder nor the ++ names of its contributors may be used to endorse or promote products ++ derived from this software without specific prior written permission. ++ ++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ++ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY ++DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ++(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ++LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ++ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++*/ ++ ++// Spatial coordinates for the cube ++ ++static const GLbyte quadx[6*4*3] = { ++ /* FRONT */ ++ -10, -10, 10, ++ 10, -10, 10, ++ -10, 10, 10, ++ 10, 10, 10, ++ ++ /* BACK */ ++ -10, -10, -10, ++ -10, 10, -10, ++ 10, -10, -10, ++ 10, 10, -10, ++ ++ /* LEFT */ ++ -10, -10, 10, ++ -10, 10, 10, ++ -10, -10, -10, ++ -10, 10, -10, ++ ++ /* RIGHT */ ++ 10, -10, -10, ++ 10, 10, -10, ++ 10, -10, 10, ++ 10, 10, 10, ++ ++ /* TOP */ ++ -10, 10, 10, ++ 10, 10, 10, ++ -10, 10, -10, ++ 10, 10, -10, ++ ++ /* BOTTOM */ ++ -10, -10, 10, ++ -10, -10, -10, ++ 10, -10, 10, ++ 10, -10, -10, ++}; ++ ++/** Texture coordinates for the quad. */ ++static const GLfloat texCoords[6 * 4 * 2] = { ++ 0.f, 0.f, ++ 1.f, 0.f, ++ 0.f, 1.f, ++ 1.f, 1.f, ++ ++ 0.f, 0.f, ++ 1.f, 0.f, ++ 0.f, 1.f, ++ 1.f, 1.f, ++ ++ 0.f, 0.f, ++ 1.f, 0.f, ++ 0.f, 1.f, ++ 1.f, 1.f, ++ ++ 0.f, 0.f, ++ 1.f, 0.f, ++ 0.f, 1.f, ++ 1.f, 1.f, ++ ++ 0.f, 0.f, ++ 1.f, 0.f, ++ 0.f, 1.f, ++ 1.f, 1.f, ++ ++ 0.f, 0.f, ++ 1.f, 0.f, ++ 0.f, 1.f, ++ 1.f, 1.f, ++}; ++ +diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/triangle.c b/host_applications/linux/apps/hello_pi/hello_wayland/triangle.c +new file mode 100644 +index 0000000..1a7bfc4 +--- /dev/null ++++ b/host_applications/linux/apps/hello_pi/hello_wayland/triangle.c +@@ -0,0 +1,666 @@ ++/* ++Copyright (c) 2012, Broadcom Europe Ltd ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ * Redistributions of source code must retain the above copyright ++ notice, this list of conditions and the following disclaimer. ++ * Redistributions in binary form must reproduce the above copyright ++ notice, this list of conditions and the following disclaimer in the ++ documentation and/or other materials provided with the distribution. ++ * Neither the name of the copyright holder nor the ++ names of its contributors may be used to endorse or promote products ++ derived from this software without specific prior written permission. ++ ++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ++ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY ++DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ++(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ++LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ++ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++*/ ++ ++// A rotating cube rendered with OpenGL|ES. Three images used as textures on the cube faces. ++ ++#define _GNU_SOURCE ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "GLES/gl.h" ++#include "EGL/egl.h" ++#include "EGL/eglext.h" ++ ++#include "cube_texture_and_coords.h" ++ ++#define PATH "./" ++ ++#define IMAGE_SIZE 128 ++ ++#ifndef M_PI ++ #define M_PI 3.141592654 ++#endif ++ ++ ++typedef struct ++{ ++ uint32_t screen_width; ++ uint32_t screen_height; ++// OpenGL|ES objects ++ EGLDisplay display; ++ EGLSurface surface; ++ EGLContext context; ++ GLuint tex[6]; ++// model rotation vector and direction ++ GLfloat rot_angle_x_inc; ++ GLfloat rot_angle_y_inc; ++ GLfloat rot_angle_z_inc; ++// current model rotation angles ++ GLfloat rot_angle_x; ++ GLfloat rot_angle_y; ++ GLfloat rot_angle_z; ++// current distance from camera ++ GLfloat distance; ++ GLfloat distance_inc; ++// pointers to texture buffers ++ char *tex_buf1; ++ char *tex_buf2; ++ char *tex_buf3; ++ struct wl_display *wl_display; ++ struct wl_registry *wl_registry; ++ struct wl_shell *wl_shell; ++ struct wl_shell_surface *wl_shell_surface; ++ struct wl_compositor *wl_compositor; ++ struct wl_surface *wl_surface; ++ struct wl_callback *wl_callback; ++ struct wl_egl_window *wl_egl_window; ++ int needs_update; ++ int ellapsed_frames; ++ int kill_compositor; ++ int single_frame; ++ int terminate_abruptly; ++} CUBE_STATE_T; ++ ++static void init_ogl(CUBE_STATE_T *state); ++static void init_model_proj(CUBE_STATE_T *state); ++static void reset_model(CUBE_STATE_T *state); ++static GLfloat inc_and_wrap_angle(GLfloat angle, GLfloat angle_inc); ++static GLfloat inc_and_clip_distance(GLfloat distance, GLfloat distance_inc); ++static void redraw_scene(CUBE_STATE_T *state); ++static void update_model(CUBE_STATE_T *state); ++static void init_textures(CUBE_STATE_T *state); ++static void load_tex_images(CUBE_STATE_T *state); ++static void exit_func(CUBE_STATE_T *state); ++ ++static void ++registry_handle_global(void *data, struct wl_registry *registry, ++ uint32_t name, const char *interface, uint32_t version) ++{ ++ CUBE_STATE_T *state = data; ++ ++ if (strcmp(interface, "wl_compositor") == 0) { ++ state->wl_compositor = ++ wl_registry_bind(registry, name, ++ &wl_compositor_interface, 1); ++ } else if (strcmp(interface, "wl_shell") == 0) { ++ state->wl_shell = wl_registry_bind(registry, name, ++ &wl_shell_interface, 1); ++ } ++} ++ ++static void ++registry_handle_global_remove(void *data, struct wl_registry *registry, ++ uint32_t name) ++{ ++} ++ ++static const struct wl_registry_listener registry_listener = { ++ registry_handle_global, ++ registry_handle_global_remove ++}; ++ ++/*********************************************************** ++ * Name: init_ogl ++ * ++ * Arguments: ++ * CUBE_STATE_T *state - holds OGLES model info ++ * ++ * Description: Sets the display, OpenGL|ES context and screen stuff ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void init_ogl(CUBE_STATE_T *state) ++{ ++ EGLBoolean result; ++ EGLint num_config; ++ ++ static const EGLint attribute_list[] = ++ { ++ EGL_RED_SIZE, 8, ++ EGL_GREEN_SIZE, 8, ++ EGL_BLUE_SIZE, 8, ++ EGL_ALPHA_SIZE, 8, ++ EGL_SURFACE_TYPE, EGL_WINDOW_BIT, ++ EGL_NONE ++ }; ++ ++ EGLConfig config; ++ ++ state->wl_display = wl_display_connect(NULL); ++ ++ state->wl_registry = wl_display_get_registry(state->wl_display); ++ wl_registry_add_listener(state->wl_registry, ®istry_listener, state); ++ ++ wl_display_dispatch(state->wl_display); ++ ++ // get an EGL display connection ++ state->display = eglGetDisplay(state->wl_display); ++ assert(state->display!=EGL_NO_DISPLAY); ++ ++ // initialize the EGL display connection ++ result = eglInitialize(state->display, NULL, NULL); ++ assert(EGL_FALSE != result); ++ ++ // get an appropriate EGL frame buffer configuration ++ result = eglChooseConfig(state->display, attribute_list, &config, 1, &num_config); ++ assert(EGL_FALSE != result); ++ ++ // create an EGL rendering context ++ state->context = eglCreateContext(state->display, config, EGL_NO_CONTEXT, NULL); ++ assert(state->context!=EGL_NO_CONTEXT); ++ ++ // create an EGL window surface ++ state->screen_width = 1024; ++ state->screen_height = 860; ++ ++ state->wl_surface = wl_compositor_create_surface(state->wl_compositor); ++ state->wl_shell_surface = wl_shell_get_shell_surface(state->wl_shell, state->wl_surface); ++ ++ wl_shell_surface_set_toplevel(state->wl_shell_surface); ++ wl_shell_surface_set_title(state->wl_shell_surface, "triangle.c"); ++ ++ state->wl_egl_window = wl_egl_window_create(state->wl_surface, state->screen_width, state->screen_height); ++ ++ state->surface = eglCreateWindowSurface( state->display, config, state->wl_egl_window, NULL ); ++ assert(state->surface != EGL_NO_SURFACE); ++ ++ // connect the context to the surface ++ result = eglMakeCurrent(state->display, state->surface, state->surface, state->context); ++ assert(EGL_FALSE != result); ++ ++ // Set background color and clear buffers ++ glClearColor(0.15f, 0.25f, 0.35f, 1.0f); ++ ++ // Enable back face culling. ++ glEnable(GL_CULL_FACE); ++ ++ glMatrixMode(GL_MODELVIEW); ++} ++ ++/*********************************************************** ++ * Name: init_model_proj ++ * ++ * Arguments: ++ * CUBE_STATE_T *state - holds OGLES model info ++ * ++ * Description: Sets the OpenGL|ES model to default values ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void init_model_proj(CUBE_STATE_T *state) ++{ ++ float nearp = 1.0f; ++ float farp = 500.0f; ++ float hht; ++ float hwd; ++ ++ glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); ++ ++ glViewport(0, 0, (GLsizei)state->screen_width, (GLsizei)state->screen_height); ++ ++ glMatrixMode(GL_PROJECTION); ++ glLoadIdentity(); ++ ++ hht = nearp * (float)tan(45.0 / 2.0 / 180.0 * M_PI); ++ hwd = hht * (float)state->screen_width / (float)state->screen_height; ++ ++ glFrustumf(-hwd, hwd, -hht, hht, nearp, farp); ++ ++ glEnableClientState( GL_VERTEX_ARRAY ); ++ glVertexPointer( 3, GL_BYTE, 0, quadx ); ++ ++ reset_model(state); ++} ++ ++/*********************************************************** ++ * Name: reset_model ++ * ++ * Arguments: ++ * CUBE_STATE_T *state - holds OGLES model info ++ * ++ * Description: Resets the Model projection and rotation direction ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void reset_model(CUBE_STATE_T *state) ++{ ++ // reset model position ++ glMatrixMode(GL_MODELVIEW); ++ glLoadIdentity(); ++ glTranslatef(0.f, 0.f, -50.f); ++ ++ // reset model rotation ++ state->rot_angle_x = 45.f; state->rot_angle_y = 30.f; state->rot_angle_z = 0.f; ++ state->rot_angle_x_inc = 0.5f; state->rot_angle_y_inc = 0.5f; state->rot_angle_z_inc = 0.f; ++ state->distance = 40.f; ++} ++ ++/*********************************************************** ++ * Name: update_model ++ * ++ * Arguments: ++ * CUBE_STATE_T *state - holds OGLES model info ++ * ++ * Description: Updates model projection to current position/rotation ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void update_model(CUBE_STATE_T *state) ++{ ++ // update position ++ state->rot_angle_x = inc_and_wrap_angle(state->rot_angle_x, state->rot_angle_x_inc); ++ state->rot_angle_y = inc_and_wrap_angle(state->rot_angle_y, state->rot_angle_y_inc); ++ state->rot_angle_z = inc_and_wrap_angle(state->rot_angle_z, state->rot_angle_z_inc); ++ state->distance = inc_and_clip_distance(state->distance, state->distance_inc); ++ ++ glLoadIdentity(); ++ // move camera back to see the cube ++ glTranslatef(0.f, 0.f, -state->distance); ++ ++ // Rotate model to new position ++ glRotatef(state->rot_angle_x, 1.f, 0.f, 0.f); ++ glRotatef(state->rot_angle_y, 0.f, 1.f, 0.f); ++ glRotatef(state->rot_angle_z, 0.f, 0.f, 1.f); ++} ++ ++/*********************************************************** ++ * Name: inc_and_wrap_angle ++ * ++ * Arguments: ++ * GLfloat angle current angle ++ * GLfloat angle_inc angle increment ++ * ++ * Description: Increments or decrements angle by angle_inc degrees ++ * Wraps to 0 at 360 deg. ++ * ++ * Returns: new value of angle ++ * ++ ***********************************************************/ ++static GLfloat inc_and_wrap_angle(GLfloat angle, GLfloat angle_inc) ++{ ++ angle += angle_inc; ++ ++ if (angle >= 360.0) ++ angle -= 360.f; ++ else if (angle <=0) ++ angle += 360.f; ++ ++ return angle; ++} ++ ++/*********************************************************** ++ * Name: inc_and_clip_distance ++ * ++ * Arguments: ++ * GLfloat distance current distance ++ * GLfloat distance_inc distance increment ++ * ++ * Description: Increments or decrements distance by distance_inc units ++ * Clips to range ++ * ++ * Returns: new value of angle ++ * ++ ***********************************************************/ ++static GLfloat inc_and_clip_distance(GLfloat distance, GLfloat distance_inc) ++{ ++ distance += distance_inc; ++ ++ if (distance >= 120.0f) ++ distance = 120.f; ++ else if (distance <= 40.0f) ++ distance = 40.0f; ++ ++ return distance; ++} ++ ++static pid_t get_server_pid(CUBE_STATE_T *state) ++{ ++ struct ucred ucred; ++ socklen_t len; ++ int fd; ++ ++ fd = wl_display_get_fd(state->wl_display); ++ len = sizeof ucred; ++ getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &len); ++ ++ return ucred.pid; ++} ++ ++static void ++frame(void *data, struct wl_callback *callback, uint32_t time) ++{ ++ CUBE_STATE_T *state = (CUBE_STATE_T *) data; ++ ++ state->needs_update = 1; ++} ++ ++static const struct wl_callback_listener frame_listener = { ++ frame ++}; ++ ++static void ++update(CUBE_STATE_T *state) ++{ ++ if (!state->single_frame || state->ellapsed_frames == 0) { ++ update_model(state); ++ redraw_scene(state); ++ } ++ ++ state->wl_callback = wl_surface_frame(state->wl_surface); ++ wl_callback_add_listener(state->wl_callback, &frame_listener, state); ++ ++ if (state->ellapsed_frames == 100) { ++ if (state->kill_compositor) { ++ fprintf(stderr, "reached frame 100, killing compositor\n"); ++ pid_t pid = get_server_pid(state); ++ kill(pid, SIGTERM); ++ } else if (state->terminate_abruptly) { ++ fprintf(stderr, "reached frame 100, terminating right away\n"); ++ exit_func(state); ++ exit(0); ++ } ++ } ++ ++ if (!state->single_frame || state->ellapsed_frames == 0) ++ eglSwapBuffers(state->display, state->surface); ++ else { ++ wl_surface_damage(state->wl_surface, 0, 0, state->screen_width, ++ state->screen_height); ++ wl_surface_commit(state->wl_surface); ++ } ++ ++ state->ellapsed_frames++; ++} ++ ++/*********************************************************** ++ * Name: redraw_scene ++ * ++ * Arguments: ++ * CUBE_STATE_T *state - holds OGLES model info ++ * ++ * Description: Draws the model and calls eglSwapBuffers ++ * to render to screen ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void redraw_scene(CUBE_STATE_T *state) ++{ ++ // Start with a clear screen ++ glClear( GL_COLOR_BUFFER_BIT ); ++ ++ // Draw first (front) face: ++ // Bind texture surface to current vertices ++ glBindTexture(GL_TEXTURE_2D, state->tex[0]); ++ ++ // Need to rotate textures - do this by rotating each cube face ++ glRotatef(270.f, 0.f, 0.f, 1.f ); // front face normal along z axis ++ ++ // draw first 4 vertices ++ glDrawArrays( GL_TRIANGLE_STRIP, 0, 4); ++ ++ // same pattern for other 5 faces - rotation chosen to make image orientation 'nice' ++ glBindTexture(GL_TEXTURE_2D, state->tex[1]); ++ glRotatef(90.f, 0.f, 0.f, 1.f ); // back face normal along z axis ++ glDrawArrays( GL_TRIANGLE_STRIP, 4, 4); ++ ++ glBindTexture(GL_TEXTURE_2D, state->tex[2]); ++ glRotatef(90.f, 1.f, 0.f, 0.f ); // left face normal along x axis ++ glDrawArrays( GL_TRIANGLE_STRIP, 8, 4); ++ ++ glBindTexture(GL_TEXTURE_2D, state->tex[3]); ++ glRotatef(90.f, 1.f, 0.f, 0.f ); // right face normal along x axis ++ glDrawArrays( GL_TRIANGLE_STRIP, 12, 4); ++ ++ glBindTexture(GL_TEXTURE_2D, state->tex[4]); ++ glRotatef(270.f, 0.f, 1.f, 0.f ); // top face normal along y axis ++ glDrawArrays( GL_TRIANGLE_STRIP, 16, 4); ++ ++ glBindTexture(GL_TEXTURE_2D, state->tex[5]); ++ glRotatef(90.f, 0.f, 1.f, 0.f ); // bottom face normal along y axis ++ glDrawArrays( GL_TRIANGLE_STRIP, 20, 4); ++} ++ ++/*********************************************************** ++ * Name: init_textures ++ * ++ * Arguments: ++ * CUBE_STATE_T *state - holds OGLES model info ++ * ++ * Description: Initialise OGL|ES texture surfaces to use image ++ * buffers ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void init_textures(CUBE_STATE_T *state) ++{ ++ // load three texture buffers but use them on six OGL|ES texture surfaces ++ load_tex_images(state); ++ glGenTextures(6, &state->tex[0]); ++ ++ // setup first texture ++ glBindTexture(GL_TEXTURE_2D, state->tex[0]); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, ++ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf1); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); ++ ++ // setup second texture - reuse first image ++ glBindTexture(GL_TEXTURE_2D, state->tex[1]); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, ++ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf1); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); ++ ++ // third texture ++ glBindTexture(GL_TEXTURE_2D, state->tex[2]); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, ++ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf2); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); ++ ++ // fourth texture - reuse second image ++ glBindTexture(GL_TEXTURE_2D, state->tex[3]); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, ++ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf2); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); ++ ++ //fifth texture ++ glBindTexture(GL_TEXTURE_2D, state->tex[4]); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, ++ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf3); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); ++ ++ // sixth texture - reuse third image ++ glBindTexture(GL_TEXTURE_2D, state->tex[5]); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, ++ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf3); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); ++ ++ // setup overall texture environment ++ glTexCoordPointer(2, GL_FLOAT, 0, texCoords); ++ glEnableClientState(GL_TEXTURE_COORD_ARRAY); ++ ++ glEnable(GL_TEXTURE_2D); ++} ++ ++/*********************************************************** ++ * Name: load_tex_images ++ * ++ * Arguments: ++ * void ++ * ++ * Description: Loads three raw images to use as textures on faces ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void load_tex_images(CUBE_STATE_T *state) ++{ ++ FILE *tex_file1 = NULL, *tex_file2=NULL, *tex_file3 = NULL; ++ int bytes_read, image_sz = IMAGE_SIZE*IMAGE_SIZE*3; ++ ++ state->tex_buf1 = malloc(image_sz); ++ state->tex_buf2 = malloc(image_sz); ++ state->tex_buf3 = malloc(image_sz); ++ ++ tex_file1 = fopen(PATH "Lucca_128_128.raw", "rb"); ++ if (tex_file1 && state->tex_buf1) ++ { ++ bytes_read=fread(state->tex_buf1, 1, image_sz, tex_file1); ++ assert(bytes_read == image_sz); // some problem with file? ++ fclose(tex_file1); ++ } ++ ++ tex_file2 = fopen(PATH "Djenne_128_128.raw", "rb"); ++ if (tex_file2 && state->tex_buf2) ++ { ++ bytes_read=fread(state->tex_buf2, 1, image_sz, tex_file2); ++ assert(bytes_read == image_sz); // some problem with file? ++ fclose(tex_file2); ++ } ++ ++ tex_file3 = fopen(PATH "Gaudi_128_128.raw", "rb"); ++ if (tex_file3 && state->tex_buf3) ++ { ++ bytes_read=fread(state->tex_buf3, 1, image_sz, tex_file3); ++ assert(bytes_read == image_sz); // some problem with file? ++ fclose(tex_file3); ++ } ++} ++ ++//------------------------------------------------------------------------------ ++ ++static void exit_func(CUBE_STATE_T *state) ++{ ++ // clear screen ++ glClear( GL_COLOR_BUFFER_BIT ); ++ eglSwapBuffers(state->display, state->surface); ++ ++ // Release OpenGL resources ++ eglMakeCurrent( state->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT ); ++ ++ wl_egl_window_destroy(state->wl_egl_window); ++ wl_shell_surface_destroy(state->wl_shell_surface); ++ wl_surface_destroy(state->wl_surface); ++ ++ eglDestroySurface( state->display, state->surface ); ++ eglDestroyContext( state->display, state->context ); ++ eglTerminate( state->display ); ++ ++ wl_display_flush(state->wl_display); ++ ++ // release texture buffers ++ free(state->tex_buf1); ++ free(state->tex_buf2); ++ free(state->tex_buf3); ++ ++ printf("\ncube closed\n"); ++} // exit_func() ++ ++static int running = 1; ++ ++static void ++signal_int(int signum) ++{ ++ running = 0; ++} ++ ++//============================================================================== ++ ++int main (int argc, char *argv[]) ++{ ++ struct sigaction sigint; ++ CUBE_STATE_T state = {0,}; ++ int ret = 0; ++ int i; ++ ++ for (i = 0; i < argc; i++) { ++ if (strcmp(argv[i], "--kill-compositor") == 0) ++ state.kill_compositor = 1; ++ if (strcmp(argv[i], "--single-frame") == 0) ++ state.single_frame = 1; ++ if (strcmp(argv[i], "--terminate-abruptly") == 0) ++ state.terminate_abruptly = 1; ++ else if (strcmp(argv[i], "--help") == 0 || ++ strcmp(argv[i], "-h") == 0) { ++ printf("Usage: hello_wayland.bin [OPTION]\n\n"); ++ printf("\t--kill-compositor\tkill the Wayland compositor after 100 frames\n"); ++ printf("\t-h, --help\t\tshow this text\n"); ++ printf("\t--single-frame\t\tupdate the display only once\n"); ++ printf("\t--terminate-abruptly\texit right after rendering the 100th frame\n"); ++ return 0; ++ } ++ } ++ ++ // Start OGLES ++ init_ogl(&state); ++ ++ // Setup the model world ++ init_model_proj(&state); ++ ++ // initialise the OGLES texture(s) ++ init_textures(&state); ++ ++ sigint.sa_handler = signal_int; ++ sigemptyset(&sigint.sa_mask); ++ sigint.sa_flags = SA_RESETHAND; ++ sigaction(SIGINT, &sigint, NULL); ++ ++ state.needs_update = 1; ++ while (running && ret != -1) { ++ if (state.needs_update) { ++ update(&state); ++ state.needs_update = 0; ++ } ++ ++ ret = wl_display_dispatch(state.wl_display); ++ } ++ ++ exit_func(&state); ++ ++ return 0; ++} ++ diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0004-wayland-egl-Add-bcm_host-to-dependencies.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0004-wayland-egl-Add-bcm_host-to-dependencies.patch new file mode 100644 index 00000000000..19608be2807 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0004-wayland-egl-Add-bcm_host-to-dependencies.patch @@ -0,0 +1,25 @@ +From 73e338f99f89bc85fe384759a385d95e904adb7f Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Mon, 10 Aug 2015 02:38:27 -0700 +Subject: [PATCH] wayland-egl: Add bcm_host to dependencies + +It uses headers like vcos_platform_types.h but does not +depend on module which should add the required include paths +lets add the dependency on bcm_host module which should do it + +Signed-off-by: Khem Raj +--- + interface/khronos/wayland-egl/wayland-egl.pc.in | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/interface/khronos/wayland-egl/wayland-egl.pc.in b/interface/khronos/wayland-egl/wayland-egl.pc.in +index 8bafc15..fd259c9 100644 +--- a/interface/khronos/wayland-egl/wayland-egl.pc.in ++++ b/interface/khronos/wayland-egl/wayland-egl.pc.in +@@ -6,5 +6,6 @@ includedir=${prefix}/include + Name: wayland-egl + Description: VideoCore wayland-egl library + Version: @PROJECT_APIVER@ ++Requires: bcm_host + Libs: -L${libdir} -lwayland-egl + Cflags: -I${includedir} diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0005-interface-remove-faulty-assert-to-make-weston-happy-.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0005-interface-remove-faulty-assert-to-make-weston-happy-.patch new file mode 100644 index 00000000000..27723236fe6 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0005-interface-remove-faulty-assert-to-make-weston-happy-.patch @@ -0,0 +1,26 @@ +From 8e79662e7b396325bee3f310a9406c74110cc7f4 Mon Sep 17 00:00:00 2001 +From: "Yann E. MORIN" +Date: Sat, 24 Jan 2015 22:07:19 +0100 +Subject: [PATCH] interface: remove faulty assert() to make weston happy at + runtime + +This was removed after a discussion on IRC with the weston guys +('daniels' on irc.freenode.net/#wayland). + +Signed-off-by: "Yann E. MORIN" +--- + interface/vmcs_host/vc_vchi_dispmanx.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/interface/vmcs_host/vc_vchi_dispmanx.c b/interface/vmcs_host/vc_vchi_dispmanx.c +index eab146e..29e0dee 100755 +--- a/interface/vmcs_host/vc_vchi_dispmanx.c ++++ b/interface/vmcs_host/vc_vchi_dispmanx.c +@@ -1306,7 +1306,6 @@ static void *dispmanx_notify_func( void *arg ) { + // Decrement the use count - the corresponding "use" is in vc_dispmanx_update_submit. + vchi_service_release(dispmanx_client.notify_handle[0]); + if (dispmanx_client.update_callback ) { +- vcos_assert( dispmanx_client.pending_update_handle == handle); + dispmanx_client.update_callback(handle, dispmanx_client.update_callback_param); + } + } else { diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0006-zero-out-wl-buffers-in-egl_surface_free.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0006-zero-out-wl-buffers-in-egl_surface_free.patch new file mode 100644 index 00000000000..5a1d8cf4aa8 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0006-zero-out-wl-buffers-in-egl_surface_free.patch @@ -0,0 +1,30 @@ +From 22652fec1206eb6e5b3c05e2c4933feffce922e8 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 6 Feb 2016 11:10:47 -0800 +Subject: [PATCH] zero-out wl buffers in egl_surface_free + +origins from buildroot + +Signed-off-by: Khem Raj +--- + interface/khronos/egl/egl_client_surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/interface/khronos/egl/egl_client_surface.c b/interface/khronos/egl/egl_client_surface.c +index 42350bf..1f923d9 100644 +--- a/interface/khronos/egl/egl_client_surface.c ++++ b/interface/khronos/egl/egl_client_surface.c +@@ -690,11 +690,13 @@ void egl_surface_free(EGL_SURFACE_T *surface) + if (surface->back_wl_buffer) { + wl_buffer_destroy(surface->back_wl_buffer->wl_buffer); + free(surface->back_wl_buffer); ++ surface->back_wl_buffer = 0; + } + + if (surface->front_wl_buffer) { + wl_buffer_destroy(surface->front_wl_buffer->wl_buffer); + free(surface->front_wl_buffer); ++ surface->front_wl_buffer = 0; + } + #endif + } diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0007-initialize-front-back-wayland-buffers.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0007-initialize-front-back-wayland-buffers.patch new file mode 100644 index 00000000000..bae39e1441b --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0007-initialize-front-back-wayland-buffers.patch @@ -0,0 +1,31 @@ +From 5c0fb637f8b1286da19b904c7be1692a4aa61244 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 6 Feb 2016 11:11:41 -0800 +Subject: [PATCH] initialize front back wayland buffers + +origins from metrological wayland support + +Signed-off-by: Khem Raj +--- + interface/khronos/egl/egl_client_surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/interface/khronos/egl/egl_client_surface.c b/interface/khronos/egl/egl_client_surface.c +index 1f923d9..9a9582c 100644 +--- a/interface/khronos/egl/egl_client_surface.c ++++ b/interface/khronos/egl/egl_client_surface.c +@@ -401,11 +401,14 @@ EGL_SURFACE_T *egl_surface_create( + #ifdef BUILD_WAYLAND + if (type == WINDOW && wl_display) { + surface->wl_egl_window = (struct wl_egl_window*)win; ++ surface->front_wl_buffer = NULL; + surface->back_wl_buffer = allocate_wl_buffer( + surface->wl_egl_window, color); + resource = surface->back_wl_buffer->resource; + } else { + surface->wl_egl_window = NULL; ++ surface->front_wl_buffer = NULL; ++ surface->back_wl_buffer = NULL; + resource = DISPMANX_NO_HANDLE; + } + #endif diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0008-Remove-RPC_FLUSH.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0008-Remove-RPC_FLUSH.patch new file mode 100644 index 00000000000..1c15009515c --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0008-Remove-RPC_FLUSH.patch @@ -0,0 +1,24 @@ +From 18839d288b60aa3592ba5a3ac4ac44eb8328a793 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 6 Feb 2016 11:09:18 -0800 +Subject: [PATCH] Remove RPC_FLUSH + +Origins from buildroot + +Signed-off-by: Khem Raj +--- + interface/khronos/ext/gl_oes_egl_image_client.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/interface/khronos/ext/gl_oes_egl_image_client.c b/interface/khronos/ext/gl_oes_egl_image_client.c +index f9b7287..b04ffef 100644 +--- a/interface/khronos/ext/gl_oes_egl_image_client.c ++++ b/interface/khronos/ext/gl_oes_egl_image_client.c +@@ -107,7 +107,6 @@ GL_API void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageO + GLEGLIMAGETARGETTEXTURE2DOES_ID, + RPC_ENUM(target), + RPC_EGLID(image)); +- RPC_FLUSH(thread); + #if EGL_BRCM_global_image + } + #endif diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0009-fix-cmake-dependency-race.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0009-fix-cmake-dependency-race.patch new file mode 100644 index 00000000000..7d28453ada6 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0009-fix-cmake-dependency-race.patch @@ -0,0 +1,75 @@ +From f324e2724973aa76d054c3662d5d0903fd405390 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 6 Feb 2016 13:12:47 -0800 +Subject: [PATCH] fix cmake dependency race + +Fixes errors like + +/a/builder/mnt/build-oe/tmp-glibc/work/raspberrypi2-oe-linux-gnueabi/userland/git-r5/git/interface/vmcs_host/vc_vchi_dispmanx.h:72:66: +fatal error: interface/vmcs_host/wayland-dispmanx-server-protocol.h: No +such file or directory +compilation terminated. +interface/khronos/CMakeFiles/EGL_static.dir/build.make:773: recipe for +target 'interface/khronos/CMakeFiles/EGL_static.dir/ext/egl_wayland.c.o' +failed +make[2]: *** +[interface/khronos/CMakeFiles/EGL_static.dir/ext/egl_wayland.c.o] Error 1 + +Signed-off-by: Khem Raj +--- + interface/vcos/pthreads/CMakeLists.txt | 8 ++++++++ + interface/vmcs_host/CMakeLists.txt | 8 -------- + interface/vmcs_host/vc_vchi_dispmanx.h | 2 +- + 3 files changed, 9 insertions(+), 9 deletions(-) + +diff --git a/interface/vcos/pthreads/CMakeLists.txt b/interface/vcos/pthreads/CMakeLists.txt +index 1d81ca3..d6cd415 100644 +--- a/interface/vcos/pthreads/CMakeLists.txt ++++ b/interface/vcos/pthreads/CMakeLists.txt +@@ -33,6 +33,14 @@ set (SOURCES + ../generic/vcos_generic_blockpool.c + ) + ++if (BUILD_WAYLAND) ++wayland_add_protocol_server( ++ SOURCES ++ ../../../interface/wayland/dispmanx.xml ++ dispmanx ++) ++endif () ++ + if (VCOS_PTHREADS_BUILD_SHARED) + add_library (vcos SHARED ${SOURCES}) + target_link_libraries (vcos pthread dl rt) +diff --git a/interface/vmcs_host/CMakeLists.txt b/interface/vmcs_host/CMakeLists.txt +index 552312a..775742d 100755 +--- a/interface/vmcs_host/CMakeLists.txt ++++ b/interface/vmcs_host/CMakeLists.txt +@@ -15,14 +15,6 @@ set(VCHOSTIF_SOURCE + # ${VMCS_TARGET}/vmcs_main.c + # vc_vchi_haud.c + +-if (BUILD_WAYLAND) +-wayland_add_protocol_server( +- VCHOSTIF_SOURCE +- ../../interface/wayland/dispmanx.xml +- dispmanx +-) +-endif () +- + add_library(vchostif ${VCHOSTIF_SOURCE}) + + #add_library(bufman vc_vchi_bufman.c ) +diff --git a/interface/vmcs_host/vc_vchi_dispmanx.h b/interface/vmcs_host/vc_vchi_dispmanx.h +index f0bae30..8c44c58 100644 +--- a/interface/vmcs_host/vc_vchi_dispmanx.h ++++ b/interface/vmcs_host/vc_vchi_dispmanx.h +@@ -69,7 +69,7 @@ typedef struct { + #ifdef BUILD_WAYLAND + /* XXX: This should be in a private header that can be included from EGL and vc_* */ + #include +-#include "interface/vmcs_host/wayland-dispmanx-server-protocol.h" ++#include "interface/vcos/pthreads/wayland-dispmanx-server-protocol.h" + struct wl_dispmanx_server_buffer { + struct wl_resource *resource; + struct wl_dispmanx *dispmanx; diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0010-Fix-for-framerate-with-nested-composition.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0010-Fix-for-framerate-with-nested-composition.patch new file mode 100644 index 00000000000..b6a4c589ed6 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0010-Fix-for-framerate-with-nested-composition.patch @@ -0,0 +1,57 @@ +From 09de2ce12ed8a879cc822cd20c5f2756d030808a Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Tue, 29 Mar 2016 20:38:30 -0700 +Subject: [PATCH] Fix for framerate with nested composition + +frame rate appears irregular and lower than expected when using nested composition. + +Signed-off-by: Khem Raj +--- + interface/khronos/egl/egl_client.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/interface/khronos/egl/egl_client.c b/interface/khronos/egl/egl_client.c +index 03fe67b..13a110c 100644 +--- a/interface/khronos/egl/egl_client.c ++++ b/interface/khronos/egl/egl_client.c +@@ -2342,6 +2342,9 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + surface->back_wl_buffer = buffer; + } + ++ glFlush(); ++ glFinish(); ++ + RPC_CALL7(eglIntSwapBuffers_impl, + thread, + EGLINTSWAPBUFFERS_ID_V2, +@@ -2353,6 +2356,8 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + RPC_UINT(khrn_platform_get_window_position(surface->win)), + RPC_INT(surface->back_wl_buffer->resource)); + ++ RPC_FLUSH(thread); ++ + surface->front_wl_buffer->in_use = 1; + wl_surface_attach(wl_egl_window->wl_surface, + surface->front_wl_buffer->wl_buffer, +@@ -2360,11 +2365,13 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + wl_surface_damage(wl_egl_window->wl_surface, 0, 0, + surface->width, surface->height); + wl_surface_commit(wl_egl_window->wl_surface); ++ wl_display_flush(wl_display); + + while(ret != -1 && surface->back_wl_buffer->in_use) + ret = wl_display_dispatch_queue(wl_display, process->wl_queue); + } else + #endif ++ { + RPC_CALL6(eglIntSwapBuffers_impl, + thread, + EGLINTSWAPBUFFERS_ID, +@@ -2376,6 +2383,7 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + RPC_UINT(khrn_platform_get_window_position(surface->win))); + + RPC_FLUSH(thread); ++ } + + #ifdef ANDROID + CLIENT_UNLOCK(); diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0011-build-shared-library-for-vchostif.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0011-build-shared-library-for-vchostif.patch new file mode 100644 index 00000000000..0d8ccd15e5d --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0011-build-shared-library-for-vchostif.patch @@ -0,0 +1,25 @@ +From 140df8cbf93fc3295f57bffeb254adeb0b17d3a0 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 2 Apr 2016 10:37:24 -0700 +Subject: [PATCH] build shared library for vchostif + +Fixes #149 + +Signed-off-by: Khem Raj +--- + interface/vmcs_host/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/interface/vmcs_host/CMakeLists.txt b/interface/vmcs_host/CMakeLists.txt +index 775742d..76813c9 100755 +--- a/interface/vmcs_host/CMakeLists.txt ++++ b/interface/vmcs_host/CMakeLists.txt +@@ -15,7 +15,7 @@ set(VCHOSTIF_SOURCE + # ${VMCS_TARGET}/vmcs_main.c + # vc_vchi_haud.c + +-add_library(vchostif ${VCHOSTIF_SOURCE}) ++add_library(vchostif SHARED ${VCHOSTIF_SOURCE}) + + #add_library(bufman vc_vchi_bufman.c ) + set(INSTALL_TARGETS vchostif) diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0012-implement-buffer-wrapping-interface-for-dispmanx.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0012-implement-buffer-wrapping-interface-for-dispmanx.patch new file mode 100644 index 00000000000..e652cc2d582 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0012-implement-buffer-wrapping-interface-for-dispmanx.patch @@ -0,0 +1,89 @@ +From bdb5bbe994b91a7c64ca6103fbf2bbd590e6b8e5 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 2 Apr 2016 10:54:59 -0700 +Subject: [PATCH] implement buffer wrapping interface for dispmanx + +Courtesy: Zan Dobersek + +Signed-off-by: Khem Raj +--- + interface/khronos/ext/egl_wayland.c | 42 +++++++++++++++++++++++++++++ + interface/wayland/dispmanx.xml | 10 +++++++ + 2 files changed, 52 insertions(+) + +diff --git a/interface/khronos/ext/egl_wayland.c b/interface/khronos/ext/egl_wayland.c +index 5730743..9ef89cd 100644 +--- a/interface/khronos/ext/egl_wayland.c ++++ b/interface/khronos/ext/egl_wayland.c +@@ -133,8 +133,50 @@ dispmanx_create_buffer(struct wl_client *client, struct wl_resource *resource, + buffer->handle); + } + ++static void ++dispmanx_wrap_buffer(struct wl_client *client, struct wl_resource *resource, ++ uint32_t id, uint32_t handle, int32_t width, int32_t height, ++ uint32_t stride, uint32_t buffer_height, uint32_t format) ++{ ++ struct wl_dispmanx_server_buffer *buffer; ++ VC_IMAGE_TYPE_T vc_format = get_vc_format(format); ++ uint32_t dummy; ++ ++ if(vc_format == VC_IMAGE_MIN) { ++ wl_resource_post_error(resource, ++ WL_DISPMANX_ERROR_INVALID_FORMAT, ++ "invalid format"); ++ return; ++ } ++ ++ buffer = calloc(1, sizeof *buffer); ++ if (buffer == NULL) { ++ wl_resource_post_no_memory(resource); ++ return; ++ } ++ ++ buffer->handle = handle; ++ buffer->width = width; ++ buffer->height = height; ++ buffer->format = format; ++ ++ buffer->resource = wl_resource_create(resource->client, &wl_buffer_interface, ++ 1, id); ++ if (!buffer->resource) { ++ wl_resource_post_no_memory(resource); ++ vc_dispmanx_resource_delete(buffer->handle); ++ free(buffer); ++ return; ++ } ++ ++ wl_resource_set_implementation(buffer->resource, ++ (void (**)(void)) &dispmanx_buffer_interface, ++ buffer, destroy_buffer); ++} ++ + static const struct wl_dispmanx_interface dispmanx_interface = { + dispmanx_create_buffer, ++ dispmanx_wrap_buffer, + }; + + static void +diff --git a/interface/wayland/dispmanx.xml b/interface/wayland/dispmanx.xml +index c18626d..11ed1ef 100644 +--- a/interface/wayland/dispmanx.xml ++++ b/interface/wayland/dispmanx.xml +@@ -118,6 +118,16 @@ + + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0013-Implement-triple-buffering-for-wayland.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0013-Implement-triple-buffering-for-wayland.patch new file mode 100644 index 00000000000..b60928ab8c1 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0013-Implement-triple-buffering-for-wayland.patch @@ -0,0 +1,87 @@ +From ffdcdf7605f4f266b408cf161e7c76dab54d689b Mon Sep 17 00:00:00 2001 +From: Jeff Wannamaker +Date: Thu, 19 Jan 2017 18:56:07 +0000 +Subject: [PATCH] Implement triple buffering for wayland + +Change from double to triple buffering for wayland. +This enables higher frame rates without tearing artifacts +by allowing both the glFinish and the buffer release +interlock to operate without pushing the frame period +to two vertical intervals + +Signed-off-by: Jeff Wannamaker +Signed-off-by: Khem Raj +--- + interface/khronos/egl/egl_client.c | 3 ++- + interface/khronos/egl/egl_client_surface.c | 8 ++++++++ + interface/khronos/egl/egl_client_surface.h | 11 +++++++++++ + 3 files changed, 21 insertions(+), 1 deletion(-) + +diff --git a/interface/khronos/egl/egl_client.c b/interface/khronos/egl/egl_client.c +index 13a110c..0380274 100644 +--- a/interface/khronos/egl/egl_client.c ++++ b/interface/khronos/egl/egl_client.c +@@ -2323,7 +2323,8 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + + buffer_temp = surface->front_wl_buffer; + surface->front_wl_buffer = surface->back_wl_buffer; +- surface->back_wl_buffer = buffer_temp; ++ surface->back_wl_buffer = surface->middle_wl_buffer; ++ surface->middle_wl_buffer = buffer_temp; + + configid = egl_config_to_id(surface->config); + color = egl_config_get_color_format(configid); +diff --git a/interface/khronos/egl/egl_client_surface.c b/interface/khronos/egl/egl_client_surface.c +index 9a9582c..10b3b04 100644 +--- a/interface/khronos/egl/egl_client_surface.c ++++ b/interface/khronos/egl/egl_client_surface.c +@@ -402,12 +402,14 @@ EGL_SURFACE_T *egl_surface_create( + if (type == WINDOW && wl_display) { + surface->wl_egl_window = (struct wl_egl_window*)win; + surface->front_wl_buffer = NULL; ++ surface->middle_wl_buffer = NULL; + surface->back_wl_buffer = allocate_wl_buffer( + surface->wl_egl_window, color); + resource = surface->back_wl_buffer->resource; + } else { + surface->wl_egl_window = NULL; + surface->front_wl_buffer = NULL; ++ surface->middle_wl_buffer = NULL; + surface->back_wl_buffer = NULL; + resource = DISPMANX_NO_HANDLE; + } +@@ -696,6 +698,12 @@ void egl_surface_free(EGL_SURFACE_T *surface) + surface->back_wl_buffer = 0; + } + ++ if (surface->middle_wl_buffer) { ++ wl_buffer_destroy(surface->middle_wl_buffer->wl_buffer); ++ free(surface->middle_wl_buffer); ++ surface->middle_wl_buffer = 0; ++ } ++ + if (surface->front_wl_buffer) { + wl_buffer_destroy(surface->front_wl_buffer->wl_buffer); + free(surface->front_wl_buffer); +diff --git a/interface/khronos/egl/egl_client_surface.h b/interface/khronos/egl/egl_client_surface.h +index e328b77..58a3184 100644 +--- a/interface/khronos/egl/egl_client_surface.h ++++ b/interface/khronos/egl/egl_client_surface.h +@@ -312,6 +312,17 @@ typedef struct { + */ + struct wl_dispmanx_client_buffer *front_wl_buffer; + ++ /* ++ middle_wl_buffer ++ ++ Validity: ++ type == WINDOW ++ ++ Invariant: ++ client-side information about the wl_buffer in the middle ++ */ ++ struct wl_dispmanx_client_buffer *middle_wl_buffer; ++ + /* + back_wl_buffer + diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0014-GLES2-gl2ext.h-Define-GL_R8_EXT-and-GL_RG8_EXT.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0014-GLES2-gl2ext.h-Define-GL_R8_EXT-and-GL_RG8_EXT.patch new file mode 100644 index 00000000000..7e637a0edae --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0014-GLES2-gl2ext.h-Define-GL_R8_EXT-and-GL_RG8_EXT.patch @@ -0,0 +1,32 @@ +From 4624c934d1a783968306e61ded4389c153e3d009 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Wed, 10 May 2017 06:39:34 +0000 +Subject: [PATCH] GLES2/gl2ext.h: Define GL_R8_EXT and GL_RG8_EXT + +weston code uses these defines +Upstream-Status: Pending + +Signed-off-by: Khem Raj +--- + interface/khronos/include/GLES2/gl2ext.h | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/interface/khronos/include/GLES2/gl2ext.h b/interface/khronos/include/GLES2/gl2ext.h +index 4eacf7f..b1acc9f 100644 +--- a/interface/khronos/include/GLES2/gl2ext.h ++++ b/interface/khronos/include/GLES2/gl2ext.h +@@ -327,6 +327,14 @@ typedef void* GLeglImageOES; + #define GL_RGBX_BRCM 0x80EE + #endif + ++#ifndef GL_EXT_texture_rg ++#define GL_EXT_texture_rg 1 ++#define GL_RED_EXT 0x1903 ++#define GL_RG_EXT 0x8227 ++#define GL_R8_EXT 0x8229 ++#define GL_RG8_EXT 0x822B ++#endif /* GL_EXT_texture_rg */ ++ + /* GL_EXT_texture_type_2_10_10_10_REV */ + #ifndef GL_EXT_texture_type_2_10_10_10_REV + #define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0015-EGL-glplatform.h-define-EGL_CAST.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0015-EGL-glplatform.h-define-EGL_CAST.patch new file mode 100644 index 00000000000..1c2e5bc8392 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0015-EGL-glplatform.h-define-EGL_CAST.patch @@ -0,0 +1,29 @@ +From 528a439539a77e67bf136d425eac3240ca6f1cd7 Mon Sep 17 00:00:00 2001 +From: Andrea Galbusera +Date: Fri, 14 Jul 2017 09:52:54 +0200 +Subject: [PATCH] EGL/glplatform.h: define EGL_CAST + +C++ / C typecast macros for special EGL handle values: used by libepoxy code +The definition comes from the updated version of this header in mesa. + +Upstream-Status: Pending +--- + interface/khronos/include/EGL/eglplatform.h | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/interface/khronos/include/EGL/eglplatform.h b/interface/khronos/include/EGL/eglplatform.h +index 1f7c930..c39d425 100644 +--- a/interface/khronos/include/EGL/eglplatform.h ++++ b/interface/khronos/include/EGL/eglplatform.h +@@ -202,4 +202,11 @@ EGLAPI void EGLAPIENTRY BEGL_GetDefaultDriverInterfaces(BEGL_DriverInterfaces *i + #include "interface/khronos/common/khrn_client_mangle.h" + #endif + ++/* C++ / C typecast macros for special EGL handle values */ ++#if defined(__cplusplus) ++#define EGL_CAST(type, value) (static_cast(value)) ++#else ++#define EGL_CAST(type, value) ((type) (value)) ++#endif ++ + #endif /* __eglplatform_h */ diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0016-Allow-multiple-wayland-compositor-state-data-per-pro.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0016-Allow-multiple-wayland-compositor-state-data-per-pro.patch new file mode 100644 index 00000000000..fa7984c331b --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0016-Allow-multiple-wayland-compositor-state-data-per-pro.patch @@ -0,0 +1,141 @@ +From c5969e5e5c50e2c9b32c6f945040a8e5763ba06c Mon Sep 17 00:00:00 2001 +From: Jeff Wannamaker +Date: Sat, 27 Jan 2018 12:28:31 -0500 +Subject: [PATCH] Allow multiple wayland compositor state data per process + +When eglBindWaylandDisplayWL is called store the wl_global +created in a list associated with the wayland display. +This allows multiple wayland compositor instances to be +created and used per process. This scenario is common for +applications integrating externl process UI elements +via embedded composition e.g. westeros + +Signed-off-by: Jeff Wannamaker +Signed-off-by: Khem Raj +--- + interface/khronos/common/khrn_client.c | 2 +- + interface/khronos/common/khrn_client.h | 11 +++++- + interface/khronos/ext/egl_wayland.c | 50 ++++++++++++++++++++++---- + 3 files changed, 55 insertions(+), 8 deletions(-) + +diff --git a/interface/khronos/common/khrn_client.c b/interface/khronos/common/khrn_client.c +index d7e798e..60bdb63 100644 +--- a/interface/khronos/common/khrn_client.c ++++ b/interface/khronos/common/khrn_client.c +@@ -147,7 +147,7 @@ bool client_process_state_init(CLIENT_PROCESS_STATE_T *process) + { + if (!process->inited) { + #ifdef BUILD_WAYLAND +- process->wl_global = NULL; ++ process->wlStateMap = NULL; + #endif + + if (!khrn_pointer_map_init(&process->contexts, 64)) +diff --git a/interface/khronos/common/khrn_client.h b/interface/khronos/common/khrn_client.h +index 615f7b4..4fa86f7 100644 +--- a/interface/khronos/common/khrn_client.h ++++ b/interface/khronos/common/khrn_client.h +@@ -170,6 +170,15 @@ static INLINE CLIENT_THREAD_STATE_T *CLIENT_GET_CHECK_THREAD_STATE(void) + return (CLIENT_THREAD_STATE_T *)platform_tls_get_check(client_tls); + } + ++#ifdef BUILD_WAYLAND ++typedef struct WAYLAND_STATE ++{ ++ struct WAYLAND_STATE *next; ++ struct wl_display *display; ++ struct wl_global *wl_global; ++} WAYLAND_STATE_T; ++#endif ++ + /* + per-process state + +@@ -318,7 +327,7 @@ struct CLIENT_PROCESS_STATE { + struct wl_event_queue *wl_queue; + + /* Compositor-side Wayland state */ +- struct wl_global *wl_global; ++ WAYLAND_STATE_T *wlStateMap; + #endif + }; + +diff --git a/interface/khronos/ext/egl_wayland.c b/interface/khronos/ext/egl_wayland.c +index 9ef89cd..abd5ab3 100644 +--- a/interface/khronos/ext/egl_wayland.c ++++ b/interface/khronos/ext/egl_wayland.c +@@ -208,17 +208,38 @@ eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display) + { + CLIENT_THREAD_STATE_T *thread; + CLIENT_PROCESS_STATE_T *process; ++ WAYLAND_STATE_T *stateIter; ++ WAYLAND_STATE_T *stateNew; ++ struct wl_global *wl_global; + + if (!CLIENT_LOCK_AND_GET_STATES(dpy, &thread, &process)) + return EGL_FALSE; + +- if (process->wl_global != NULL) ++ stateIter= process->wlStateMap; ++ while( stateIter ) ++ { ++ if ( stateIter->display == display ) ++ goto error; ++ stateIter= stateIter->next; ++ } ++ ++ wl_global = wl_global_create(display, &wl_dispmanx_interface, 1, ++ NULL, bind_dispmanx); ++ if (wl_global == NULL) + goto error; + +- process->wl_global = wl_global_create(display, &wl_dispmanx_interface, 1, +- NULL, bind_dispmanx); +- if (process->wl_global == NULL) ++ stateNew= (WAYLAND_STATE_T*)calloc( 1, sizeof(WAYLAND_STATE_T)); ++ if (stateNew == NULL ) ++ { ++ wl_global_destroy(wl_global); + goto error; ++ } ++ ++ stateNew->next= process->wlStateMap; ++ stateNew->display= display; ++ stateNew->wl_global= wl_global; ++ process->wlStateMap= stateNew; ++ CLIENT_UNLOCK(); + + return EGL_TRUE; + +@@ -232,12 +253,29 @@ eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display) + { + CLIENT_THREAD_STATE_T *thread; + CLIENT_PROCESS_STATE_T *process; ++ WAYLAND_STATE_T *stateIter; ++ WAYLAND_STATE_T *statePrev; + + if (!CLIENT_LOCK_AND_GET_STATES(dpy, &thread, &process)) + return EGL_FALSE; + +- wl_global_destroy(process->wl_global); +- process->wl_global = NULL; ++ statePrev= NULL; ++ stateIter= process->wlStateMap; ++ while( stateIter ) ++ { ++ if ( stateIter->display == display ) ++ { ++ wl_global_destroy(stateIter->wl_global); ++ if ( statePrev ) ++ statePrev->next= stateIter->next; ++ else ++ process->wlStateMap= stateIter->next; ++ free( stateIter ); ++ break; ++ } ++ statePrev= stateIter; ++ stateIter= stateIter->next; ++ } + + CLIENT_UNLOCK(); + diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0017-khronos-backport-typedef-for-EGL_EXT_image_dma_buf_i.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0017-khronos-backport-typedef-for-EGL_EXT_image_dma_buf_i.patch new file mode 100644 index 00000000000..97340d7ef1a --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0017-khronos-backport-typedef-for-EGL_EXT_image_dma_buf_i.patch @@ -0,0 +1,34 @@ +From 8091dac73f792fb000e7ec97de6be23cd84b7cb7 Mon Sep 17 00:00:00 2001 +From: Hugo Hromic +Date: Sun, 13 May 2018 10:49:04 +0100 +Subject: [PATCH] khronos: backport typedef for EGL_EXT_image_dma_buf_import + +The `gstreamer1.0-plugins-base` package version `1.14` uses `EGL_EXT_image_dma_buf_import`, which +expects the `EGLuint64KHR` typedef that is present in recent versions of Khronos. +However, the older version included in userland does not provide it. + +This patch backports the missing typedef from recent Khronos into userland. +See: + +Submitted to userland in + +Upstream-Status: Submitted +--- + interface/khronos/include/EGL/eglext.h | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/interface/khronos/include/EGL/eglext.h b/interface/khronos/include/EGL/eglext.h +index d7e5ba7..dcc90ce 100755 +--- a/interface/khronos/include/EGL/eglext.h ++++ b/interface/khronos/include/EGL/eglext.h +@@ -190,6 +190,10 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSy + typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); + #endif + ++#ifndef EGL_KHR_uint64_typedef ++#define EGL_KHR_uint64_typedef 1 ++typedef khronos_uint64_t EGLuint64KHR; ++#endif /* EGL_KHR_uint64_typedef */ + + #ifndef EGL_WL_bind_wayland_display + #define EGL_WL_bind_wayland_display 1 diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0018-Add-EGL_IMG_context_priority-related-defines.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0018-Add-EGL_IMG_context_priority-related-defines.patch new file mode 100644 index 00000000000..88434893ee0 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0018-Add-EGL_IMG_context_priority-related-defines.patch @@ -0,0 +1,32 @@ +From 214f1895db14e3a88d5b2b3b6c844af3890e2eba Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sun, 15 Jul 2018 00:48:38 -0700 +Subject: [PATCH] Add EGL_IMG_context_priority related defines + +These defines are needed for compiling weston 4.x +taken from Khronos headers + +Signed-off-by: Khem Raj +--- + interface/khronos/include/EGL/eglext.h | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/interface/khronos/include/EGL/eglext.h b/interface/khronos/include/EGL/eglext.h +index dcc90ce..6842bf9 100755 +--- a/interface/khronos/include/EGL/eglext.h ++++ b/interface/khronos/include/EGL/eglext.h +@@ -93,6 +93,14 @@ typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGL + typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image); + #endif + ++#ifndef EGL_IMG_context_priority ++#define EGL_IMG_context_priority 1 ++#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3102 ++#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101 ++#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102 ++#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103 ++#endif /* EGL_IMG_context_priority */ ++ + #ifndef EGL_KHR_vg_parent_image + #define EGL_KHR_vg_parent_image 1 + #define EGL_VG_PARENT_IMAGE_KHR 0x30BA /* eglCreateImageKHR target */ diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0019-libfdt-Undefine-__wordsize-if-already-defined.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0019-libfdt-Undefine-__wordsize-if-already-defined.patch new file mode 100644 index 00000000000..841341e033c --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0019-libfdt-Undefine-__wordsize-if-already-defined.patch @@ -0,0 +1,28 @@ +From bcdc525b2e4403f9e878e93cbd0d146ce9e37bb8 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Thu, 25 Jul 2019 23:30:27 -0700 +Subject: [PATCH] libfdt: Undefine __wordsize if already defined + +glibc 2.30+ defines __wordsize, which is same so its easier to compile +for multiple versions of glibc even ones which does not have this define + +Signed-off-by: Khem Raj +--- + opensrc/helpers/libfdt/libfdt_env.h | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/opensrc/helpers/libfdt/libfdt_env.h b/opensrc/helpers/libfdt/libfdt_env.h +index f4608be..5e83a27 100644 +--- a/opensrc/helpers/libfdt/libfdt_env.h ++++ b/opensrc/helpers/libfdt/libfdt_env.h +@@ -18,6 +18,10 @@ + #include + #include + ++#ifdef __bitwise ++#undef __bitwise ++#endif ++ + #ifdef __CHECKER__ + #define FDT_FORCE __attribute__((force)) + #define FDT_BITWISE __attribute__((bitwise)) diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0020-openmaxil-add-pkg-config-file.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0020-openmaxil-add-pkg-config-file.patch new file mode 100644 index 00000000000..65fc5eb5ef1 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0020-openmaxil-add-pkg-config-file.patch @@ -0,0 +1,40 @@ +From 372b3b75945300604c9b7b012ecb25c0548a1495 Mon Sep 17 00:00:00 2001 +From: Martin Jansa +Date: Wed, 13 Jun 2018 18:22:22 +0000 +Subject: [PATCH] openmaxil: add pkg-config file + +--- + CMakeLists.txt | 2 +- + pkgconfig/openmaxil.pc.in | 10 ++++++++++ + 2 files changed, 11 insertions(+), 1 deletion(-) + create mode 100644 pkgconfig/openmaxil.pc.in + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 80337b2..3e3c90e 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -133,7 +133,7 @@ include_directories("${PROJECT_BINARY_DIR}") + include(FindPkgConfig QUIET) + if(PKG_CONFIG_FOUND) + # Produce a pkg-config file +- foreach(PCFILE bcm_host.pc brcmegl.pc brcmglesv2.pc brcmvg.pc vcsm.pc mmal.pc) ++ foreach(PCFILE bcm_host.pc brcmegl.pc brcmglesv2.pc brcmvg.pc vcsm.pc mmal.pc openmaxil.pc) + configure_file("pkgconfig/${PCFILE}.in" "${PCFILE}" @ONLY) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PCFILE}" + DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig") +diff --git a/pkgconfig/openmaxil.pc.in b/pkgconfig/openmaxil.pc.in +new file mode 100644 +index 0000000..8793a61 +--- /dev/null ++++ b/pkgconfig/openmaxil.pc.in +@@ -0,0 +1,10 @@ ++prefix=@CMAKE_INSTALL_PREFIX@ ++exec_prefix=${prefix} ++libdir=${exec_prefix}/lib ++includedir=${prefix}/include ++ ++Name: openmaxil ++Description: Broadcom openmaxil library ++Version: 1 ++Libs: -L${libdir} -lopenmaxil -lvcos -lvchiq_arm -pthread ++Cflags: -I${includedir} -I${includedir}/IL -I${includedir}/interface/vmcs_host/linux -I${includedir}/interface/vcos/pthreads -DUSE_VCHIQ_ARM diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0021-cmake-Disable-format-overflow-warning-as-error.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0021-cmake-Disable-format-overflow-warning-as-error.patch new file mode 100644 index 00000000000..43f9f29cd6a --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0021-cmake-Disable-format-overflow-warning-as-error.patch @@ -0,0 +1,34 @@ +From d08003ab30452b4268121bcf82e03fdf21c89cdd Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Tue, 31 Mar 2020 11:51:02 -0700 +Subject: [PATCH] cmake: Disable format-overflow warning as error + +gcc10 complains about a check which could potentially be null + +build/inc/interface/vcos/vcos_logging.h:234:88: error: '%s' directive argument is null [-Werror=format-overflow=] + 234 | # define _VCOS_LOG_X(cat, _level, fmt...) do { if (vcos_is_log_enabled(cat,_level)) vcos_log_impl(cat,_level,fmt); } while (0) + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A potential fix would be to check for fmt not being null but lets leave +that to experts + +Upstream-Status: Pending + +Signed-off-by: Khem Raj +--- + host_applications/linux/libs/bcm_host/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/host_applications/linux/libs/bcm_host/CMakeLists.txt b/host_applications/linux/libs/bcm_host/CMakeLists.txt +index 2f4beb9..7a4ab06 100644 +--- a/host_applications/linux/libs/bcm_host/CMakeLists.txt ++++ b/host_applications/linux/libs/bcm_host/CMakeLists.txt +@@ -3,7 +3,7 @@ if (WIN32) + set(VCOS_PLATFORM win32) + else () + set(VCOS_PLATFORM pthreads) +- add_definitions(-Wall -Werror) ++ add_definitions(-Wall -Werror -Wno-error=format-overflow) + endif () + + # set this as we want all the source of vchostif to be available in libbcm_host diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0022-all-host_applications-remove-non-existent-projects.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0022-all-host_applications-remove-non-existent-projects.patch new file mode 100644 index 00000000000..595eefb3cc1 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0022-all-host_applications-remove-non-existent-projects.patch @@ -0,0 +1,30 @@ +From 451e8458e45926e4e1c0433864ac4cf8b05d792b Mon Sep 17 00:00:00 2001 +From: Trevor Woerner +Date: Fri, 27 Nov 2020 03:12:26 -0500 +Subject: [PATCH] all host_applications: remove non-existent projects + +The ALL_APPS symbol will optionally build an additional set of projects, +however, several of them don't exist anymore. Remove them from the list of +ALL_APPS. + +Upstream-status: submitted [https://github.com/raspberrypi/userland/pull/661] +Signed-off-by: Trevor Woerner +--- + host_applications/linux/CMakeLists.txt | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/host_applications/linux/CMakeLists.txt b/host_applications/linux/CMakeLists.txt +index 928b637..554ae46 100644 +--- a/host_applications/linux/CMakeLists.txt ++++ b/host_applications/linux/CMakeLists.txt +@@ -14,10 +14,6 @@ add_subdirectory(apps/dtoverlay) + add_subdirectory(apps/dtmerge) + + if(ALL_APPS) +- add_subdirectory(apps/vcdbg) +- add_subdirectory(libs/elftoolchain) +- # add_subdirectory(apps/smct) +- add_subdirectory(apps/edid_parser) + add_subdirectory(apps/hello_pi) + endif() + diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0023-hello_pi-optionally-build-wayland-specific-app.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0023-hello_pi-optionally-build-wayland-specific-app.patch new file mode 100644 index 00000000000..642ee86c54e --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0023-hello_pi-optionally-build-wayland-specific-app.patch @@ -0,0 +1,28 @@ +From 5f4324a0008c2e8e1f511432f98bf85c9fffd35c Mon Sep 17 00:00:00 2001 +From: Trevor Woerner +Date: Fri, 27 Nov 2020 03:18:50 -0500 +Subject: [PATCH] hello_pi: optionally build wayland-specific app + +Only build the wayland-specific hello_pi app when building for wayland. + +Upstream-status: inappropriate [the wayland example is not part of upstream] +Signed-off-by: Trevor Woerner +--- + host_applications/linux/apps/hello_pi/CMakeLists.txt | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/host_applications/linux/apps/hello_pi/CMakeLists.txt b/host_applications/linux/apps/hello_pi/CMakeLists.txt +index 2849fad..7de3265 100644 +--- a/host_applications/linux/apps/hello_pi/CMakeLists.txt ++++ b/host_applications/linux/apps/hello_pi/CMakeLists.txt +@@ -25,7 +25,9 @@ add_subdirectory(hello_encode) + add_subdirectory(hello_jpeg) + add_subdirectory(hello_videocube) + add_subdirectory(hello_teapot) +-add_subdirectory(hello_wayland) ++if (BUILD_WAYLAND) ++ add_subdirectory(hello_wayland) ++endif() + + if(BUILD_FONT) + set(VGFONT_SRCS libs/vgfont/font.c libs/vgfont/vgft.c libs/vgfont/graphics.c) diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/files/0024-userland-Sync-needed-defines-for-weston-build.patch b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0024-userland-Sync-needed-defines-for-weston-build.patch new file mode 100644 index 00000000000..ec74cc22057 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/files/0024-userland-Sync-needed-defines-for-weston-build.patch @@ -0,0 +1,38 @@ +From 4a3e515d3ea7ff0fc4063b9677b056af4ee7a3f6 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Wed, 2 Dec 2020 14:28:01 -0800 +Subject: [PATCH] userland: Sync needed defines for weston build + +eglext.h from userland is not sufficient to compile latest weston, +therefore import needed defines and typedefs from latest mesa + +Signed-off-by: Khem Raj +--- + interface/khronos/include/EGL/eglext.h | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/interface/khronos/include/EGL/eglext.h b/interface/khronos/include/EGL/eglext.h +index 6842bf9..7118e92 100755 +--- a/interface/khronos/include/EGL/eglext.h ++++ b/interface/khronos/include/EGL/eglext.h +@@ -225,6 +225,20 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWL) (EGLDisplay dpy, st + + #endif + ++typedef void* EGLSyncKHR; ++typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETDAMAGEREGIONKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); ++typedef EGLint (EGLAPIENTRYP PFNEGLWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags); ++#ifndef EGL_ANDROID_native_fence_sync ++#define EGL_ANDROID_native_fence_sync 1 ++#define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144 ++#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145 ++#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID 0x3146 ++#define EGL_NO_NATIVE_FENCE_FD_ANDROID -1 ++typedef EGLint (EGLAPIENTRYP PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy, EGLSyncKHR sync); ++#ifdef EGL_EGLEXT_PROTOTYPES ++EGLAPI EGLint EGLAPIENTRY eglDupNativeFenceFDANDROID (EGLDisplay dpy, EGLSyncKHR sync); ++#endif ++#endif /* EGL_ANDROID_native_fence_sync */ + + #ifdef __cplusplus + } diff --git a/bsp/meta-raspberrypi/recipes-graphics/userland/userland_git.bb b/bsp/meta-raspberrypi/recipes-graphics/userland/userland_git.bb new file mode 100644 index 00000000000..6fdedd32fd0 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/userland/userland_git.bb @@ -0,0 +1,108 @@ +DESCRIPTION = "This repository contains the source code for the ARM side \ +libraries used on Raspberry Pi. These typically are installed in /opt/vc/lib \ +and includes source for the ARM side code to interface to: EGL, mmal, GLESv2,\ +vcos, openmaxil, vchiq_arm, bcm_host, WFC, OpenVG." +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENCE;md5=0448d6488ef8cc380632b1569ee6d196" + +PROVIDES += "${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "", "virtual/libgles2 virtual/egl", d)}" +PROVIDES += "virtual/libomxil" + +RPROVIDES_${PN} += "${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "", "libgles2 egl libegl libegl1 libglesv2-2", d)}" +COMPATIBLE_MACHINE = "^rpi$" + +SRCBRANCH = "master" +SRCFORK = "raspberrypi" +SRCREV = "3fd8527eefd8790b4e8393458efc5f94eb21a615" + +# Use the date of the above commit as the package version. Update this when +# SRCREV is changed. +PV = "20210319" + +SRC_URI = "\ + git://github.com/${SRCFORK}/userland.git;protocol=https;branch=${SRCBRANCH} \ + file://0001-Allow-applications-to-set-next-resource-handle.patch \ + file://0002-wayland-Add-support-for-the-Wayland-winsys.patch \ + file://0003-wayland-Add-Wayland-example.patch \ + file://0004-wayland-egl-Add-bcm_host-to-dependencies.patch \ + file://0005-interface-remove-faulty-assert-to-make-weston-happy-.patch \ + file://0006-zero-out-wl-buffers-in-egl_surface_free.patch \ + file://0007-initialize-front-back-wayland-buffers.patch \ + file://0008-Remove-RPC_FLUSH.patch \ + file://0009-fix-cmake-dependency-race.patch \ + file://0010-Fix-for-framerate-with-nested-composition.patch \ + file://0011-build-shared-library-for-vchostif.patch \ + file://0012-implement-buffer-wrapping-interface-for-dispmanx.patch \ + file://0013-Implement-triple-buffering-for-wayland.patch \ + file://0014-GLES2-gl2ext.h-Define-GL_R8_EXT-and-GL_RG8_EXT.patch \ + file://0015-EGL-glplatform.h-define-EGL_CAST.patch \ + file://0016-Allow-multiple-wayland-compositor-state-data-per-pro.patch \ + file://0017-khronos-backport-typedef-for-EGL_EXT_image_dma_buf_i.patch \ + file://0018-Add-EGL_IMG_context_priority-related-defines.patch \ + file://0019-libfdt-Undefine-__wordsize-if-already-defined.patch \ + file://0020-openmaxil-add-pkg-config-file.patch \ + file://0021-cmake-Disable-format-overflow-warning-as-error.patch \ + file://0022-all-host_applications-remove-non-existent-projects.patch \ + file://0023-hello_pi-optionally-build-wayland-specific-app.patch \ + file://0024-userland-Sync-needed-defines-for-weston-build.patch \ +" + +SRC_URI_remove_toolchain-clang = "file://0021-cmake-Disable-format-overflow-warning-as-error.patch" + +S = "${WORKDIR}/git" + +inherit cmake pkgconfig + +ASNEEDED = "" + +EXTRA_OECMAKE = "-DCMAKE_BUILD_TYPE=Release -DCMAKE_EXE_LINKER_FLAGS='-Wl,--no-as-needed' \ + -DVMCS_INSTALL_PREFIX=${exec_prefix} \ +" + +EXTRA_OECMAKE_append_aarch64 = " -DARM64=ON " + + +PACKAGECONFIG ?= "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', '', d)}" + +PACKAGECONFIG[wayland] = "-DBUILD_WAYLAND=TRUE -DWAYLAND_SCANNER_EXECUTABLE:FILEPATH=${STAGING_BINDIR_NATIVE}/wayland-scanner,,wayland-native wayland" +PACKAGECONFIG[allapps] = "-DALL_APPS=true,,," + +CFLAGS_append = " -fPIC" + +do_install_append () { + for f in `find ${D}${includedir}/interface/vcos/ -name "*.h"`; do + sed -i 's/include "vcos_platform.h"/include "pthreads\/vcos_platform.h"/g' ${f} + sed -i 's/include "vcos_futex_mutex.h"/include "pthreads\/vcos_futex_mutex.h"/g' ${f} + sed -i 's/include "vcos_platform_types.h"/include "pthreads\/vcos_platform_types.h"/g' ${f} + done + rm -rf ${D}${prefix}${sysconfdir} + if [ "${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "1", "0", d)}" = "1" ]; then + rm -rf ${D}${libdir}/libEGL* + rm -rf ${D}${libdir}/libGLES* + rm -rf ${D}${libdir}/libwayland-* + rm -rf ${D}${libdir}/pkgconfig/egl.pc ${D}${libdir}/pkgconfig/glesv2.pc \ + ${D}${libdir}/pkgconfig/wayland-egl.pc + rm -rf ${D}${includedir}/EGL ${D}${includedir}/GLES* ${D}${includedir}/KHR + else + ln -sf brcmglesv2.pc ${D}${libdir}/pkgconfig/glesv2.pc + ln -sf brcmegl.pc ${D}${libdir}/pkgconfig/egl.pc + ln -sf brcmvg.pc ${D}${libdir}/pkgconfig/vg.pc + fi +} + +# Shared libs from userland package build aren't versioned, so we need +# to force the .so files into the runtime package (and keep them +# out of -dev package). +FILES_SOLIBSDEV = "" +INSANE_SKIP_${PN} += "dev-so" + +FILES_${PN} += " \ + ${libdir}/*.so \ + ${libdir}/plugins" +FILES_${PN}-dev += "${includedir} \ + ${prefix}/src" +FILES_${PN}-doc += "${datadir}/install" +FILES_${PN}-dbg += "${libdir}/plugins/.debug" + +RDEPENDS_${PN} += "bash" +RDEPENDS_${PN} += "${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "libegl-mesa", "", d)}" diff --git a/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/files/egl.pc b/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/files/egl.pc new file mode 100644 index 00000000000..c3142022c0c --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/files/egl.pc @@ -0,0 +1,10 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: egl +Description: egl for RaspberryPI +Version: 0.0 +Libs: -L${libdir} -lEGL -lGLESv2 +Cflags: -I${includedir}/vc -I${includedir}/interface -I${includedir}/interface/vcos -I${includedir}/interface/vcos/pthreads diff --git a/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/files/vchiq.sh b/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/files/vchiq.sh new file mode 100644 index 00000000000..c73e3a9c6b3 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/files/vchiq.sh @@ -0,0 +1,24 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: vchiq.sh +# Required-Start: $remote_fs rmnologin +# Required-Stop: +# Default-Start: S +# Default-Stop: +# Short-Description: Create /dev/vchiq. +# Description: Get the major number from /proc/devices and use it +# ti create /dev/vchiq +### END INIT INFO + +rm -f /dev/vchiq + +#Get the major number +major=$(awk "\$2==\"vchiq\" {print \$1}" /proc/devices) + +if [ -z "$major" ]; then + echo "Error: Cannot find vchiq in /proc/devices" + exit 2 +else + mknod /dev/vchiq c "$major" 0 + chmod a+w /dev/vchiq +fi diff --git a/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics-hardfp.bb b/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics-hardfp.bb new file mode 100644 index 00000000000..0db71fdb0ce --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics-hardfp.bb @@ -0,0 +1,6 @@ +CONFLICTS = "vc-graphics" + +VCDIR = "hardfp/opt/vc" +require vc-graphics.inc + +PR = "${INCPR}.0" diff --git a/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.bb b/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.bb new file mode 100644 index 00000000000..a1bce567b32 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.bb @@ -0,0 +1,6 @@ +CONFLICTS = "vc-graphics-hardfp" + +VCDIR = "opt/vc" +require vc-graphics.inc + +PR = "${INCPR}.0" diff --git a/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.inc b/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.inc new file mode 100644 index 00000000000..540e2895487 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.inc @@ -0,0 +1,54 @@ +DESCRIPTION = "Graphics libraries for BCM2835." +LICENSE = "Broadcom-RPi" + +LIC_FILES_CHKSUM = "file://LICENCE;md5=86e53f5f5909ee66900418028de11780" + +PROVIDES = "virtual/libgles2 virtual/egl" +COMPATIBLE_MACHINE = "^rpi$" + +INHIBIT_DEFAULT_DEPS = "1" + +include recipes-bsp/common/raspberrypi-firmware.inc + +SRC_URI += " \ + file://egl.pc \ + file://vchiq.sh \ +" + +S = "${RPIFW_S}/${VCDIR}" + +INCPR = "r1" + +inherit pkgconfig update-rc.d + +do_install () { + install -d ${D}${bindir} + cp -R bin/* ${D}${bindir} + + install -d ${D}${libdir} + # note: -H option to deref symlinked .so + cp -R -H lib/* ${D}${libdir} + + install -d ${D}${includedir} + cp -R include/* ${D}${includedir} + + install -d ${D}${libdir}/pkgconfig + install -m 0644 ${WORKDIR}/egl.pc ${D}${libdir}/pkgconfig/ + + install -d ${D}/${sysconfdir}/init.d + install -m 0755 ${WORKDIR}/vchiq.sh ${D}${sysconfdir}/init.d/ +} + +# These are proprietary binaries generated elsewhere so don't check ldflags +INSANE_SKIP_${PN} = "ldflags" + +INITSCRIPT_NAME = "vchiq.sh" +INITSCRIPT_PARAMS = "start 03 S ." + +FILES_${PN} = "${bindir}/* \ + ${libdir}/lib*.so \ + ${sysconfdir}/init.d \ + ${libdir}/plugins" +FILES_${PN}-dev = "${libdir}/pkgconfig \ + ${includedir}" +FILES_${PN}-dbg += "${libdir}/plugins/.debug" diff --git a/bsp/meta-raspberrypi/recipes-graphics/wayland/wayland_%.bbappend b/bsp/meta-raspberrypi/recipes-graphics/wayland/wayland_%.bbappend new file mode 100644 index 00000000000..e5bbf4aaabb --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/wayland/wayland_%.bbappend @@ -0,0 +1,7 @@ +# until fully tested, prefer `libwayland-egl` provided by `userland` instead of `wayland` when not using vc4graphics +do_install_append_rpi () { + if [ "${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "1", "0", d)}" = "0" ]; then + rm -f ${D}${libdir}/libwayland-egl* + rm -f ${D}${libdir}/pkgconfig/wayland-egl.pc + fi +} diff --git a/bsp/meta-raspberrypi/recipes-graphics/wayland/weston_%.bbappend b/bsp/meta-raspberrypi/recipes-graphics/wayland/weston_%.bbappend new file mode 100644 index 00000000000..55cf7007b00 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/wayland/weston_%.bbappend @@ -0,0 +1,10 @@ +PACKAGECONFIG_remove_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', 'fbdev', '', d)}" + +EXTRA_OECONF_append_rpi = " \ + --disable-xwayland-test \ + --disable-simple-egl-clients \ + ${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', ' \ + --disable-resize-optimization \ + --disable-setuid-install \ + ', d)} \ +" diff --git a/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf b/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf new file mode 100644 index 00000000000..6fd52985fb6 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf @@ -0,0 +1,6 @@ +# Initial xorg.conf for the RaspberryPi +# Most things are setup automatically by magic pixies in the system. +# +# It is suggested this file is not used any more and configuration +# snippets are placed in xorg.conf.d instead. +# diff --git a/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/98-pitft.conf b/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/98-pitft.conf new file mode 100644 index 00000000000..0d2b36b2e4b --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/98-pitft.conf @@ -0,0 +1,5 @@ +Section "Device" + Identifier "Adafruit PiTFT" + Driver "fbdev" + Option "fbdev" "/dev/fb1" +EndSection diff --git a/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/99-calibration.conf b/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/99-calibration.conf new file mode 100644 index 00000000000..f8b578c015d --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/99-calibration.conf @@ -0,0 +1,6 @@ +Section "InputClass" + Identifier "calibration" + MatchProduct "stmpe-ts" + Option "Calibration" "3800 200 200 3800" + Option "SwapAxes" "1" +EndSection diff --git a/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config_%.bbappend b/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config_%.bbappend new file mode 100644 index 00000000000..71e0adcd4f3 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config_%.bbappend @@ -0,0 +1,16 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +SRC_URI_append_rpi = " \ + file://xorg.conf.d/98-pitft.conf \ + file://xorg.conf.d/99-calibration.conf \ +" +do_install_append_rpi () { + PITFT="${@bb.utils.contains("MACHINE_FEATURES", "pitft", "1", "0", d)}" + if [ "${PITFT}" = "1" ]; then + install -d ${D}/${sysconfdir}/X11/xorg.conf.d/ + install -m 0644 ${WORKDIR}/xorg.conf.d/98-pitft.conf ${D}/${sysconfdir}/X11/xorg.conf.d/ + install -m 0644 ${WORKDIR}/xorg.conf.d/99-calibration.conf ${D}/${sysconfdir}/X11/xorg.conf.d/ + fi +} + +FILES_${PN}_rpi += "${sysconfdir}/X11/xorg.conf ${sysconfdir}/X11/xorg.conf.d/*" diff --git a/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xorg_%.bbappend b/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xorg_%.bbappend new file mode 100644 index 00000000000..9574fa5b8a9 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xorg_%.bbappend @@ -0,0 +1,5 @@ +OPENGL_PKGCONFIGS_rpi = "dri glx ${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', 'dri3 xshmfence glamor', '', d)}" + +# when using userland graphic KHR/khrplatform.h is provided by userland but virtual/libgl is provided by mesa-gl where +# we explicitly delete KHR/khrplatform.h since its already coming from userland package +DEPENDS_append_rpi = " ${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', 'userland', d)}" diff --git a/bsp/meta-raspberrypi/recipes-kernel/bluez-firmware-rpidistro/bluez-firmware-rpidistro_git.bb b/bsp/meta-raspberrypi/recipes-kernel/bluez-firmware-rpidistro/bluez-firmware-rpidistro_git.bb new file mode 100644 index 00000000000..450206c361d --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-kernel/bluez-firmware-rpidistro/bluez-firmware-rpidistro_git.bb @@ -0,0 +1,100 @@ +SUMMARY = "Linux kernel Bluetooth firmware files from Raspbian distribution" +DESCRIPTION = "Updated Bluetooth firmware files for RaspberryPi hardware. \ +RPi-Distro obtains these directly from Cypress; they are not submitted \ +to linux-firmware for general use." +HOMEPAGE = "https://github.com/RPi-Distro/bluez-firmware" +SECTION = "kernel" + +# Upstream has provided[^1] licensing information in the Debian +# copyright file. The wording of the Cypress license subsequently +# changed in linux-firmware. +# +# Rather than make assumptions about what's supposed to be what, we'll +# use the license implied by the source of these files, named to avoid +# conflicts with linux-firmware. +# +# [^1]: https://github.com/RPi-Distro/bluez-firmware/issues/1 +LICENSE = "Firmware-cypress-rpidistro" +LIC_FILES_CHKSUM = "\ + file://LICENCE.cypress-rpidistro;md5=c5d12ae0b24ef7177902a8e288751a4e \ +" + +# These are not common licenses, set NO_GENERIC_LICENSE for them +# so that the license files will be copied from fetched source +NO_GENERIC_LICENSE[Firmware-cypress-rpidistro] = "LICENCE.cypress-rpidistro" + +SRC_URI = "git://github.com/RPi-Distro/bluez-firmware;branch=master;protocol=https" +SRCREV = "e7fd166981ab4bb9a36c2d1500205a078a35714d" +PV = "1.2-4+rpt8" + +S = "${WORKDIR}/git" + +inherit allarch + +CLEANBROKEN = "1" + +do_extract_lic() { + # Extract the license from the Debian copyright file + sed -e '1,23d' ${S}/debian/copyright > ${S}/LICENCE.cypress-rpidistro +} +# Must be before both do_install and do_populate_lic. Putting it before +# their common ancestor works; other approaches do not. +addtask extract_lic after do_unpack before do_patch + +do_compile() { + : +} + +do_install() { + install -d ${D}${nonarch_base_libdir}/firmware/brcm + + cp LICENCE.cypress-rpidistro ${D}${nonarch_base_libdir}/firmware + install -m 0644 broadcom/BCM434*.hcd ${D}${nonarch_base_libdir}/firmware/brcm/ +} + +PACKAGES = "\ + ${PN}-cypress-license \ + ${PN}-bcm43430a1-hcd \ + ${PN}-bcm43430b0-hcd \ + ${PN}-bcm4345c0-hcd \ + ${PN}-bcm4345c5-hcd \ +" + +LICENSE_${PN}-bcm43430a1-hcd = "Firmware-cypress-rpidistro" +LICENSE_${PN}-bcm43430b0-hcd = "Firmware-cypress-rpidistro" +LICENSE_${PN}-bcm4345c0-hcd = "Firmware-cypress-rpidistro" +LICENSE_${PN}-bcm4345c5-hcd = "Firmware-cypress-rpidistro" +LICENSE_${PN}-cypress-license = "Firmware-cypress-rpidistro" + +FILES_${PN}-cypress-license = "\ + ${nonarch_base_libdir}/firmware/LICENCE.cypress-rpidistro \ +" +FILES_${PN}-bcm43430a1-hcd = "\ + ${nonarch_base_libdir}/firmware/brcm/BCM43430A1.hcd \ +" +FILES_${PN}-bcm43430b0-hcd = "\ + ${nonarch_base_libdir}/firmware/brcm/BCM43430B0.hcd \ +" +FILES_${PN}-bcm4345c0-hcd = "\ + ${nonarch_base_libdir}/firmware/brcm/BCM4345C0.hcd \ +" +FILES_${PN}-bcm4345c5-hcd = "\ + ${nonarch_base_libdir}/firmware/brcm/BCM4345C5.hcd \ +" + +RDEPENDS_${PN}-bcm43430a1-hcd += "${PN}-cypress-license" +RDEPENDS_${PN}-bcm43430b0-hcd += "${PN}-cypress-license" +RDEPENDS_${PN}-bcm4345c0-hcd += "${PN}-cypress-license" +RDEPENDS_${PN}-bcm4345c5-hcd += "${PN}-cypress-license" +RCONFLICTS_${PN}-bcm43430a1-hcd = "linux-firmware-bcm43430a1-hcd" +RREPLACES_${PN}-bcm43430a1-hcd = "linux-firmware-bcm43430a1-hcd" +RCONFLICTS_${PN}-bcm43430b0-hcd = "linux-firmware-bcm43430b0-hcd" +RREPLACES_${PN}-bcm43430b0-hcd = "linux-firmware-bcm43430b0-hcd" +RCONFLICTS_${PN}-bcm43435c0-hcd = "linux-firmware-bcm4345c0-hcd" +RREPLACES_${PN}-bcm43435c0-hcd = "linux-firmware-bcm4345c0-hcd" +RCONFLICTS_${PN}-bcm43435c5-hcd = "linux-firmware-bcm4345c5-hcd" +RREPLACES_${PN}-bcm43435c5-hcd = "linux-firmware-bcm4345c5-hcd" + +# Firmware files are generally not run on the CPU, so they can be +# allarch despite being architecture specific +INSANE_SKIP = "arch" diff --git a/bsp/meta-raspberrypi/recipes-kernel/linux-firmware-rpidistro/linux-firmware-rpidistro_git.bb b/bsp/meta-raspberrypi/recipes-kernel/linux-firmware-rpidistro/linux-firmware-rpidistro_git.bb new file mode 100644 index 00000000000..f1b566daf69 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-kernel/linux-firmware-rpidistro/linux-firmware-rpidistro_git.bb @@ -0,0 +1,116 @@ +SUMMARY = "Linux kernel firmware files from Raspbian distribution" +DESCRIPTION = "Updated firmware files for RaspberryPi hardware. \ +RPi-Distro obtains these directly from Cypress; they are not submitted \ +to linux-firmware for general use." +HOMEPAGE = "https://github.com/RPi-Distro/firmware-nonfree" +SECTION = "kernel" + +# In maintained upstream linux-firmware: +# * brcmfmac43430-sdio falls under LICENCE.cypress +# * brcmfmac43455-sdio falls under LICENCE.broadcom_bcm43xx +# * brcmfmac43456-sdio falls under LICENCE.broadcom_bcm43xx +# +# It is likely[^1] that both of these should be under LICENCE.cypress. +# Further, at this time the text of LICENCE.broadcom_bcm43xx is the same +# in linux-firmware and RPi-Distro/firmware-nonfree, but this may +# change. +# +# Rather than make assumptions about what's supposed to be what, we'll +# use the license implied by the source of these files, named to avoid +# conflicts with linux-firmware. +# +# [^1]: https://github.com/RPi-Distro/bluez-firmware/issues/1 +LICENSE = "\ + Firmware-broadcom_bcm43xx-rpidistro \ + & WHENCE \ +" +LIC_FILES_CHKSUM = "\ + file://LICENCE.broadcom_bcm43xx;md5=3160c14df7228891b868060e1951dfbc \ + file://WHENCE;md5=7b12b2224438186e4c97c4c7f3a5cc28 \ +" + +# These are not common licenses, set NO_GENERIC_LICENSE for them +# so that the license files will be copied from fetched source +NO_GENERIC_LICENSE[Firmware-broadcom_bcm43xx-rpidistro] = "LICENCE.broadcom_bcm43xx" +NO_GENERIC_LICENSE[WHENCE] = "WHENCE" + +SRC_URI = "git://github.com/RPi-Distro/firmware-nonfree;branch=buster;protocol=https" + +SRCREV = "83938f78ca2d5a0ffe0c223bb96d72ccc7b71ca5" +PV = "20190114-1+rpt11" + +S = "${WORKDIR}/git" + +inherit allarch + +CLEANBROKEN = "1" + +do_compile() { + : +} + +do_install() { + install -d ${D}${nonarch_base_libdir}/firmware/brcm + + cp ./LICENCE.broadcom_bcm43xx ${D}${nonarch_base_libdir}/firmware/LICENCE.broadcom_bcm43xx-rpidistro + + # Replace outdated linux-firmware files with updated ones from + # raspbian firmware-nonfree. Raspbian adds blobs and nvram + # definitions that are also necessary so copy those too. + for fw in brcmfmac43430-sdio brcmfmac43455-sdio brcmfmac43456-sdio ; do + install -m 0644 brcm/${fw}.* ${D}${nonarch_base_libdir}/firmware/brcm/ + done + # add compat links. Fixes errors like + # brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43455-sdio.raspberrypi,4-model-b.txt failed with error -2 + ln -s brcmfmac43455-sdio.txt ${D}${nonarch_base_libdir}/firmware/brcm/brcmfmac43455-sdio.raspberrypi,4-model-b.txt + ln -s brcmfmac43455-sdio.txt ${D}${nonarch_base_libdir}/firmware/brcm/brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt + ln -s brcmfmac43430-sdio.txt ${D}${nonarch_base_libdir}/firmware/brcm/brcmfmac43430-sdio.raspberrypi,3-model-b.txt + ln -s brcmfmac43430-sdio.txt ${D}${nonarch_base_libdir}/firmware/brcm/brcmfmac43430-sdio.raspberrypi,model-zero-w.txt +} + +PACKAGES = "\ + ${PN}-broadcom-license \ + ${PN}-bcm43430 \ + ${PN}-bcm43455 \ + ${PN}-bcm43456 \ +" + +LICENSE_${PN}-bcm43430 = "Firmware-broadcom_bcm43xx-rpidistro" +LICENSE_${PN}-bcm43455 = "Firmware-broadcom_bcm43xx-rpidistro" +LICENSE_${PN}-bcm43456 = "Firmware-broadcom_bcm43xx-rpidistro" +LICENSE_${PN}-broadcom-license = "Firmware-broadcom_bcm43xx-rpidistro" +FILES_${PN}-broadcom-license = "${nonarch_base_libdir}/firmware/LICENCE.broadcom_bcm43xx-rpidistro" +FILES_${PN}-bcm43430 = "${nonarch_base_libdir}/firmware/brcm/brcmfmac43430*" +FILES_${PN}-bcm43455 = "${nonarch_base_libdir}/firmware/brcm/brcmfmac43455*" +FILES_${PN}-bcm43456 = "${nonarch_base_libdir}/firmware/brcm/brcmfmac43456*" +RDEPENDS_${PN}-bcm43430 += "${PN}-broadcom-license" +RDEPENDS_${PN}-bcm43455 += "${PN}-broadcom-license" +RDEPENDS_${PN}-bcm43456 += "${PN}-broadcom-license" +RCONFLICTS_${PN}-bcm43430 = "\ + linux-firmware-bcm43430 \ + linux-firmware-raspbian-bcm43430 \ +" +RREPLACES_${PN}-bcm43430 = "\ + linux-firmware-bcm43430 \ + linux-firmware-raspbian-bcm43430 \ +" +RCONFLICTS_${PN}-bcm43455 = "\ + linux-firmware-bcm43455 \ + linux-firmware-raspbian-bcm43455 \ +" +RREPLACES_${PN}-bcm43455 = "\ + linux-firmware-bcm43455 \ + linux-firmware-raspbian-bcm43455 \ +" +RCONFLICTS_${PN}-bcm43456 = "\ + linux-firmware-bcm43456 \ + linux-firmware-raspbian-bcm43456 \ +" +RREPLACES_${PN}-bcm43456 = "\ + linux-firmware-bcm43456 \ + linux-firmware-raspbian-bcm43456 \ +" + +# Firmware files are generally not run on the CPU, so they can be +# allarch despite being architecture specific +INSANE_SKIP = "arch" diff --git a/bsp/meta-raspberrypi/recipes-kernel/linux/files/0001-Revert-selftests-bpf-Skip-perf-hw-events-test-if-the.patch b/bsp/meta-raspberrypi/recipes-kernel/linux/files/0001-Revert-selftests-bpf-Skip-perf-hw-events-test-if-the.patch new file mode 100644 index 00000000000..66efde13869 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-kernel/linux/files/0001-Revert-selftests-bpf-Skip-perf-hw-events-test-if-the.patch @@ -0,0 +1,35 @@ +From 754e3030788702c1f013a88a4fc8546742d84e27 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Thu, 18 Jun 2020 13:45:04 -0700 +Subject: [PATCH] Revert "selftests/bpf: Skip perf hw events test if the setup + disabled it" + +This reverts commit da43712a7262891317883d4b3a909fb18dac4b1d. + +Signed-off-by: Khem Raj +--- + .../selftests/bpf/prog_tests/stacktrace_build_id_nmi.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c b/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c +index 437cb93e72ac..f62aa0eb959b 100644 +--- a/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c ++++ b/tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c +@@ -49,12 +49,8 @@ void test_stacktrace_build_id_nmi(void) + pmu_fd = syscall(__NR_perf_event_open, &attr, -1 /* pid */, + 0 /* cpu 0 */, -1 /* group id */, + 0 /* flags */); +- if (pmu_fd < 0 && errno == ENOENT) { +- printf("%s:SKIP:no PERF_COUNT_HW_CPU_CYCLES\n", __func__); +- test__skip(); +- goto close_prog; +- } +- if (CHECK(pmu_fd < 0, "perf_event_open", "err %d errno %d\n", ++ if (CHECK(pmu_fd < 0, "perf_event_open", ++ "err %d errno %d. Does the test host support PERF_COUNT_HW_CPU_CYCLES?\n", + pmu_fd, errno)) + goto close_prog; + +-- +2.27.0 + diff --git a/bsp/meta-raspberrypi/recipes-kernel/linux/files/0002-Revert-selftests-bpf-Fix-perf_buffer-test-on-systems.patch b/bsp/meta-raspberrypi/recipes-kernel/linux/files/0002-Revert-selftests-bpf-Fix-perf_buffer-test-on-systems.patch new file mode 100644 index 00000000000..d18b942bc98 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-kernel/linux/files/0002-Revert-selftests-bpf-Fix-perf_buffer-test-on-systems.patch @@ -0,0 +1,94 @@ +From 366487b86a8c87954fb4ab7bd88ab49a929a32f6 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Mon, 13 Apr 2020 11:25:58 -0700 +Subject: [PATCH 2/2] Revert "selftests/bpf: Fix perf_buffer test on systems w/ + offline CPUs" + +This reverts commit 77bb53cb094828a31cd3c5b402899810f63073c1. +--- + .../selftests/bpf/prog_tests/perf_buffer.c | 29 ++++--------------- + 1 file changed, 5 insertions(+), 24 deletions(-) + +diff --git a/tools/testing/selftests/bpf/prog_tests/perf_buffer.c b/tools/testing/selftests/bpf/prog_tests/perf_buffer.c +index cf6c87936c69..3003fddc0613 100644 +--- a/tools/testing/selftests/bpf/prog_tests/perf_buffer.c ++++ b/tools/testing/selftests/bpf/prog_tests/perf_buffer.c +@@ -4,7 +4,6 @@ + #include + #include + #include +-#include "libbpf_internal.h" + + static void on_sample(void *ctx, int cpu, void *data, __u32 size) + { +@@ -20,7 +19,7 @@ static void on_sample(void *ctx, int cpu, void *data, __u32 size) + + void test_perf_buffer(void) + { +- int err, prog_fd, on_len, nr_on_cpus = 0, nr_cpus, i, duration = 0; ++ int err, prog_fd, nr_cpus, i, duration = 0; + const char *prog_name = "kprobe/sys_nanosleep"; + const char *file = "./test_perf_buffer.o"; + struct perf_buffer_opts pb_opts = {}; +@@ -30,27 +29,15 @@ void test_perf_buffer(void) + struct bpf_object *obj; + struct perf_buffer *pb; + struct bpf_link *link; +- bool *online; + + nr_cpus = libbpf_num_possible_cpus(); + if (CHECK(nr_cpus < 0, "nr_cpus", "err %d\n", nr_cpus)) + return; + +- err = parse_cpu_mask_file("/sys/devices/system/cpu/online", +- &online, &on_len); +- if (CHECK(err, "nr_on_cpus", "err %d\n", err)) +- return; +- +- for (i = 0; i < on_len; i++) +- if (online[i]) +- nr_on_cpus++; +- + /* load program */ + err = bpf_prog_load(file, BPF_PROG_TYPE_KPROBE, &obj, &prog_fd); +- if (CHECK(err, "obj_load", "err %d errno %d\n", err, errno)) { +- obj = NULL; +- goto out_close; +- } ++ if (CHECK(err, "obj_load", "err %d errno %d\n", err, errno)) ++ return; + + prog = bpf_object__find_program_by_title(obj, prog_name); + if (CHECK(!prog, "find_probe", "prog '%s' not found\n", prog_name)) +@@ -77,11 +64,6 @@ void test_perf_buffer(void) + /* trigger kprobe on every CPU */ + CPU_ZERO(&cpu_seen); + for (i = 0; i < nr_cpus; i++) { +- if (i >= on_len || !online[i]) { +- printf("skipping offline CPU #%d\n", i); +- continue; +- } +- + CPU_ZERO(&cpu_set); + CPU_SET(i, &cpu_set); + +@@ -99,8 +81,8 @@ void test_perf_buffer(void) + if (CHECK(err < 0, "perf_buffer__poll", "err %d\n", err)) + goto out_free_pb; + +- if (CHECK(CPU_COUNT(&cpu_seen) != nr_on_cpus, "seen_cpu_cnt", +- "expect %d, seen %d\n", nr_on_cpus, CPU_COUNT(&cpu_seen))) ++ if (CHECK(CPU_COUNT(&cpu_seen) != nr_cpus, "seen_cpu_cnt", ++ "expect %d, seen %d\n", nr_cpus, CPU_COUNT(&cpu_seen))) + goto out_free_pb; + + out_free_pb: +@@ -109,5 +91,4 @@ void test_perf_buffer(void) + bpf_link__destroy(link); + out_close: + bpf_object__close(obj); +- free(online); + } +-- +2.26.0 + diff --git a/bsp/meta-raspberrypi/recipes-kernel/linux/files/android-drivers.cfg b/bsp/meta-raspberrypi/recipes-kernel/linux/files/android-drivers.cfg new file mode 100644 index 00000000000..f74ac0e1c78 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-kernel/linux/files/android-drivers.cfg @@ -0,0 +1,8 @@ +CONFIG_ANDROID=y + +#CONFIG_ANDROID_BINDERFS is not set +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ANDROID_BINDER_DEVICES="binder" + +CONFIG_ASHMEM=y + diff --git a/bsp/meta-raspberrypi/recipes-kernel/linux/files/initramfs-image-bundle.cfg b/bsp/meta-raspberrypi/recipes-kernel/linux/files/initramfs-image-bundle.cfg new file mode 100644 index 00000000000..8d3ad168fd5 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-kernel/linux/files/initramfs-image-bundle.cfg @@ -0,0 +1,5 @@ +CONFIG_OVERLAY_FS=y +CONFIG_SQUASHFS=y +CONFIG_MTD=y +CONFIG_MTD_UBI=y +CONFIG_UBIFS_FS=y diff --git a/bsp/meta-raspberrypi/recipes-kernel/linux/files/powersave.cfg b/bsp/meta-raspberrypi/recipes-kernel/linux/files/powersave.cfg new file mode 100644 index 00000000000..9c48eff19e9 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-kernel/linux/files/powersave.cfg @@ -0,0 +1,13 @@ +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +CONFIG_HIBERNATE_CALLBACKS=y +CONFIG_HIBERNATION=y +CONFIG_PM_STD_PARTITION="/dev/mmcblk0p2" +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=100 +CONFIG_PM_WAKELOCKS_GC=y +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y +CONFIG_ARCH_HIBERNATION_HEADER=y diff --git a/bsp/meta-raspberrypi/recipes-kernel/linux/files/raspberrypi4-64/rpi4-64-kernel-misc.cfg b/bsp/meta-raspberrypi/recipes-kernel/linux/files/raspberrypi4-64/rpi4-64-kernel-misc.cfg new file mode 100644 index 00000000000..fd97ed71f18 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-kernel/linux/files/raspberrypi4-64/rpi4-64-kernel-misc.cfg @@ -0,0 +1,2 @@ +# see emmc node +CONFIG_MMC_SDHCI_IPROC=y diff --git a/bsp/meta-raspberrypi/recipes-kernel/linux/files/vc4graphics.cfg b/bsp/meta-raspberrypi/recipes-kernel/linux/files/vc4graphics.cfg new file mode 100644 index 00000000000..0b4ba48434e --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-kernel/linux/files/vc4graphics.cfg @@ -0,0 +1,6 @@ +CONFIG_I2C_BCM2835=y +CONFIG_DRM=y +CONFIG_DRM_FBDEV_EMULATION=y +CONFIG_DRM_VC4=y +CONFIG_SND=y +CONFIG_SND_SOC=y diff --git a/bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-dev.bb b/bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-dev.bb new file mode 100644 index 00000000000..e0a446162e1 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-dev.bb @@ -0,0 +1,35 @@ +python __anonymous() { + if "linux-raspberrypi-dev" not in d.getVar("PREFERRED_PROVIDER_virtual/kernel"): + msg = "Skipping linux-raspberrypi-dev as it is not the preferred " + \ + "provider of virtual/kernel." + raise bb.parse.SkipRecipe(msg) +} + +LINUX_VERSION ?= "5.10.y" +LINUX_RPI_BRANCH ?= "rpi-5.10.y" +LINUX_RPI_KMETA_BRANCH ?= "yocto-5.10" + +# Set default SRCREVs. Both the machine and meta SRCREVs are statically set +# to the as in 5.10 recipe, and hence prevent network access during parsing. If +# linux-yocto-dev is the preferred provider, they will be overridden to +# AUTOREV in following anonymous python routine and resolved when the +# variables are finalized. +SRCREV_machine ?= '${@oe.utils.conditional("PREFERRED_PROVIDER_virtual/kernel", "linux-raspberrypi-dev", "${AUTOREV}", "89399e6e7e33d6260a954603ca03857df594ffd3", d)}' +SRCREV_meta ?= '${@oe.utils.conditional("PREFERRED_PROVIDER_virtual/kernel", "linux-raspberrypi-dev", "${AUTOREV}", "a19886b00ea7d874fdd60d8e3435894bb16e6434", d)}' + +KMETA = "kernel-meta" + +SRC_URI = " \ + git://github.com/raspberrypi/linux.git;name=machine;branch=${LINUX_RPI_BRANCH};protocol=https \ + git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=${LINUX_RPI_KMETA_BRANCH};destsuffix=${KMETA} \ + file://powersave.cfg \ + file://android-drivers.cfg \ + " + +require linux-raspberrypi.inc + +KERNEL_DTC_FLAGS += "-@ -H epapr" + +# Disable version check so that we don't have to edit this recipe every time +# upstream bumps the version +KERNEL_VERSION_SANITY_SKIP = "1" diff --git a/bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi.inc b/bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi.inc new file mode 100644 index 00000000000..5ad9b781b23 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi.inc @@ -0,0 +1,36 @@ +DESCRIPTION = "Linux Kernel for Raspberry Pi" +SECTION = "kernel" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46" + +COMPATIBLE_MACHINE = "^rpi$" + +PE = "1" +PV = "${LINUX_VERSION}+git${SRCPV}" + +inherit siteinfo +require recipes-kernel/linux/linux-yocto.inc + +SRC_URI += " \ + ${@bb.utils.contains("INITRAMFS_IMAGE_BUNDLE", "1", "file://initramfs-image-bundle.cfg", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", "file://vc4graphics.cfg", "", d)} \ + " + +KCONFIG_MODE = "--alldefconfig" +KBUILD_DEFCONFIG_raspberrypi0-wifi ?= "bcmrpi_defconfig" +KBUILD_DEFCONFIG_raspberrypi ?= "bcmrpi_defconfig" +KBUILD_DEFCONFIG_raspberrypi-cm3 ?= "bcm2709_defconfig" +KBUILD_DEFCONFIG_raspberrypi2 ?= "bcm2709_defconfig" +KBUILD_DEFCONFIG_raspberrypi3 ?= "bcm2709_defconfig" +KBUILD_DEFCONFIG_raspberrypi3-64 ?= "bcmrpi3_defconfig" +KBUILD_DEFCONFIG_raspberrypi4 ?= "bcm2711_defconfig" +KBUILD_DEFCONFIG_raspberrypi4-64 ?= "bcm2711_defconfig" + +LINUX_VERSION_EXTENSION ?= "" + +KERNEL_MODULE_AUTOLOAD += "${@bb.utils.contains("MACHINE_FEATURES", "pitft28r", "stmpe-ts", "", d)}" + +# A LOADADDR is needed when building a uImage format kernel. This value is not +# set by default in rpi-4.8.y and later branches so we need to provide it +# manually. This value unused if KERNEL_IMAGETYPE is not uImage. +KERNEL_EXTRA_ARGS += "LOADADDR=0x00008000" diff --git a/bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.10.bb b/bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.10.bb new file mode 100644 index 00000000000..b13ec7e05d6 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.10.bb @@ -0,0 +1,19 @@ +LINUX_VERSION ?= "5.10.31" +LINUX_RPI_BRANCH ?= "rpi-5.10.y" +LINUX_RPI_KMETA_BRANCH ?= "yocto-5.10" + +SRCREV_machine = "89399e6e7e33d6260a954603ca03857df594ffd3" +SRCREV_meta = "a19886b00ea7d874fdd60d8e3435894bb16e6434" + +KMETA = "kernel-meta" + +SRC_URI = " \ + git://github.com/raspberrypi/linux.git;name=machine;branch=${LINUX_RPI_BRANCH};protocol=https \ + git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=${LINUX_RPI_KMETA_BRANCH};destsuffix=${KMETA} \ + file://powersave.cfg \ + file://android-drivers.cfg \ + " + +require linux-raspberrypi.inc + +KERNEL_DTC_FLAGS += "-@ -H epapr" diff --git a/bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.4.bb b/bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.4.bb new file mode 100644 index 00000000000..16914f14e60 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.4.bb @@ -0,0 +1,23 @@ +LINUX_VERSION ?= "5.4.83" +LINUX_RPI_BRANCH ?= "rpi-5.4.y" +LINUX_RPI_KMETA_BRANCH ?= "yocto-5.4" + +SRCREV_machine = "08ae2dd9e7dc89c20bff823a3ef045de09bfd090" +SRCREV_meta = "d676bf5ff7b7071e14f44498d2482c0a596f14cd" + +KMETA = "kernel-meta" + +SRC_URI = " \ + git://github.com/raspberrypi/linux.git;name=machine;branch=${LINUX_RPI_BRANCH};protocol=https \ + git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=${LINUX_RPI_KMETA_BRANCH};destsuffix=${KMETA} \ + file://0001-Revert-selftests-bpf-Skip-perf-hw-events-test-if-the.patch \ + file://0002-Revert-selftests-bpf-Fix-perf_buffer-test-on-systems.patch \ + file://powersave.cfg \ + file://android-drivers.cfg \ + " + +require linux-raspberrypi.inc + +LIC_FILES_CHKSUM = "file://COPYING;md5=bbea815ee2795b2f4230826c0c6b8814" + +KERNEL_DTC_FLAGS += "-@ -H epapr" diff --git a/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0001-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0001-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch new file mode 100644 index 00000000000..c8af7da0e05 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0001-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch @@ -0,0 +1,48 @@ +From 160181edf5fc73288abfe99fa04de4a550cd9c65 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Thu, 11 Feb 2016 12:53:20 -0800 +Subject: [PATCH] Don't try to acquire buffer when src pad isn't active + +From: =?UTF-8?q?Enrique=20Oca=C3=B1a=20Gonz=C3=A1lez?= + +This solves a race condition when setting the pipeline from PAUSE to +NULL while the decoder loop is still running. Without this patch, the +thread which interacts with the decode sink pad gets blocked here: + + gst_element_change_state() + gst_element_change_state_func() + gst_element_pads_activate() --> Deactivating pads + activate_pads() + gst_pad_set_active() + gst_pad_activate_mode() + post_activate() + GST_PAD_STREAM_LOCK() + +while gst_omx_port_acquire_buffer() gets stalled forever in +gst_omx_component_wait_message() waiting for a message that will never +arrive: + + gst_omx_video_dec_loop() + gst_omx_port_acquire_buffer() + gst_omx_component_wait_message() + +--- + omx/gstomxvideodec.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c +index abe6e30..c4dc33f 100644 +--- a/omx/gstomxvideodec.c ++++ b/omx/gstomxvideodec.c +@@ -1598,6 +1598,11 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self) + GstOMXAcquireBufferReturn acq_return; + OMX_ERRORTYPE err; + ++ if (!gst_pad_is_active(GST_VIDEO_DECODER_SRC_PAD (self))) { ++ GST_DEBUG_OBJECT (self, "Src pad not active, not acquiring buffer and flushing instead"); ++ goto flushing; ++ } ++ + #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) + port = self->eglimage ? self->egl_out_port : self->dec_out_port; + #else diff --git a/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-no-timeout-on-get-state.patch b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-no-timeout-on-get-state.patch new file mode 100644 index 00000000000..434232661e4 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-no-timeout-on-get-state.patch @@ -0,0 +1,24 @@ +From 21f776bff596bc0bd09708efa6497f8bdcd065c0 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 13 Feb 2016 11:42:29 -0800 + +--- + omx/gstomxvideodec.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c +index c4dc33f..ba5304f 100644 +--- a/omx/gstomxvideodec.c ++++ b/omx/gstomxvideodec.c +@@ -2021,9 +2021,9 @@ gst_omx_video_dec_stop (GstVideoDecoder * decoder) + g_cond_broadcast (&self->drain_cond); + g_mutex_unlock (&self->drain_lock); + +- gst_omx_component_get_state (self->dec, 5 * GST_SECOND); ++ gst_omx_component_get_state (self->dec, 0); + #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) +- gst_omx_component_get_state (self->egl_render, 1 * GST_SECOND); ++ gst_omx_component_get_state (self->egl_render, 0); + #endif + + gst_buffer_replace (&self->codec_data, NULL); diff --git a/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0004-Properly-handle-drain-requests-while-flushing.patch b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0004-Properly-handle-drain-requests-while-flushing.patch new file mode 100644 index 00000000000..144ced6ab78 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0004-Properly-handle-drain-requests-while-flushing.patch @@ -0,0 +1,30 @@ +From 140bf8548843a98b0af2ddc1765ab59c16c8994c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Enrique=20Oca=C3=B1a=20Gonz=C3=A1lez?= +Date: Tue, 17 Nov 2015 16:51:27 +0000 +Subject: [PATCH] Properly handle drain requests while flushing + +Without this commit the decoder streaming thread stops without ever attending +the drain request, leaving the decoder input thread waiting forever. + +--- + omx/gstomx.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/omx/gstomx.c b/omx/gstomx.c +index 038ce32..5202d33 100644 +--- a/omx/gstomx.c ++++ b/omx/gstomx.c +@@ -1011,6 +1011,13 @@ gst_omx_component_new (GstObject * parent, const gchar * core_name, + + g_mutex_lock (&comp->lock); + gst_omx_component_handle_messages (comp); ++ ++ if (err != OMX_ErrorNone && comp->last_error == OMX_ErrorNone) { ++ GST_ERROR_OBJECT (comp->parent, ++ "Last operation returned an error. Setting last_error manually."); ++ comp->last_error = err; ++ } ++ + g_mutex_unlock (&comp->lock); + + return comp; diff --git a/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch new file mode 100644 index 00000000000..3245294eae3 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch @@ -0,0 +1,36 @@ +From cf6cf2060c5a7a7ddc0396a0c20c234fc56c79b6 Mon Sep 17 00:00:00 2001 +From: Andrei Gherzan +Date: Tue, 28 May 2019 18:02:24 +0100 +Subject: [PATCH] Don't abort gst_omx_video_dec_set_format() if there's a + timeout releasing the buffers taken by the egl_render out port + +From 0d2ad639e6158c8023c157e206ef3ff7abdc089c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Enrique=20Oca=C3=B1a=20Gonz=C3=A1lez?= + +Date: Fri, 4 Dec 2015 18:39:59 +0100 +Subject: [PATCH] Don't abort gst_omx_video_dec_set_format() if there's a +timeout releasing the buffers taken by the egl_render out port + +Upstream-status: Pending +Signed-off-by: Andrei Gherzan +--- + omx/gstomxvideodec.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c +index ba5304f..8bd5d3d 100644 +--- a/omx/gstomxvideodec.c ++++ b/omx/gstomxvideodec.c +@@ -2229,7 +2229,9 @@ gst_omx_video_dec_disable (GstOMXVideoDec * self) + return FALSE; + if (gst_omx_port_wait_buffers_released (out_port, + 1 * GST_SECOND) != OMX_ErrorNone) ++#if !(defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL)) + return FALSE; ++#endif + if (!gst_omx_video_dec_deallocate_output_buffers (self)) + return FALSE; + if (gst_omx_port_wait_enabled (out_port, 1 * GST_SECOND) != OMX_ErrorNone) +-- +2.17.1 + diff --git a/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx_%.bbappend b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx_%.bbappend new file mode 100644 index 00000000000..a971236f216 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx_%.bbappend @@ -0,0 +1,12 @@ +FILESEXTRAPATHS_prepend_rpi := "${THISDIR}/${PN}:" + +SRC_URI_append_rpi = " \ + file://0001-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch \ + file://0003-no-timeout-on-get-state.patch \ + file://0004-Properly-handle-drain-requests-while-flushing.patch \ + file://0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch \ +" + +GSTREAMER_1_0_OMX_TARGET_rpi = "rpi" +GSTREAMER_1_0_OMX_CORE_NAME_rpi = "${libdir}/libopenmaxil.so" +EXTRA_OEMESON_append_rpi = " -Dheader_path=${STAGING_DIR_TARGET}/usr/include/IL" diff --git a/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend new file mode 100644 index 00000000000..8ab1510d8c4 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend @@ -0,0 +1,2 @@ +PACKAGECONFIG_append_rpi = " hls libmms \ + ${@bb.utils.contains('LICENSE_FLAGS_WHITELIST', 'commercial', 'faad', '', d)}" diff --git a/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend new file mode 100644 index 00000000000..6bed42a8732 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend @@ -0,0 +1,6 @@ +# if using bcm driver enable dispmanx not when using VC4 driver +PACKAGECONFIG_append_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', ' dispmanx', d)}" +DEPENDS_append_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', ' userland', d)}" + +PACKAGECONFIG_GL_VC4GRAPHICS = "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2 egl', '', d)}" +PACKAGECONFIG_GL_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '${PACKAGECONFIG_GL_VC4GRAPHICS}', 'egl gles2', d)}" diff --git a/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.18.%.bbappend b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.18.%.bbappend new file mode 100644 index 00000000000..80a324f0ca1 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.18.%.bbappend @@ -0,0 +1 @@ +PACKAGECONFIG_append_rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', ' rpi', d)}" diff --git a/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Fix-build-with-vc4-driver.patch b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Fix-build-with-vc4-driver.patch new file mode 100644 index 00000000000..37d0724a439 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Fix-build-with-vc4-driver.patch @@ -0,0 +1,49 @@ +From 25302469b6ceb2fa10ac68c07da25c6068ffd218 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Wed, 7 Nov 2018 01:16:59 -0800 +Subject: [PATCH] Fix build with vc4 driver + +Signed-off-by: Khem Raj +--- + SubtitleRenderer.cpp | 7 ++++++- + SubtitleRenderer.h | 1 + + 2 files changed, 7 insertions(+), 1 deletion(-) + +diff --git a/SubtitleRenderer.cpp b/SubtitleRenderer.cpp +index 540162f..fcfc708 100644 +--- a/SubtitleRenderer.cpp ++++ b/SubtitleRenderer.cpp +@@ -36,6 +36,11 @@ + #include + + #include "bcm_host.h" ++typedef struct { ++ DISPMANX_ELEMENT_HANDLE_T element; ++ int width; ++ int height; ++} EGL_DISPMANX_WINDOW_T; + + class BoxRenderer { + VGPath path_; +@@ -618,4 +623,4 @@ void SubtitleRenderer::set_rect(int x1, int y1, int x2, int y2) BOOST_NOEXCEPT + float font_size = height*font_size_; + ENFORCE(!FT_Set_Pixel_Sizes(ft_face_, 0, font_size)); + ENFORCE(!FT_Set_Pixel_Sizes(ft_face_italic_, 0, font_size)); +-} +\ No newline at end of file ++} +diff --git a/SubtitleRenderer.h b/SubtitleRenderer.h +index 3f60798..ebac9a1 100644 +--- a/SubtitleRenderer.h ++++ b/SubtitleRenderer.h +@@ -26,6 +26,7 @@ + // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + // DEALINGS IN THE SOFTWARE. + ++#include + #include + #include + #include +-- +2.19.1 + diff --git a/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Remove-Makefile.include-which-includes-hardcoded.patch b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Remove-Makefile.include-which-includes-hardcoded.patch new file mode 100644 index 00000000000..0c8843e7710 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Remove-Makefile.include-which-includes-hardcoded.patch @@ -0,0 +1,84 @@ +From 19c9bc5fd8f43d3e9117906c3c48a3891357f8bc Mon Sep 17 00:00:00 2001 +From: Andrei Gherzan +Date: Tue, 20 Aug 2013 16:10:51 +0300 +Subject: [PATCH] Remove Makefile.include which includes hardcoded + +Remove Makefile.include which includes hardcoded paths and rely on +variables provided by build system. + +Upstream-Status: Inappropriate [embedded specific] +Signed-off-by: Andrei Gherzan + +Updated patch to apply to c0dd9502ed2c43c487674939195c69680f3d98b0 revision + +--- + Makefile | 1 - + Makefile.ffmpeg | 1 - + Makefile.include | 40 ---------------------------------------- + 3 files changed, 42 deletions(-) + delete mode 100644 Makefile.include + +diff --git a/Makefile b/Makefile +index 2857e94..76ee9bf 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,4 +1,3 @@ +-include Makefile.include + + CFLAGS+=-std=c++0x -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -DTARGET_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_CMAKE_CONFIG -D__VIDEOCORE4__ -U_FORTIFY_SOURCE -Wall -DHAVE_OMXLIB -DUSE_EXTERNAL_FFMPEG -DHAVE_LIBAVCODEC_AVCODEC_H -DHAVE_LIBAVUTIL_OPT_H -DHAVE_LIBAVUTIL_MEM_H -DHAVE_LIBAVUTIL_AVUTIL_H -DHAVE_LIBAVFORMAT_AVFORMAT_H -DHAVE_LIBAVFILTER_AVFILTER_H -DHAVE_LIBSWRESAMPLE_SWRESAMPLE_H -DOMX -DOMX_SKIP64BIT -ftree-vectorize -DUSE_EXTERNAL_OMX -DTARGET_RASPBERRY_PI -DUSE_EXTERNAL_LIBBCM_HOST + +diff --git a/Makefile.ffmpeg b/Makefile.ffmpeg +index ea12aad..749f47f 100644 +--- a/Makefile.ffmpeg ++++ b/Makefile.ffmpeg +@@ -1,4 +1,3 @@ +-include Makefile.include + + CFLAGS=-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -DTARGET_LINUX -fPIC -DPIC -D_REENTRANT -D_HAVE_SBRK -D_LARGEFILE64_SOURCE -DHAVE_CMAKE_CONFIG -DHAVE_VMCS_CONFIG -D_REENTRANT -DUSE_VCHIQ_ARM -DVCHI_BULK_ALIGN=1 -DVCHI_BULK_GRANULARITY=1 -DEGL_SERVER_DISPMANX -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D__VIDEOCORE4__ -DGRAPHICS_X_VG=1 -U_FORTIFY_SOURCE -Wall -DHAVE_OMXLIB -DUSE_EXTERNAL_FFMPEG -DHAVE_LIBAVCODEC_AVCODEC_H -DHAVE_LIBAVUTIL_MEM_H -DHAVE_LIBAVUTIL_AVUTIL_H -DHAVE_LIBAVFORMAT_AVFORMAT_H -DHAVE_LIBAVFILTER_AVFILTER_H -DOMX -DOMX_SKIP64BIT + +diff --git a/Makefile.include b/Makefile.include +deleted file mode 100644 +index 58e9560..0000000 +--- a/Makefile.include ++++ /dev/null +@@ -1,40 +0,0 @@ +-USE_BUILDROOT=0 +-FLOAT=hard +- +-ifeq ($(USE_BUILDROOT), 1) +-BUILDROOT :=/opt/xbmc-bcm/buildroot +-SDKSTAGE :=$(BUILDROOT)/output/staging +-TARGETFS :=$(BUILDROOT)/output/target +-TOOLCHAIN :=$(BUILDROOT)/output/host/usr/ +-HOST :=arm-unknown-linux-gnueabi +-SYSROOT :=$(BUILDROOT)/output/host/usr/arm-unknown-linux-gnueabi/sysroot +-else +-BUILDROOT :=/opt/bcm-rootfs +-SDKSTAGE :=/opt/bcm-rootfs +-TARGETFS :=/opt/bcm-rootfs +-TOOLCHAIN :=/home/dc4/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/ +-HOST :=arm-linux-gnueabihf +-#SYSROOT :=$(TOOLCHAIN)/arm-bcm2708hardfp-linux-gnueabi/sysroot +-SYSROOT :=/opt/bcm-rootfs +-endif +- +-JOBS=7 +- +-CFLAGS := -isystem$(PREFIX)/include +-CXXFLAGS := $(CFLAGS) +-CPPFLAGS := $(CFLAGS) +-LDFLAGS := -L$(BUILDROOT)/lib +-LD := $(TOOLCHAIN)/bin/$(HOST)-ld --sysroot=$(SYSROOT) +-CC := $(TOOLCHAIN)/bin/$(HOST)-gcc --sysroot=$(SYSROOT) +-CXX := $(TOOLCHAIN)/bin/$(HOST)-g++ --sysroot=$(SYSROOT) +-OBJDUMP := $(TOOLCHAIN)/bin/$(HOST)-objdump +-RANLIB := $(TOOLCHAIN)/bin/$(HOST)-ranlib +-STRIP := $(TOOLCHAIN)/bin/$(HOST)-strip +-AR := $(TOOLCHAIN)/bin/$(HOST)-ar +-CXXCP := $(CXX) -E +-PATH := $(PREFIX)/bin:$(BUILDROOT)/output/host/usr/bin:$(PATH) +- +-CFLAGS += -pipe -mfloat-abi=$(FLOAT) -mcpu=arm1176jzf-s -fomit-frame-pointer -mabi=aapcs-linux -mtune=arm1176jzf-s -mfpu=vfp -Wno-psabi -mno-apcs-stack-check -g -mstructure-size-boundary=32 -mno-sched-prolog +-LDFLAGS += -L$(SDKSTAGE)/lib -L$(SDKSTAGE)/usr/lib -L$(SDKSTAGE)/opt/vc/lib/ -Lpcre/build +-#INCLUDES += -isystem$(SDKSTAGE)/usr/include -isystem$(SDKSTAGE)/opt/vc/include -isystem$(SYSROOT)/usr/include -isystem$(SDKSTAGE)/opt/vc/include/interface/vcos/pthreads -isystem$(SDKSTAGE)/usr/include/freetype2 +-INCLUDES += -isystem$(SDKSTAGE)/opt/vc/include -isystem$(SYSROOT)/usr/include -isystem$(SDKSTAGE)/opt/vc/include/interface/vcos/pthreads -Ipcre/build -Iboost-trunk -Ifreetype2/include diff --git a/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Specify-cc-cxx-and-ld-variables-from-environment.patch b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Specify-cc-cxx-and-ld-variables-from-environment.patch new file mode 100644 index 00000000000..82dfd3e65ad --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Specify-cc-cxx-and-ld-variables-from-environment.patch @@ -0,0 +1,42 @@ +From 9b4b7f8726171e97f12c587d50e54bab0dc42da5 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Wed, 12 Sep 2018 22:18:07 -0700 +Subject: [PATCH] Specify --cc, --cxx and --ld variables from environment + +This helps in compiling with non-gcc compilers + +Signed-off-by: Khem Raj +--- + Makefile.ffmpeg | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +Index: git/Makefile.ffmpeg +=================================================================== +--- git.orig/Makefile.ffmpeg ++++ git/Makefile.ffmpeg +@@ -22,12 +22,15 @@ configure: + CFLAGS="$(CFLAGS) ${INCLUDES}" \ + LDFLAGS="" \ + ./configure \ ++ --ld="${CCLD}" \ ++ --cc="${CC}" \ ++ --cxx="${CXX}" \ + --extra-cflags="$(FFMPEG_EXTRA_CFLAGS)" \ + --extra-ldflags="$(FFMPEG_EXTRA_LDFLAGS)" \ + --enable-shared \ + --disable-static \ + --arch=arm \ +- --cpu=arm1176jzf-s \ ++ --cpu=$(CPU) \ + --target-os=linux \ + --disable-hwaccels \ + --enable-parsers \ +@@ -42,7 +45,7 @@ configure: + --enable-gpl \ + --enable-version3 \ + --enable-protocols \ +- --enable-libsmbclient \ ++ --disable-libsmbclient \ + --enable-libssh \ + --enable-nonfree \ + --enable-openssl \ diff --git a/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0002-Libraries-and-headers-from-ffmpeg-are-installed-in-u.patch b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0002-Libraries-and-headers-from-ffmpeg-are-installed-in-u.patch new file mode 100644 index 00000000000..dd1d4f3d70c --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0002-Libraries-and-headers-from-ffmpeg-are-installed-in-u.patch @@ -0,0 +1,63 @@ +From e46208c4a3e35da461e0e8f662970339eae47fca Mon Sep 17 00:00:00 2001 +From: Andrei Gherzan +Date: Sun, 24 Aug 2014 00:13:13 +0200 +Subject: [PATCH] Libraries and headers from ffmpeg are installed in /usr. + +Don't search for libraries and headers in /usr/local. + +Upstream-Status: Inappropriate [embedded specific] + +Signed-off-by: Andrei Gherzan +Signed-off-by: Jonathan Liu + +--- + Makefile | 6 +++--- + Makefile.ffmpeg | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +Index: git/Makefile +=================================================================== +--- git.orig/Makefile ++++ git/Makefile +@@ -2,9 +2,9 @@ CFLAGS=-pipe -mfloat-abi=hard -mcpu=arm1 + CFLAGS+=-std=c++0x -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -DTARGET_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_CMAKE_CONFIG -D__VIDEOCORE4__ -U_FORTIFY_SOURCE -Wall -DHAVE_OMXLIB -DUSE_EXTERNAL_FFMPEG -DHAVE_LIBAVCODEC_AVCODEC_H -DHAVE_LIBAVUTIL_OPT_H -DHAVE_LIBAVUTIL_MEM_H -DHAVE_LIBAVUTIL_AVUTIL_H -DHAVE_LIBAVFORMAT_AVFORMAT_H -DHAVE_LIBAVFILTER_AVFILTER_H -DHAVE_LIBSWRESAMPLE_SWRESAMPLE_H -DOMX -DOMX_SKIP64BIT -ftree-vectorize -DUSE_EXTERNAL_OMX -DTARGET_RASPBERRY_PI -DUSE_EXTERNAL_LIBBCM_HOST + + LDFLAGS=-L$(SDKSTAGE)/opt/vc/lib/ +-LDFLAGS+=-L./ -Lffmpeg_compiled/usr/local/lib/ -lc -lbrcmGLESv2 -lbrcmEGL -lbcm_host -lopenmaxil -lfreetype -lz -lasound ++LDFLAGS+=-L./ -Lffmpeg_compiled/usr/lib/ -lc -lbrcmGLESv2 -lbrcmEGL -lbcm_host -lopenmaxil -lfreetype -lz -lasound + +-INCLUDES+=-I./ -Ilinux -Iffmpeg_compiled/usr/local/include/ -I /usr/include/dbus-1.0 -I /usr/lib/arm-linux-gnueabihf/dbus-1.0/include -I/usr/include/freetype2 -isystem$(SDKSTAGE)/opt/vc/include -isystem$(SDKSTAGE)/opt/vc/include/interface/vcos/pthreads ++INCLUDES+=-I./ -Ilinux + + DIST ?= omxplayer-dist + STRIP ?= strip +@@ -90,7 +90,7 @@ dist: omxplayer.bin omxplayer.1 + cp COPYING $(DIST)/usr/share/doc/omxplayer + cp README.md $(DIST)/usr/share/doc/omxplayer/README + cp omxplayer.1 $(DIST)/usr/share/man/man1 +- cp -P ffmpeg_compiled/usr/local/lib/*.so* $(DIST)/usr/lib/omxplayer/ ++ cp -P ffmpeg_compiled/usr/lib/*.so* $(DIST)/usr/lib/omxplayer/ + cd $(DIST); tar -czf ../$(DIST).tgz * + + install: +Index: git/Makefile.ffmpeg +=================================================================== +--- git.orig/Makefile.ffmpeg ++++ git/Makefile.ffmpeg +@@ -238,7 +238,8 @@ configure: + --disable-decoder=xbin \ + --disable-decoder=idf \ + --disable-decoder=hevc \ +- --enable-decoder=opus ++ --enable-decoder=opus \ ++ --disable-stripping + + .PHONY : clean + clean: +@@ -251,5 +252,5 @@ checkout: + .PHONY : install + install: + cd ffmpeg; make -j9 DESTDIR="$(WORK)/ffmpeg_compiled" install +- $(HOST)-strip ffmpeg_compiled/usr/local/lib/*.so ++ $(HOST)-strip ffmpeg_compiled/usr/lib/*.so + diff --git a/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0003-Remove-strip-step-in-Makefile.patch b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0003-Remove-strip-step-in-Makefile.patch new file mode 100644 index 00000000000..0b6aafdf465 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0003-Remove-strip-step-in-Makefile.patch @@ -0,0 +1,27 @@ +From 6975d8a902837dd6c604f7fdd2a2f977285855ed Mon Sep 17 00:00:00 2001 +From: Andrei Gherzan +Date: Sun, 24 Aug 2014 00:18:05 +0200 +Subject: [PATCH] Remove strip step in Makefile + +Build system will strip binaries so remove strip step in Makefile. +Avoid warnings/errors like: +WARNING: File '/usr/lib/omxplayer/libavutil.so.51.56.100' from +omxplayer was already stripped, this will prevent future debugging! + +Upstream-Status: Inappropriate [embedded specific] +Signed-off-by: Andrei Gherzan + +--- + Makefile.ffmpeg | 5 ++--- + 1 files changed, 2 insertions(+), 3 deletions(-) + +Index: git/Makefile.ffmpeg +=================================================================== +--- git.orig/Makefile.ffmpeg ++++ git/Makefile.ffmpeg +@@ -252,5 +252,3 @@ checkout: + .PHONY : install + install: + cd ffmpeg; make -j9 DESTDIR="$(WORK)/ffmpeg_compiled" install +- $(HOST)-strip ffmpeg_compiled/usr/lib/*.so +- diff --git a/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0004-Add-FFMPEG_EXTRA_CFLAGS-and-FFMPEG_EXTRA_LDFLAGS.patch b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0004-Add-FFMPEG_EXTRA_CFLAGS-and-FFMPEG_EXTRA_LDFLAGS.patch new file mode 100644 index 00000000000..d137592cf08 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0004-Add-FFMPEG_EXTRA_CFLAGS-and-FFMPEG_EXTRA_LDFLAGS.patch @@ -0,0 +1,37 @@ +From be007b01e7d91f5f83518c0388c16db8dab31d2e Mon Sep 17 00:00:00 2001 +From: Andrei Gherzan +Date: Sun, 25 Jan 2015 11:13:51 +0200 +Subject: [PATCH] Add FFMPEG_EXTRA_CFLAGS and FFMPEG_EXTRA_LDFLAGS + +In this way we can inject flags to LD and CC using +--extra-cflags and --extra-ldflags. + +Upstream-Status: Inappropriate [embedded specific] +Signed-off-by: Andrei Gherzan + +--- + Makefile.ffmpeg | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +Index: git/Makefile.ffmpeg +=================================================================== +--- git.orig/Makefile.ffmpeg ++++ git/Makefile.ffmpeg +@@ -1,5 +1,7 @@ + CFLAGS=-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -DTARGET_LINUX -fPIC -DPIC -D_REENTRANT -D_HAVE_SBRK -D_LARGEFILE64_SOURCE -DHAVE_CMAKE_CONFIG -DHAVE_VMCS_CONFIG -D_REENTRANT -DUSE_VCHIQ_ARM -DVCHI_BULK_ALIGN=1 -DVCHI_BULK_GRANULARITY=1 -DEGL_SERVER_DISPMANX -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D__VIDEOCORE4__ -DGRAPHICS_X_VG=1 -U_FORTIFY_SOURCE -Wall -DHAVE_OMXLIB -DUSE_EXTERNAL_FFMPEG -DHAVE_LIBAVCODEC_AVCODEC_H -DHAVE_LIBAVUTIL_MEM_H -DHAVE_LIBAVUTIL_AVUTIL_H -DHAVE_LIBAVFORMAT_AVFORMAT_H -DHAVE_LIBAVFILTER_AVFILTER_H -DOMX -DOMX_SKIP64BIT + ++FFMPEG_EXTRA_CFLAGS?=-mfpu=vfp -mfloat-abi=$(FLOAT) ++ + WORK=$(PWD) + + .PHONY : all +@@ -20,7 +22,8 @@ configure: + CFLAGS="$(CFLAGS) ${INCLUDES}" \ + LDFLAGS="" \ + ./configure \ +- --extra-cflags="-mfpu=vfp -mfloat-abi=hard" \ ++ --extra-cflags="$(FFMPEG_EXTRA_CFLAGS)" \ ++ --extra-ldflags="$(FFMPEG_EXTRA_LDFLAGS)" \ + --enable-shared \ + --disable-static \ + --arch=arm \ diff --git a/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0005-Don-t-require-internet-connection-during-build.patch b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0005-Don-t-require-internet-connection-during-build.patch new file mode 100644 index 00000000000..f6abd7b8828 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0005-Don-t-require-internet-connection-during-build.patch @@ -0,0 +1,55 @@ +From 81d1f8bc102b23bdfa63a01f252f3e4c74ae7da9 Mon Sep 17 00:00:00 2001 +From: Paul Barker +Date: Thu, 7 Sep 2017 19:14:20 +0000 +Subject: [PATCH] Don't require internet connection during build + +The following issues break offline builds: + +* Building the man page uses a web service hosted on heroku. + +* Makefile.ffmpeg explicitly does a "git clone" from the internet. + +Signed-off-by: Paul Barker +Upstream-status: Inappropriate + +--- + Makefile | 6 ++---- + Makefile.ffmpeg | 2 +- + 2 files changed, 3 insertions(+), 5 deletions(-) + +Index: git/Makefile +=================================================================== +--- git.orig/Makefile ++++ git/Makefile +@@ -81,17 +81,14 @@ ffmpeg: + make -f Makefile.ffmpeg + make -f Makefile.ffmpeg install + +-dist: omxplayer.bin omxplayer.1 ++dist: omxplayer.bin + mkdir -p $(DIST)/usr/lib/omxplayer + mkdir -p $(DIST)/usr/bin + mkdir -p $(DIST)/usr/share/doc/omxplayer +- mkdir -p $(DIST)/usr/share/man/man1 + cp omxplayer omxplayer.bin $(DIST)/usr/bin + cp COPYING $(DIST)/usr/share/doc/omxplayer + cp README.md $(DIST)/usr/share/doc/omxplayer/README +- cp omxplayer.1 $(DIST)/usr/share/man/man1 + cp -P ffmpeg_compiled/usr/lib/*.so* $(DIST)/usr/lib/omxplayer/ +- tar -czf omxplayer-dist.tar.gz $(DIST) + + install: + cp -r $(DIST)/* / +Index: git/Makefile.ffmpeg +=================================================================== +--- git.orig/Makefile.ffmpeg ++++ git/Makefile.ffmpeg +@@ -5,7 +5,7 @@ FFMPEG_EXTRA_CFLAGS?=-mfpu=vfp -mfloat-a + WORK=$(PWD) + + .PHONY : all +-all: checkout configure compile ++all: configure compile + + .PHONY : copy + copy: diff --git a/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0006-Prevent-ffmpeg-configure-compile-race-condition.patch b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0006-Prevent-ffmpeg-configure-compile-race-condition.patch new file mode 100644 index 00000000000..890adde501e --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0006-Prevent-ffmpeg-configure-compile-race-condition.patch @@ -0,0 +1,37 @@ +From f570b9985ff2d57d21c1e64ed08c43b6d89fd0b1 Mon Sep 17 00:00:00 2001 +From: Paul Barker +Date: Thu, 7 Sep 2017 20:02:15 +0000 +Subject: [PATCH] Prevent ffmpeg configure/compile race condition + +Additional dependency information is needed in Makefile.ffmpeg to ensure that +the configure stage is finished before the compile stage starts. + +Signed-off-by: Paul Barker +Upstream-status: Pending + +--- + Makefile.ffmpeg | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: git/Makefile.ffmpeg +=================================================================== +--- git.orig/Makefile.ffmpeg ++++ git/Makefile.ffmpeg +@@ -5,7 +5,7 @@ FFMPEG_EXTRA_CFLAGS?=-mfpu=vfp -mfloat-a + WORK=$(PWD) + + .PHONY : all +-all: configure compile ++all: compile + + .PHONY : copy + copy: +@@ -13,7 +13,7 @@ copy: + $(HOST)-strip *.so* + + .PHONY : compile +-compile: ++compile: configure + +$(MAKE) -j$(shell nproc) -C ffmpeg + + .PHONY : configure diff --git a/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0007-Remove-Makefile-hardcoded-arch-tune.patch b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0007-Remove-Makefile-hardcoded-arch-tune.patch new file mode 100644 index 00000000000..a8c51d5ce6a --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0007-Remove-Makefile-hardcoded-arch-tune.patch @@ -0,0 +1,8 @@ +--- a/Makefile 2019-06-20 15:04:53.390282996 +0200 ++++ b/Makefile 2019-06-20 15:03:45.538763872 +0200 +@@ -1,4 +1,4 @@ +-CFLAGS=-pipe -mfloat-abi=hard -mcpu=arm1176jzf-s -fomit-frame-pointer -mabi=aapcs-linux -mtune=arm1176jzf-s -mfpu=vfp -Wno-psabi -g ++CFLAGS+= -fomit-frame-pointer -mabi=aapcs-linux -Wno-psabi -g + CFLAGS+=-std=c++0x -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -DTARGET_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_CMAKE_CONFIG -D__VIDEOCORE4__ -U_FORTIFY_SOURCE -Wall -DHAVE_OMXLIB -DUSE_EXTERNAL_FFMPEG -DHAVE_LIBAVCODEC_AVCODEC_H -DHAVE_LIBAVUTIL_OPT_H -DHAVE_LIBAVUTIL_MEM_H -DHAVE_LIBAVUTIL_AVUTIL_H -DHAVE_LIBAVFORMAT_AVFORMAT_H -DHAVE_LIBAVFILTER_AVFILTER_H -DHAVE_LIBSWRESAMPLE_SWRESAMPLE_H -DOMX -DOMX_SKIP64BIT -ftree-vectorize -DUSE_EXTERNAL_OMX -DTARGET_RASPBERRY_PI -DUSE_EXTERNAL_LIBBCM_HOST + + LDFLAGS=-L$(SDKSTAGE)/opt/vc/lib/ diff --git a/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/cross-crompile-ffmpeg.patch b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/cross-crompile-ffmpeg.patch new file mode 100644 index 00000000000..20ed7c7b9cd --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/cross-crompile-ffmpeg.patch @@ -0,0 +1,12 @@ +Index: git/Makefile.ffmpeg +=================================================================== +--- git.orig/Makefile.ffmpeg ++++ git/Makefile.ffmpeg +@@ -22,6 +22,7 @@ configure: + CFLAGS="$(CFLAGS) ${INCLUDES}" \ + LDFLAGS="" \ + ./configure \ ++ --enable-cross-compile \ + --ld="${CCLD}" \ + --cc="${CC}" \ + --cxx="${CXX}" \ diff --git a/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/fix-tar-command-with-DIST.patch b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/fix-tar-command-with-DIST.patch new file mode 100644 index 00000000000..70859aa49bc --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/fix-tar-command-with-DIST.patch @@ -0,0 +1,32 @@ +From 23a97efde2aef171312000f7859ef4c573ce2ada Mon Sep 17 00:00:00 2001 +From: Andrei Gherzan +Date: Sun, 19 Jan 2014 20:35:29 +0200 +Subject: [PATCH] omxplayer: Update to remote HEAD + +Revert the tar command change introduced in: +https://github.com/popcornmix/omxplayer/commit/201c77973155861e60492e45d35467b19b69c1c4 + +This fails if DIST is an absolute path. The old command was working just fine. + +Upstream-Status: Pending + +Signed-off-by: Andrei Gherzan +Signed-off-by: Jonathan Liu + +--- + Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: git/Makefile +=================================================================== +--- git.orig/Makefile ++++ git/Makefile +@@ -91,7 +91,7 @@ dist: omxplayer.bin omxplayer.1 + cp README.md $(DIST)/usr/share/doc/omxplayer/README + cp omxplayer.1 $(DIST)/usr/share/man/man1 + cp -P ffmpeg_compiled/usr/lib/*.so* $(DIST)/usr/lib/omxplayer/ +- cd $(DIST); tar -czf ../$(DIST).tgz * ++ tar -czf omxplayer-dist.tar.gz $(DIST) + + install: + cp -r $(DIST)/* / diff --git a/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/use-native-pkg-config.patch b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/use-native-pkg-config.patch new file mode 100644 index 00000000000..e580470c05a --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/use-native-pkg-config.patch @@ -0,0 +1,28 @@ +From da6c24a2a87b8cf9692017e32be25d30c0cc7ef4 Mon Sep 17 00:00:00 2001 +From: Andrei Gherzan +Date: Tue, 10 Feb 2015 00:52:18 +0100 +Subject: [PATCH] omxplayer: Bump SRCREV + +Force the pkg-config native tool. Strangely ffmpeg prepends cross_prefix +to the default value which obviously is wrong. + +Signed-off-by: Andrei Gherzan + +--- + Makefile.ffmpeg | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +Index: git/Makefile.ffmpeg +=================================================================== +--- git.orig/Makefile.ffmpeg ++++ git/Makefile.ffmpeg +@@ -242,7 +242,8 @@ configure: + --disable-decoder=idf \ + --disable-decoder=hevc \ + --enable-decoder=opus \ +- --disable-stripping ++ --disable-stripping \ ++ --pkg-config=pkg-config + + .PHONY : clean + clean: diff --git a/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer_git.bb b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer_git.bb new file mode 100644 index 00000000000..82706a47a48 --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer_git.bb @@ -0,0 +1,108 @@ +SUMMARY = "A commandline OMX player for the Raspberry Pi" +DESCRIPTION = "This player was developed as a testbed for the XBMC \ +Raspberry PI implementation and is quite handy to use standalone" +HOMEPAGE = "https://github.com/popcornmix/omxplayer" +SECTION = "console/utils" + +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=00a27da7ac0f9bcd17320ec29ef4bbf6" + +DEPENDS = "libpcre libav virtual/egl boost freetype dbus openssl libssh virtual/libomxil coreutils-native curl-native userland" + +PR = "r5" + +SRCREV_default = "f543a0d0e707ab56415f17b0ca6d397394ee8b63" + +# omxplayer builds its own copy of ffmpeg from source instead of using the +# system's ffmpeg library. This isn't ideal but it's ok for now. We do however +# want to keep control of the exact version of ffmpeg used instead of just +# fetching the latest commit on a release branch (which is what the checkout job +# in Makefile.ffmpeg in the omxplayer source tree does). +# +# This SRCREV corresponds to the v4.0.3 release of ffmpeg. +SRCREV_ffmpeg = "fcbd117df3077bad495e99e20f01cf93737bce76" + +SRC_URI = "git://github.com/popcornmix/omxplayer.git;protocol=https;branch=master \ + git://github.com/FFmpeg/FFmpeg;branch=release/4.0;protocol=https;depth=1;name=ffmpeg;destsuffix=git/ffmpeg \ + file://0002-Libraries-and-headers-from-ffmpeg-are-installed-in-u.patch \ + file://0003-Remove-strip-step-in-Makefile.patch \ + file://0004-Add-FFMPEG_EXTRA_CFLAGS-and-FFMPEG_EXTRA_LDFLAGS.patch \ + file://fix-tar-command-with-DIST.patch \ + file://use-native-pkg-config.patch \ + file://0005-Don-t-require-internet-connection-during-build.patch \ + file://0006-Prevent-ffmpeg-configure-compile-race-condition.patch \ + file://0001-Specify-cc-cxx-and-ld-variables-from-environment.patch \ + file://cross-crompile-ffmpeg.patch \ + file://0007-Remove-Makefile-hardcoded-arch-tune.patch \ + " + +SRC_URI_append = "${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", " file://0001-Fix-build-with-vc4-driver.patch ", "", d)}" + +S = "${WORKDIR}/git" + +COMPATIBLE_MACHINE = "^rpi$" +COMPATIBLE_HOST_aarch64 = "null" + +def cpu(d): + for arg in (d.getVar('TUNE_CCARGS') or '').split(): + if arg.startswith('-mcpu='): + return arg[6:] + return 'generic' + +export CPU = "${@cpu(d)}" + +inherit autotools-brokensep pkgconfig + +# This isn't used directly by omxplayer, but applied to Makefile.ffmpeg which +# runs the ffmpeg configuration +PACKAGECONFIG ??= "" +PACKAGECONFIG[samba] = "--enable-libsmbclient,--disable-libsmbclient,samba" + +# Needed in ffmpeg configure +export TEMPDIR = "${S}/tmp" + +# Needed in Makefile.ffmpeg +export HOST = "${HOST_SYS}" +export WORK = "${S}" +export FFMPEG_EXTRA_CFLAGS = "${TUNE_CCARGS} ${TOOLCHAIN_OPTIONS}" +export FFMPEG_EXTRA_LDFLAGS = "${TUNE_CCARGS} ${TOOLCHAIN_OPTIONS}" + +# Needed in top Makefile + +export LDFLAGS = "-L${S}/ffmpeg_compiled/usr/lib \ + -L${STAGING_DIR_HOST}/lib \ + -L${STAGING_DIR_HOST}/usr/lib \ + " +export INCLUDES = "${@bb.utils.contains("MACHINE_FEATURES", "vc4graphics", " -D__GBM__", "", d)} \ + -isystem${STAGING_DIR_HOST}/usr/include/interface/vcos/pthreads \ + -isystem${STAGING_DIR_HOST}/usr/include/freetype2 \ + -isystem${STAGING_DIR_HOST}/usr/include/interface/vmcs_host/linux \ + -isystem${STAGING_DIR_HOST}/usr/include/dbus-1.0 \ + -isystem${STAGING_DIR_HOST}/usr/lib/dbus-1.0/include \ + " +export DIST = "${D}" + +do_compile() { + # Needed for compiler test in ffmpeg's configure + mkdir -p tmp + + sed -i 's/--enable-libsmbclient/${@bb.utils.contains("PACKAGECONFIG", "samba", "--enable-libsmbclient", "--disable-libsmbclient", d)}/g' Makefile.ffmpeg + + oe_runmake -f Makefile.ffmpeg + oe_runmake -f Makefile.ffmpeg install + oe_runmake +} + +do_install() { + oe_runmake STRIP='echo skipping strip' dist + mkdir -p ${D}${datadir}/fonts/truetype/freefont/ + install ${S}/fonts/* ${D}${datadir}/fonts/truetype/freefont/ +} + +FILES_${PN} = "${bindir}/omxplayer* \ + ${libdir}/omxplayer/lib*${SOLIBS} \ + ${datadir}/fonts" + +FILES_${PN}-dev += "${libdir}/omxplayer/*.so" + +RDEPENDS_${PN} += "bash procps userland" diff --git a/bsp/meta-raspberrypi/recipes-multimedia/x264/x264_%.bbappend b/bsp/meta-raspberrypi/recipes-multimedia/x264/x264_%.bbappend new file mode 100644 index 00000000000..505719efb8a --- /dev/null +++ b/bsp/meta-raspberrypi/recipes-multimedia/x264/x264_%.bbappend @@ -0,0 +1,2 @@ +EXTRA_OECONF_append_raspberrypi = " --disable-asm" +EXTRA_OECONF_append_raspberrypi0-wifi = " --disable-asm" diff --git a/bsp/meta-raspberrypi/wic/sdimage-raspberrypi.wks b/bsp/meta-raspberrypi/wic/sdimage-raspberrypi.wks new file mode 100644 index 00000000000..01fbaeaeb12 --- /dev/null +++ b/bsp/meta-raspberrypi/wic/sdimage-raspberrypi.wks @@ -0,0 +1,6 @@ +# short-description: Create Raspberry Pi SD card image +# long-description: Creates a partitioned SD card image for use with +# Raspberry Pi. Boot files are located in the first vfat partition. + +part /boot --source bootimg-partition --ondisk mmcblk0 --fstype=vfat --label boot --active --align 4096 --size 20 +part / --source rootfs --ondisk mmcblk0 --fstype=ext4 --label root --align 4096 -- Gitee From 9ba4f1e20ebc242449f694ff539c90e55dd2a9fd Mon Sep 17 00:00:00 2001 From: lisimin Date: Wed, 19 Jan 2022 15:05:50 +0800 Subject: [PATCH 174/304] update arm compiler path to openeuler_gcc_arm32le Signed-off-by: lisimin --- meta-openeuler/conf/local.conf.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index 1e27ef52a47..f36d1c3aaed 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -319,4 +319,4 @@ OPENEULER_SP_DIR = "/usr1/openeuler/src/" # openeuler_gcc_arm64le # openeuler_gcc_arm32le" OPENEULER_TOOLCHAIN_DIR_aarch64 = "/usr1/openeuler/gcc/openeuler_gcc_arm64le" -OPENEULER_TOOLCHAIN_DIR_arm = "/usr1/openeuler/gcc/openeuler_gcc_arm64le" +OPENEULER_TOOLCHAIN_DIR_arm = "/usr1/openeuler/gcc/openeuler_gcc_arm32le" -- Gitee From 3d95356301fe4512a6243e497bae98c97af2cf7d Mon Sep 17 00:00:00 2001 From: lisimin Date: Wed, 19 Jan 2022 15:43:55 +0800 Subject: [PATCH 175/304] support build openeuler raspberrypi Signed-off-by: lisimin --- .../raspberrypi/conf/layer.conf | 13 ++++++++++ .../images/openeuler-image.bbappend | 1 + .../recipes-core/images/raspberrypi4-64.inc | 10 ++++++++ .../raspberrypi/recipes-core/images/rpi.inc | 18 ++++++++++++++ meta-openeuler/conf/layer.conf | 2 +- .../recipes-core/images/openeuler-image.bb | 24 ++----------------- .../recipes-core/images/qemu-aarch64.inc | 2 ++ .../recipes-core/images/qemu-arm.inc | 2 ++ meta-openeuler/recipes-core/images/qemu.inc | 17 +++++++++++++ 9 files changed, 66 insertions(+), 23 deletions(-) create mode 100644 bsp/meta-openeuler-bsp/raspberrypi/conf/layer.conf create mode 100644 bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/openeuler-image.bbappend create mode 100644 bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/raspberrypi4-64.inc create mode 100644 bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc create mode 100644 meta-openeuler/recipes-core/images/qemu-aarch64.inc create mode 100644 meta-openeuler/recipes-core/images/qemu-arm.inc create mode 100644 meta-openeuler/recipes-core/images/qemu.inc diff --git a/bsp/meta-openeuler-bsp/raspberrypi/conf/layer.conf b/bsp/meta-openeuler-bsp/raspberrypi/conf/layer.conf new file mode 100644 index 00000000000..8a5eb624869 --- /dev/null +++ b/bsp/meta-openeuler-bsp/raspberrypi/conf/layer.conf @@ -0,0 +1,13 @@ +# We have a conf and classes directory, append to BBPATH +BBPATH .= ":${LAYERDIR}" + +# We have a recipes directory containing .bb and .bbappend files, add to BBFILES +BBFILES += "${LAYERDIR}/recipes*/*/*.bb \ + ${LAYERDIR}/recipes*/*/*.bbappend" + +BBFILE_COLLECTIONS += "openeuler-raspberrypi" +BBFILE_PATTERN_openeuler-raspberrypi := "^${LAYERDIR}/" +BBFILE_PRIORITY_openeuler-raspberrypi = "10" + +LAYERSERIES_COMPAT_openeuler-raspberrypi = "hardknott honister" +LAYERDEPENDS_openeuler-raspberrypi = "raspberrypi" diff --git a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/openeuler-image.bbappend b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/openeuler-image.bbappend new file mode 100644 index 00000000000..81fe7b794a1 --- /dev/null +++ b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/openeuler-image.bbappend @@ -0,0 +1 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" diff --git a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/raspberrypi4-64.inc b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/raspberrypi4-64.inc new file mode 100644 index 00000000000..4218b016e35 --- /dev/null +++ b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/raspberrypi4-64.inc @@ -0,0 +1,10 @@ +#image configuration for aarch64 +require rpi.inc + +IMAGE_INSTALL = " \ +busybox-linuxrc \ +kernel \ +busybox \ +os-base \ +glibc \ +" diff --git a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc new file mode 100644 index 00000000000..67cedfc46de --- /dev/null +++ b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc @@ -0,0 +1,18 @@ +delete_boot_from_rootfs() { + test -d "${OUTPUT_DIR}" || mkdir -p "${OUTPUT_DIR}" + pushd "${IMAGE_ROOTFS}" + rm -f "${OUTPUT_DIR}"/*Image* "${OUTPUT_DIR}"/initrd "${OUTPUT_DIR}"/vmlinux* + mv boot/${KERNEL_IMAGETYPE}-* "${OUTPUT_DIR}"/${KERNEL_IMAGETYPE} + mv boot/vmlinux* "${OUTPUT_DIR}"/ + mv boot/Image* "${OUTPUT_DIR}"/ + rm -r ./boot + touch lsm + popd +} + +copy_openeuler_distro() { + cp -fp ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${IMAGE_FSTYPES} "${OUTPUT_DIR}"/initrd +} + +IMAGE_PREPROCESS_COMMAND += "delete_boot_from_rootfs;" +IMAGE_POSTPROCESS_COMMAND += "copy_openeuler_distro;" diff --git a/meta-openeuler/conf/layer.conf b/meta-openeuler/conf/layer.conf index c4a89465752..aadff51ed8c 100644 --- a/meta-openeuler/conf/layer.conf +++ b/meta-openeuler/conf/layer.conf @@ -7,7 +7,7 @@ BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ BBFILE_COLLECTIONS += "openeuler" BBFILE_PATTERN_openeuler = "^${LAYERDIR}/" -BBFILE_PRIORITY_openeuler = "10" +BBFILE_PRIORITY_openeuler = "30" LAYERSERIES_COMPAT_openeuler = "hardknott" diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index af02c65ed6c..32aee147a23 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -33,28 +33,6 @@ TOOLCHAIN_HOST_TASK_task-populate-sdk-ext = "" TOOLCHAIN_HOST_TASK = "" OUTPUT_DIR = "${TOPDIR}/output" -delete_boot_from_rootfs() { - test -d "${OUTPUT_DIR}" || mkdir -p "${OUTPUT_DIR}" - pushd "${IMAGE_ROOTFS}" - rm -f "${OUTPUT_DIR}"/initrd - # remove /boot from rootfs for final image - if [-d ./boot]; then - rm -f "${OUTPUT_DIR}"/Image* "${OUTPUT_DIR}"/vmlinux* - mv boot/${KERNEL_IMAGETYPE}-* "${OUTPUT_DIR}"/${KERNEL_IMAGETYPE} - mv boot/vmlinux* "${OUTPUT_DIR}"/ - mv boot/Image* "${OUTPUT_DIR}"/ - rm -r ./boot - fi - popd -} - -copy_openeuler_distro() { - cp -fp ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${IMAGE_FSTYPES} "${OUTPUT_DIR}"/initrd -} - -IMAGE_PREPROCESS_COMMAND += "delete_boot_from_rootfs;" -IMAGE_POSTPROCESS_COMMAND += "copy_openeuler_distro;" - #No kernel-abiversion file found, cannot run depmod, aborting USE_DEPMOD = "0" @@ -140,3 +118,5 @@ kernel-img \ IMAGE_INSTALL += "${ROOTFS_BOOTSTRAP_INSTALL} ${IMAGE_INSTALL_normal} ${IMAGE_INSTALL_pro}" DISTRO_FEATURES += "glibc" + +require recipes-core/images/${MACHINE}.inc diff --git a/meta-openeuler/recipes-core/images/qemu-aarch64.inc b/meta-openeuler/recipes-core/images/qemu-aarch64.inc new file mode 100644 index 00000000000..4cdd739fc28 --- /dev/null +++ b/meta-openeuler/recipes-core/images/qemu-aarch64.inc @@ -0,0 +1,2 @@ +#image configuration for aarch64 +require qemu.inc diff --git a/meta-openeuler/recipes-core/images/qemu-arm.inc b/meta-openeuler/recipes-core/images/qemu-arm.inc new file mode 100644 index 00000000000..cccdbe755b4 --- /dev/null +++ b/meta-openeuler/recipes-core/images/qemu-arm.inc @@ -0,0 +1,2 @@ +#image configuration for arm +require qemu.inc diff --git a/meta-openeuler/recipes-core/images/qemu.inc b/meta-openeuler/recipes-core/images/qemu.inc new file mode 100644 index 00000000000..d00e196bc27 --- /dev/null +++ b/meta-openeuler/recipes-core/images/qemu.inc @@ -0,0 +1,17 @@ +delete_boot_from_rootfs() { + test -d "${OUTPUT_DIR}" || mkdir -p "${OUTPUT_DIR}" + pushd "${IMAGE_ROOTFS}" + rm -f "${OUTPUT_DIR}"/*Image* "${OUTPUT_DIR}"/initrd "${OUTPUT_DIR}"/vmlinux* + mv boot/${KERNEL_IMAGETYPE}-* "${OUTPUT_DIR}"/${KERNEL_IMAGETYPE} + mv boot/vmlinux* "${OUTPUT_DIR}"/ + mv boot/Image* "${OUTPUT_DIR}"/ + rm -r ./boot + popd +} + +copy_openeuler_distro() { + cp -fp ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${IMAGE_FSTYPES} "${OUTPUT_DIR}"/initrd +} + +IMAGE_PREPROCESS_COMMAND += "delete_boot_from_rootfs;" +IMAGE_POSTPROCESS_COMMAND += "copy_openeuler_distro;" -- Gitee From ca4149b0d593c3f81612340860e85f2550acee1f Mon Sep 17 00:00:00 2001 From: ilisimin Date: Wed, 19 Jan 2022 12:49:20 +0000 Subject: [PATCH 176/304] update docs/source/yocto/index.rst. --- docs/source/yocto/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/yocto/index.rst b/docs/source/yocto/index.rst index 3153929042b..62ec8970cfa 100644 --- a/docs/source/yocto/index.rst +++ b/docs/source/yocto/index.rst @@ -11,7 +11,7 @@ https://docs.yoctoproject.org/overview-manual/yp-intro.html#what-is-the-yocto-pr https://docs.yoctoproject.org/overview-manual/yp-intro.html#the-yocto-project-layer-model -1.2 主要组件和工具 +1.2 主要组件工具 ******************** -- Gitee From 9673d9ea54b6586876cc4dd2db55d428a0c02ea1 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Fri, 21 Jan 2022 17:32:03 +0800 Subject: [PATCH 177/304] sysfsutils: add receipe for sysfsutils sysfsutils is a tool for working with sysfs. it's required by openamp Signed-off-by: Wayne Ren --- .../sysfsutils/sysfsutils_2.1.1.bb | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 meta-openeuler/recipes-core/sysfsutils/sysfsutils_2.1.1.bb diff --git a/meta-openeuler/recipes-core/sysfsutils/sysfsutils_2.1.1.bb b/meta-openeuler/recipes-core/sysfsutils/sysfsutils_2.1.1.bb new file mode 100644 index 00000000000..6716b690463 --- /dev/null +++ b/meta-openeuler/recipes-core/sysfsutils/sysfsutils_2.1.1.bb @@ -0,0 +1,36 @@ +### Descriptive metadata: SUMMARY,DESCRITPION, HOMEPAGE, AUTHOR, BUGTRACKER +SUMMARY = "Tools for working with sysfs" +DESCRIPTION = "Tools for working with the sysfs virtual filesystem. The tool 'systool' \ + can query devices by bus, class and topology." +AUTHOR = "" +HOMEPAGE = "http://linux-diag.sourceforge.net/Sysfsutils.html" +BUGTRACKER = "https://gitee.com/openeuler/yocto-meta-openeuler" + +### Package manager metadata: SECTION, PRIOIRTY(only for deb, opkg) +SECTION = "libs" + +### License metadata +LICENSE = "GPLv2 & LGPLv2.1" +LICENSE_${PN} = "GPLv2" +LICENSE_libsysfs = "LGPLv2.1" +LIC_FILES_CHKSUM = "file://COPYING;md5=dcc19fa9307a50017fca61423a7d9754 \ + file://cmd/GPL;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ + file://lib/LGPL;md5=4fbd65380cdd255951079008b364516c" + +### Inheritance and includes if needed +inherit autotools + +### Build metadata: SRC_URI, SRCDATA, S, B, FILESEXTRAPATHS.... +SRC_URI = "file://sysfsutils/v${PV}.tar.gz " + +S = "${WORKDIR}/${BPN}-${PV}" + +### Runtime metadata + +### Package metadata +PACKAGES =+ "libsysfs" +FILES_libsysfs = "${libdir}/lib*${SOLIBS}" + +export libdir = "${base_libdir}" + +### Tasks for package -- Gitee From 9fe57b28d491864093ad82263a8f198d7aa5aa54 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 20 Jan 2022 14:43:35 +0800 Subject: [PATCH 178/304] add recipe for cronie Signed-off-by: lixiaoyong --- .../recipes-core/cronie/cronie/crond.init | 58 +++++++++++++ .../recipes-core/cronie/cronie/crond.service | 11 +++ .../cronie/cronie/crond_pam_config.patch | 22 +++++ .../recipes-core/cronie/cronie/crontab | 14 ++++ .../recipes-core/cronie/cronie_1.5.7.bb | 83 +++++++++++++++++++ 5 files changed, 188 insertions(+) create mode 100755 meta-openeuler/recipes-core/cronie/cronie/crond.init create mode 100644 meta-openeuler/recipes-core/cronie/cronie/crond.service create mode 100644 meta-openeuler/recipes-core/cronie/cronie/crond_pam_config.patch create mode 100644 meta-openeuler/recipes-core/cronie/cronie/crontab create mode 100644 meta-openeuler/recipes-core/cronie/cronie_1.5.7.bb diff --git a/meta-openeuler/recipes-core/cronie/cronie/crond.init b/meta-openeuler/recipes-core/cronie/cronie/crond.init new file mode 100755 index 00000000000..53b8514caab --- /dev/null +++ b/meta-openeuler/recipes-core/cronie/cronie/crond.init @@ -0,0 +1,58 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: crond crontab +# Default-Start: 2345 +# Default-Stop: 016 +# Short-Description: run cron daemon +# Description: cron is a standard UNIX program that runs user-specified +# programs at periodic scheduled times. vixie cron adds a +# number of features to the basic UNIX cron, including better +# security and more powerful configuration options. +### END INIT INFO + +CROND=/usr/sbin/crond +CONFIG=/etc/sysconfig/crond + +[ -f $CONFIG ] || exit 1 +[ -x $CROND ] || exit 1 + +. $CONFIG + +# Source function library. +. /etc/init.d/functions + +case "$1" in + start) + echo -n "Starting crond: " + start-stop-daemon --start --quiet --exec $CROND -- $CRONDARGS + RETVAL=$? + if [ $RETVAL -eq 0 ] ; then + echo "OK" + else + echo "FAIL" + fi + ;; + stop) + echo -n "Stopping crond: " + start-stop-daemon --stop --quiet --pidfile /var/run/crond.pid + RETVAL=$? + if [ $RETVAL -eq 0 ] ; then + echo "OK" + else + echo "FAIL" + fi + ;; + status) + status crond + exit $? + ;; + restart) + $0 stop && sleep 1 && $0 start + ;; + *) + echo "Usage: /etc/init.d/crond {start|stop|status|restart}" + exit 1 +esac + +exit 0 + diff --git a/meta-openeuler/recipes-core/cronie/cronie/crond.service b/meta-openeuler/recipes-core/cronie/cronie/crond.service new file mode 100644 index 00000000000..d435a6eb340 --- /dev/null +++ b/meta-openeuler/recipes-core/cronie/cronie/crond.service @@ -0,0 +1,11 @@ +[Unit] +Description=Periodic Command Scheduler + +[Service] +EnvironmentFile=/etc/sysconfig/crond +ExecStart=@SBINDIR@/crond -n $CRONDARGS +ExecReload=@BASE_BINDIR@/kill -HUP $MAINPID +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/meta-openeuler/recipes-core/cronie/cronie/crond_pam_config.patch b/meta-openeuler/recipes-core/cronie/cronie/crond_pam_config.patch new file mode 100644 index 00000000000..c374790d1da --- /dev/null +++ b/meta-openeuler/recipes-core/cronie/cronie/crond_pam_config.patch @@ -0,0 +1,22 @@ +password-auth is the Fedora's common pam configure file, use oe common pam +configure files instead. + +Upstream-Status: Pending + +Signed-off-by: Wenzong Fan +diff --git a/pam/crond b/pam/crond +index 560529d..95a6457 100644 +--- a/pam/crond ++++ b/pam/crond +@@ -4,8 +4,8 @@ + # + # Although no PAM authentication is called, auth modules + # are used for credential setting +-auth include system-auth ++auth include common-auth + account required pam_access.so +-account include system-auth ++account include common-auth + session required pam_loginuid.so +-session include system-auth ++session include common-session-noninteractive diff --git a/meta-openeuler/recipes-core/cronie/cronie/crontab b/meta-openeuler/recipes-core/cronie/cronie/crontab new file mode 100644 index 00000000000..22c4feb2dc1 --- /dev/null +++ b/meta-openeuler/recipes-core/cronie/cronie/crontab @@ -0,0 +1,14 @@ +# /etc/crontab: system-wide crontab +# Unlike any other crontab you don't have to run the `crontab' +# command to install the new version when you edit this file +# and files in /etc/cron.d. These files also have username fields, +# that none of the other crontabs do. + +SHELL=/bin/sh +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + +# m h dom mon dow user command +# 1 * * * * root cd / && run-parts /etc/cron.hourly +# 30 7 * * * root cd / && run-parts /etc/cron.daily +# 42 7 * * 7 root cd / && run-parts /etc/cron.weekly +# 55 7 1 * * root cd / && run-parts /etc/cron.monthly diff --git a/meta-openeuler/recipes-core/cronie/cronie_1.5.7.bb b/meta-openeuler/recipes-core/cronie/cronie_1.5.7.bb new file mode 100644 index 00000000000..e08f19c6e5e --- /dev/null +++ b/meta-openeuler/recipes-core/cronie/cronie_1.5.7.bb @@ -0,0 +1,83 @@ +SUMMARY = "Cron daemon for executing programs at set times" +DESCRIPTION = "Cronie contains the standard UNIX daemon crond that runs \ +specified programs at scheduled times and related tools. It is based on the \ +original cron and has security and configuration enhancements like the \ +ability to use pam and SELinux." +HOMEPAGE = "https://github.com/cronie-crond/cronie/" +BUGTRACKER = "https://bugzilla.redhat.com" + +# Internet Systems Consortium License +LICENSE = "ISC & BSD-3-Clause & BSD-2-Clause & GPLv2+" +LIC_FILES_CHKSUM = "file://COPYING;md5=dd2a592170760e1386c769e1043b3722 \ + file://src/cron.c;endline=20;md5=b425c334265026177128353a142633b4 \ + file://src/popen.c;beginline=3;endline=31;md5=edd50742d8def712e9472dba353668a9" + +SECTION = "utils" + +UPSTREAM_CHECK_URI = "https://github.com/cronie-crond/${BPN}/releases/" + +SRC_URI = "file://cronie/${BP}.tar.gz \ + file://cronie/bugfix-cronie-systemd-alias.patch \ + file://crond.init \ + file://crontab \ + file://crond.service \ + ${@bb.utils.contains('DISTRO_FEATURES', 'pam', '${PAM_SRC_URI}', '', d)} \ +" + +PAM_SRC_URI = "file://crond_pam_config.patch" +PAM_DEPS = "libpam libpam-runtime pam-plugin-access pam-plugin-loginuid" + +SRC_URI[sha256sum] = "538bcfaf2e986e5ae1edf6d1472a77ea8271d6a9005aee2497a9ed6e13320eb3" + +inherit autotools systemd + +PACKAGECONFIG ?= "${@bb.utils.filter('DISTRO_FEATURES', 'pam', d)}" + +PACKAGECONFIG[audit] = "--with-audit,--without-audit,audit," +PACKAGECONFIG[pam] = "--with-pam,--without-pam,libpam,${PAM_DEPS}" +PACKAGECONFIG[anacron] = "--enable-anacron,--disable-anacron,anacron" + +INITSCRIPT_NAME = "crond" +INITSCRIPT_PARAMS = "start 90 2 3 4 5 . stop 60 0 1 6 ." + +USERADD_PACKAGES = "${PN}" +GROUPADD_PARAM_${PN} = "--system crontab" + +SYSTEMD_SERVICE_${PN} = "crond.service" + +do_install_append () { + install -d ${D}${sysconfdir}/sysconfig/ + install -d ${D}${sysconfdir}/init.d/ + install -m 0644 ${S}/crond.sysconfig ${D}${sysconfdir}/sysconfig/crond + install -m 0755 ${WORKDIR}/crond.init ${D}${sysconfdir}/init.d/crond + + # install systemd unit files + install -d ${D}${systemd_unitdir}/system + install -m 0644 ${WORKDIR}/crond.service ${D}${systemd_unitdir}/system + sed -i -e 's,@BASE_BINDIR@,${base_bindir},g' \ + -e 's,@SBINDIR@,${sbindir},g' \ + ${D}${systemd_unitdir}/system/crond.service + + # below are necessary for a complete cron environment + install -d ${D}${localstatedir}/spool/cron + install -m 0755 ${WORKDIR}/crontab ${D}${sysconfdir}/ + mkdir -p ${D}${sysconfdir}/cron.d + mkdir -p ${D}${sysconfdir}/cron.hourly + mkdir -p ${D}${sysconfdir}/cron.daily + mkdir -p ${D}${sysconfdir}/cron.weekly + mkdir -p ${D}${sysconfdir}/cron.monthly + touch ${D}${sysconfdir}/cron.deny + + # below setting is necessary to allow normal user using crontab + + # setgid for crontab binary + chmod 2755 ${D}${bindir}/crontab + + # allow 'crontab' group write to /var/spool/cron + chmod 770 ${D}${localstatedir}/spool/cron + + chmod 600 ${D}${sysconfdir}/crontab +} + +FILES_${PN} += "${sysconfdir}/cron*" +CONFFILES_${PN} += "${sysconfdir}/crontab" -- Gitee From c946dd41df06a19deb27ad169b8ddfe5f61540bf Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 20 Jan 2022 14:44:41 +0800 Subject: [PATCH 179/304] add recipe for libusb Signed-off-by: lixiaoyong --- .../recipes-core/libusb/libusb1/run-ptest | 29 ++++++++++++ .../recipes-core/libusb/libusb1_1.0.24.bb | 45 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100755 meta-openeuler/recipes-core/libusb/libusb1/run-ptest create mode 100644 meta-openeuler/recipes-core/libusb/libusb1_1.0.24.bb diff --git a/meta-openeuler/recipes-core/libusb/libusb1/run-ptest b/meta-openeuler/recipes-core/libusb/libusb1/run-ptest new file mode 100755 index 00000000000..eaa47a2bc4f --- /dev/null +++ b/meta-openeuler/recipes-core/libusb/libusb1/run-ptest @@ -0,0 +1,29 @@ +#!/bin/sh + +echo +echo "---------------------------- libusb1 tests ---------------------------" +echo + +./stress | { \ +while read -r str +do + echo "$str" + if [ "${str#*Starting test run:}" != "$str" ] + then + name="${str#Starting test run: }" + name="${name%...}" + else + case "$str" in + "Success (0)") + echo "PASS: $name" + ;; + "Failure (1)" | "Error (2)") + echo "FAIL: $name" + ;; + "Skip (3)") + echo "SKIP: $name" + ;; + esac + fi +done +} diff --git a/meta-openeuler/recipes-core/libusb/libusb1_1.0.24.bb b/meta-openeuler/recipes-core/libusb/libusb1_1.0.24.bb new file mode 100644 index 00000000000..3353b0c7024 --- /dev/null +++ b/meta-openeuler/recipes-core/libusb/libusb1_1.0.24.bb @@ -0,0 +1,45 @@ +SUMMARY = "Userspace library to access USB (version 1.0)" +DESCRIPTION = "A cross-platform library to access USB devices from Linux, \ +macOS, Windows, OpenBSD/NetBSD, Haiku and Solaris userspace." +HOMEPAGE = "http://libusb.sf.net" +BUGTRACKER = "http://www.libusb.org/report" +SECTION = "libs" + +LICENSE = "LGPLv2.1+" +LIC_FILES_CHKSUM = "file://COPYING;md5=fbc093901857fcd118f065f900982c24" + +BBCLASSEXTEND = "native nativesdk" + +SRC_URI = "file://libusbx/libusb-${PV}.tar.bz2 \ + file://run-ptest \ + " + +SRC_URI[sha256sum] = "7efd2685f7b327326dcfb85cee426d9b871fd70e22caa15bb68d595ce2a2b12a" + +S = "${WORKDIR}/libusb-${PV}" + +inherit autotools pkgconfig ptest + +PACKAGECONFIG-class-target ??= "" +PACKAGECONFIG[udev] = "--enable-udev,--disable-udev,udev" + +EXTRA_OECONF = "--libdir=${base_libdir} --disable-udev" + +do_install_append() { + install -d ${D}${libdir} + if [ ! ${D}${libdir} -ef ${D}${base_libdir} ]; then + mv ${D}${base_libdir}/pkgconfig ${D}${libdir} + fi +} + +do_compile_ptest() { + oe_runmake -C tests stress +} + +do_install_ptest() { + install -m 755 ${B}/tests/.libs/stress ${D}${PTEST_PATH} +} + +FILES_${PN} += "${base_libdir}/*.so.*" + +FILES_${PN}-dev += "${base_libdir}/*.so ${base_libdir}/*.la" -- Gitee From 6e8244ccbd38eb287b23de0877feaecf16061157 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 20 Jan 2022 14:45:38 +0800 Subject: [PATCH 180/304] add recipe for libxml Signed-off-by: lixiaoyong --- .../recipes-core/libxml/libxml2/run-ptest | 4 + .../recipes-core/libxml/libxml2_2.9.12.bb | 103 ++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 meta-openeuler/recipes-core/libxml/libxml2/run-ptest create mode 100644 meta-openeuler/recipes-core/libxml/libxml2_2.9.12.bb diff --git a/meta-openeuler/recipes-core/libxml/libxml2/run-ptest b/meta-openeuler/recipes-core/libxml/libxml2/run-ptest new file mode 100644 index 00000000000..c313d83263a --- /dev/null +++ b/meta-openeuler/recipes-core/libxml/libxml2/run-ptest @@ -0,0 +1,4 @@ +#!/bin/sh + +export LC_ALL=en_US.UTF-8 +make -k runtests diff --git a/meta-openeuler/recipes-core/libxml/libxml2_2.9.12.bb b/meta-openeuler/recipes-core/libxml/libxml2_2.9.12.bb new file mode 100644 index 00000000000..cab76b7266c --- /dev/null +++ b/meta-openeuler/recipes-core/libxml/libxml2_2.9.12.bb @@ -0,0 +1,103 @@ +SUMMARY = "XML C Parser Library and Toolkit" +DESCRIPTION = "The XML Parser Library allows for manipulation of XML files. Libxml2 exports Push and Pull type parser interfaces for both XML and HTML. It can do DTD validation at parse time, on a parsed document instance or with an arbitrary DTD. Libxml2 includes complete XPath, XPointer and Xinclude implementations. It also has a SAX like interface, which is designed to be compatible with Expat." +HOMEPAGE = "http://www.xmlsoft.org/" +BUGTRACKER = "http://bugzilla.gnome.org/buglist.cgi?product=libxml2" +SECTION = "libs" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://Copyright;md5=2044417e2e5006b65a8b9067b683fcf1 \ + file://hash.c;beginline=6;endline=15;md5=e77f77b12cb69e203d8b4090a0eee879 \ + file://list.c;beginline=4;endline=13;md5=b9c25b021ccaf287e50060602d20f3a7 \ + file://trio.c;beginline=5;endline=14;md5=cd4f61e27f88c1d43df112966b1cd28f \ +" + +DEPENDS = "zlib virtual/libiconv" + +SRC_URI = "file://libxml2/${BP}.tar.gz \ + file://libxml2/libxml2-multilib.patch \ + file://libxml2/Fix-XPath-recursion-limit.patch \ + file://libxml2/Fix-Null-deref-in-xmlSchemaGetComponentTargetNs.patch \ + file://libxml2/Fix-memleaks-in-xmlXIncludeProcessFlags.patch \ + file://libxml2/Fix-heap-use-after-free-in-xmlAddNextSibling-and-xmlAddChild.patch \ + file://libxml2/Work-around-lxml-API-abuse.patch \ + file://libxml2/Fix-regression-in-xmlNodeDumpOutputInternal.patch \ + file://libxml2/Fix-whitespace-when-serializing-empty-HTML-documents.patch \ + file://libxml2/Patch-to-forbid-epsilon-reduction-of-final-states.patch \ + file://libxml2/Fix-buffering-in-xmlOutputBufferWrite.patch \ + file://run-ptest \ + " + +SRC_URI[sha256sum] = "c8d6681e38c56f172892c85ddc0852e1fd4b53b4209e7f4ebf17f7e2eae71d92" + +BINCONFIG = "${bindir}/xml2-config" + +PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'ipv6', d)}" + +PACKAGECONFIG[python] = "--with-python=${PYTHON},--without-python,python3" +PACKAGECONFIG[ipv6] = "--enable-ipv6,--disable-ipv6," + +inherit autotools pkgconfig binconfig-disabled ptest python3native + +RDEPENDS_${PN}-ptest += "make ${@bb.utils.contains('PACKAGECONFIG', 'python', 'libgcc python3-core python3-logging python3-shell python3-stringold python3-threading python3-unittest ${PN}-python', '', d)}" + +RDEPENDS_${PN}-python += "${@bb.utils.contains('PACKAGECONFIG', 'python', 'python3-core', '', d)}" + +RDEPENDS_${PN}-ptest_append_libc-glibc = " glibc-gconv-ebcdic-us \ + glibc-gconv-ibm1141 \ + glibc-gconv-iso8859-5 \ + glibc-gconv-euc-jp \ + locale-base-en-us \ + " + +export PYTHON_SITE_PACKAGES="${PYTHON_SITEPACKAGES_DIR}" + +# WARNING: zlib is required for RPM use +EXTRA_OECONF = "--without-debug --without-legacy --with-catalog --without-docbook --with-c14n --without-lzma --with-fexceptions" +EXTRA_OECONF_class-native = "--without-legacy --without-docbook --with-c14n --without-lzma --with-zlib" +EXTRA_OECONF_class-nativesdk = "--without-legacy --without-docbook --with-c14n --without-lzma --with-zlib" +EXTRA_OECONF_linuxstdbase = "--with-debug --with-legacy --with-docbook --with-c14n --without-lzma --with-zlib" + +python populate_packages_prepend () { + # autonamer would call this libxml2-2, but we don't want that + if d.getVar('DEBIAN_NAMES'): + d.setVar('PKG_libxml2', '${MLPREFIX}libxml2') +} + +PACKAGE_BEFORE_PN += "${PN}-utils" +PACKAGES += "${PN}-python" + +FILES_${PN}-staticdev += "${PYTHON_SITEPACKAGES_DIR}/*.a" +FILES_${PN}-dev += "${libdir}/xml2Conf.sh ${libdir}/cmake/*" +FILES_${PN}-utils = "${bindir}/*" +FILES_${PN}-python = "${PYTHON_SITEPACKAGES_DIR}" + +do_compile_ptest() { + oe_runmake check-am +} + +do_install_ptest () { + cp -r ${S}/xmlconf ${D}${PTEST_PATH} + if [ "${@bb.utils.filter('PACKAGECONFIG', 'python', d)}" ]; then + sed -i -e 's|^\(PYTHON = \).*|\1${USRBINPATH}/${PYTHON_PN}|' \ + ${D}${PTEST_PATH}/python/tests/Makefile + grep -lrZ '#!/usr/bin/python' ${D}${PTEST_PATH}/python | + xargs -0 sed -i -e 's|/usr/bin/python|${USRBINPATH}/${PYTHON_PN}|' + fi + #Remove build host references from various Makefiles + find "${D}${PTEST_PATH}" -name Makefile -type f -exec \ + sed -i \ + -e 's,--sysroot=${STAGING_DIR_TARGET},,g' \ + -e 's|${DEBUG_PREFIX_MAP}||g' \ + -e 's:${HOSTTOOLS_DIR}/::g' \ + -e 's:${RECIPE_SYSROOT_NATIVE}::g' \ + -e 's:${RECIPE_SYSROOT}::g' \ + -e 's:${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}::g' \ + -e '/^RELDATE/d' \ + {} + +} + +do_install_append_class-native () { + # Docs are not needed in the native case + rm ${D}${datadir}/gtk-doc -rf +} + +BBCLASSEXTEND = "native nativesdk" -- Gitee From d3d08e4326e181b2869480a4cd548948caac0b97 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 20 Jan 2022 14:59:24 +0800 Subject: [PATCH 181/304] add recipe for kmod Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/kmod/kmod.inc | 35 +++++++++++ .../recipes-core/kmod/kmod/depmod-search.conf | 6 ++ .../recipes-core/kmod/kmod/run-ptest | 5 ++ meta-openeuler/recipes-core/kmod/kmod_29.bb | 61 +++++++++++++++++++ 4 files changed, 107 insertions(+) create mode 100644 meta-openeuler/recipes-core/kmod/kmod.inc create mode 100644 meta-openeuler/recipes-core/kmod/kmod/depmod-search.conf create mode 100755 meta-openeuler/recipes-core/kmod/kmod/run-ptest create mode 100644 meta-openeuler/recipes-core/kmod/kmod_29.bb diff --git a/meta-openeuler/recipes-core/kmod/kmod.inc b/meta-openeuler/recipes-core/kmod/kmod.inc new file mode 100644 index 00000000000..8efb473332a --- /dev/null +++ b/meta-openeuler/recipes-core/kmod/kmod.inc @@ -0,0 +1,35 @@ +# Copyright (C) 2012 Khem Raj +# Released under the MIT license (see COPYING.MIT for the terms) + +SUMMARY = "Tools for managing Linux kernel modules" +DESCRIPTION = "kmod is a set of tools to handle common tasks with Linux kernel modules like \ + insert, remove, list, check properties, resolve dependencies and aliases." +HOMEPAGE = "http://kernel.org/pub/linux/utils/kernel/kmod/" +LICENSE = "GPL-2.0+ & LGPL-2.1+" +LICENSE_libkmod = "LGPL-2.1+" +SECTION = "base" + +LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \ + file://libkmod/COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \ + file://tools/COPYING;md5=751419260aa954499f7abaabaa882bbe \ + " +inherit autotools pkgconfig manpages + +SRC_URI = "file://kmod/${BP}.tar.xz \ + file://kmod/0001-libkmod-module-check-new_from_name-return-value-in-g.patch \ + file://kmod/0002-Module-replace-the-module-with-new-module.patch \ + file://kmod/0003-Module-suspend-the-module-by-rmmod-r-option.patch \ + file://kmod/0004-don-t-check-module-s-refcnt-when-rmmod-with-r.patch \ + file://depmod-search.conf \ + " +SRC_URI[sha256sum] = "0b80eea7aa184ac6fd20cafa2a1fdf290ffecc70869a797079e2cc5c6225a52a" + +EXTRA_OECONF +=" --enable-tools --with-zlib" + +PACKAGECONFIG[debug] = "--enable-debug,--disable-debug" +PACKAGECONFIG[logging] = " --enable-logging,--disable-logging" +PACKAGECONFIG[manpages] = "--enable-manpages, --disable-manpages, libxslt-native xmlto-native" +PACKAGECONFIG[xz] = "--with-xz,--without-xz,xz" +PACKAGECONFIG[openssl] = "--with-openssl,--without-openssl,openssl" + +GTKDOC_DOCDIR = "${S}/libkmod/docs" diff --git a/meta-openeuler/recipes-core/kmod/kmod/depmod-search.conf b/meta-openeuler/recipes-core/kmod/kmod/depmod-search.conf new file mode 100644 index 00000000000..527c0bb6eeb --- /dev/null +++ b/meta-openeuler/recipes-core/kmod/kmod/depmod-search.conf @@ -0,0 +1,6 @@ +# +# /etc/depmod.d/depmod.conf +# + +search updates extramodules built-in + diff --git a/meta-openeuler/recipes-core/kmod/kmod/run-ptest b/meta-openeuler/recipes-core/kmod/kmod/run-ptest new file mode 100755 index 00000000000..598dd2cb5fb --- /dev/null +++ b/meta-openeuler/recipes-core/kmod/kmod/run-ptest @@ -0,0 +1,5 @@ +#!/bin/sh +touch testsuite/stamp-rootfs +tar xf testmodule.tar +make -k runtest-TESTS 2>/dev/null| grep -e ^PASS -e ^FAIL +find testsuite -name *.ko -exec rm -f {} \; diff --git a/meta-openeuler/recipes-core/kmod/kmod_29.bb b/meta-openeuler/recipes-core/kmod/kmod_29.bb new file mode 100644 index 00000000000..5ab65d6e8be --- /dev/null +++ b/meta-openeuler/recipes-core/kmod/kmod_29.bb @@ -0,0 +1,61 @@ +# Copyright (C) 2012 Khem Raj +# Released under the MIT license (see COPYING.MIT for the terms) + +require kmod.inc + +DEPENDS += "zlib" +PROVIDES += "module-init-tools-insmod-static module-init-tools-depmod module-init-tools" +RPROVIDES_${PN} += "module-init-tools-insmod-static module-init-tools-depmod module-init-tools" +RCONFLICTS_${PN} += "module-init-tools-insmod-static module-init-tools-depmod module-init-tools" +RREPLACES_${PN} += "module-init-tools-insmod-static module-init-tools-depmod module-init-tools" + +# to force user to remove old module-init-tools and replace them with kmod variants +RCONFLICTS_libkmod2 += "module-init-tools-insmod-static module-init-tools-depmod module-init-tools" + +# autotools set prefix to /usr, however we want them in /bin and /sbin +EXTRA_OECONF += " --bindir=${base_bindir} --sbindir=${base_sbindir}" + +do_install_append () { + install -dm755 ${D}${base_bindir} + install -dm755 ${D}${base_sbindir} + # add symlinks to kmod + lnr ${D}${base_bindir}/kmod ${D}${base_bindir}/lsmod + for tool in insmod rmmod depmod modinfo modprobe; do + lnr ${D}${base_bindir}/kmod ${D}${base_sbindir}/${tool} + done + # configuration directories + install -dm755 ${D}${base_libdir}/depmod.d + install -dm755 ${D}${base_libdir}/modprobe.d + install -dm755 ${D}${sysconfdir}/depmod.d + install -dm755 ${D}${sysconfdir}/modprobe.d + + # install depmod.d file for search/ dir + install -Dm644 "${WORKDIR}/depmod-search.conf" "${D}${base_libdir}/depmod.d/search.conf" +} + +do_compile_prepend() { + sed -i 's/ac_pwd=/#ac_pwd=/' config.status ; sed -i "/#ac_pwd=/a\ac_pwd='.'" config.status +} + +ALTERNATIVE_PRIORITY = "70" + +ALTERNATIVE_kmod = "insmod modprobe rmmod modinfo bin-lsmod lsmod depmod" + +ALTERNATIVE_LINK_NAME[insmod] = "${base_sbindir}/insmod" +ALTERNATIVE_LINK_NAME[modprobe] = "${base_sbindir}/modprobe" +ALTERNATIVE_LINK_NAME[rmmod] = "${base_sbindir}/rmmod" +ALTERNATIVE_LINK_NAME[modinfo] = "${base_sbindir}/modinfo" +ALTERNATIVE_LINK_NAME[bin-lsmod] = "${base_bindir}/lsmod" + +ALTERNATIVE_LINK_NAME[lsmod] = "${base_sbindir}/lsmod" +ALTERNATIVE_TARGET[lsmod] = "${base_bindir}/lsmod.${BPN}" + +ALTERNATIVE_LINK_NAME[depmod] = "${base_sbindir}/depmod" + +PACKAGES =+ "${PN}-bash-completion libkmod" + +FILES_${PN}-bash-completion = "${datadir}/bash-completion/completions" +FILES_libkmod = "${base_libdir}/libkmod*${SOLIBS} ${libdir}/libkmod*${SOLIBS}" +FILES_${PN} += "${base_libdir}/depmod.d ${base_libdir}/modprobe.d" + +BBCLASSEXTEND = "nativesdk" -- Gitee From 6907947951133b48d663a9a41852e6d6f890dc15 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 20 Jan 2022 15:01:01 +0800 Subject: [PATCH 182/304] add recipe for pciutils Signed-off-by: lixiaoyong --- .../pciutils/pciutils/configure.patch | 81 +++++++++++++++++++ .../recipes-core/pciutils/pciutils_3.7.0.bb | 62 ++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 meta-openeuler/recipes-core/pciutils/pciutils/configure.patch create mode 100644 meta-openeuler/recipes-core/pciutils/pciutils_3.7.0.bb diff --git a/meta-openeuler/recipes-core/pciutils/pciutils/configure.patch b/meta-openeuler/recipes-core/pciutils/pciutils/configure.patch new file mode 100644 index 00000000000..e444c139756 --- /dev/null +++ b/meta-openeuler/recipes-core/pciutils/pciutils/configure.patch @@ -0,0 +1,81 @@ +This patch: +* ensures we link correctly +* allows us to optionally pass target information to configure rather than using uname +* select linux as the platform in most cases we care about + +This is a merge of various tweaks to allow us to build pciutils including +work from: + +7/30/2010 - Qing He +1/22/2012 - Shane Wang +Ionut Radu +2017/6/15 - RP - Cleanups and merging patches + +Upstream-Status: Inappropriate [embedded specific] + +Index: pciutils-3.5.6/Makefile +=================================================================== +--- pciutils-3.5.6.orig/Makefile ++++ pciutils-3.5.6/Makefile +@@ -96,7 +96,7 @@ example: example.o lib/$(PCILIB) + example.o: example.c $(PCIINC) + + %: %.o +- $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ ++ $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LIB_LDLIBS) $(LDLIBS) -o $@ + + %.8 %.7 %.5: %.man + M=`echo $(DATE) | sed 's/-01-/-January-/;s/-02-/-February-/;s/-03-/-March-/;s/-04-/-April-/;s/-05-/-May-/;s/-06-/-June-/;s/-07-/-July-/;s/-08-/-August-/;s/-09-/-September-/;s/-10-/-October-/;s/-11-/-November-/;s/-12-/-December-/;s/\(.*\)-\(.*\)-\(.*\)/\3 \2 \1/'` ; sed <$< >$@ "s/@TODAY@/$$M/;s/@VERSION@/pciutils-$(VERSION)/;s#@IDSDIR@#$(IDSDIR)#" +Index: pciutils-3.5.6/lib/configure +=================================================================== +--- pciutils-3.5.6.orig/lib/configure ++++ pciutils-3.5.6/lib/configure +@@ -9,6 +9,10 @@ echo_n() { + printf '%s' "$*" + } + ++VERSION=$1 ++IDSDIR=$2 ++DNS=yes ++ + if [ -z "$VERSION" -o -z "$IDSDIR" ] ; then + echo >&2 "Please run the configure script from the top-level Makefile" + exit 1 +@@ -16,8 +20,8 @@ fi + + echo_n "Configuring libpci for your system..." + if [ -z "$HOST" ] ; then +- sys=`uname -s` +- rel=`uname -r` ++ sys=${3:-`uname -s`} ++ rel= + realsys="$sys" + if [ "$sys" = "AIX" -a -x /usr/bin/oslevel -a -x /usr/sbin/lsattr ] + then +@@ -25,7 +29,7 @@ if [ -z "$HOST" ] ; then + proc=`/usr/sbin/lsdev -C -c processor -S available -F name | head -1` + cpu=`/usr/sbin/lsattr -F value -l $proc -a type | sed 's/_.*//'` + else +- cpu=`uname -m | sed 's/^i.86$/i386/;s/^sun4u$/sparc64/;s/^i86pc$/i386/;s/^BePC$/i386/;s/^BeMac$/powerpc/;s/^BeBox$/powerpc/'` ++ cpu=${4:-`uname -m | sed 's/^i.86$/i386/;s/^sun4u$/sparc64/;s/^i86pc$/i386/;s/^BePC$/i386/;s/^BeMac$/powerpc/;s/^BeBox$/powerpc/'`} + fi + if [ "$sys" = "GNU/kFreeBSD" -o "$sys" = "DragonFly" ] + then +@@ -35,7 +39,7 @@ if [ -z "$HOST" ] ; then + then + sys=cygwin + fi +- HOST=${3:-$cpu-$sys} ++ HOST=$cpu-$sys + fi + [ -n "$RELEASE" ] && rel="${RELEASE}" + # CAVEAT: tr on Solaris is a bit weird and the extra [] is otherwise harmless. +@@ -44,6 +48,8 @@ cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` + sys=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + echo " $host $rel $cpu $sys" + ++{ echo "$host" | grep linux; } && sys=linux ++ + c=config.h + m=config.mk + echo >$c '#define PCI_CONFIG_H' diff --git a/meta-openeuler/recipes-core/pciutils/pciutils_3.7.0.bb b/meta-openeuler/recipes-core/pciutils/pciutils_3.7.0.bb new file mode 100644 index 00000000000..96c0a91d7a3 --- /dev/null +++ b/meta-openeuler/recipes-core/pciutils/pciutils_3.7.0.bb @@ -0,0 +1,62 @@ +SUMMARY = "PCI utilities" +DESCRIPTION = 'The PCI Utilities package contains a library for portable access \ +to PCI bus configuration space and several utilities based on this library.' +HOMEPAGE = "http://atrey.karlin.mff.cuni.cz/~mj/pciutils.shtml" +SECTION = "console/utils" + +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe" +DEPENDS = "zlib" + +SRC_URI = "file://pciutils/${BP}.tar.gz \ + file://pciutils/0000-pciutils-2.2.1-idpath.patch \ + file://pciutils/0001-pciutils-dir-d.patch \ + file://configure.patch \ +" + +SRC_URI[sha256sum] = "2432e7a2e12000502d36cf769ab6e5a0cf4931e5050ccaf8b02984b2d3cb0948" + +inherit multilib_header pkgconfig + +PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'hwdb', '', d)}" +PACKAGECONFIG[hwdb] = "HWDB=yes,HWDB=no,udev" + +PCI_CONF_FLAG = "ZLIB=yes DNS=yes SHARED=yes STRIP= LIBDIR=${libdir}" + +# see configure.patch +do_configure () { + ( + cd lib && \ + # PACKAGECONFIG_CONFARGS for this recipe could only possibly contain 'HWDB=yes/no', + # so we put it before ./configure + ${PCI_CONF_FLAG} ${PACKAGECONFIG_CONFARGS} ./configure ${PV} ${datadir} ${TARGET_OS} ${TARGET_ARCH} + ) +} + +export PREFIX = "${prefix}" +export SBINDIR = "${sbindir}" +export SHAREDIR = "${datadir}" +export MANDIR = "${mandir}" + +EXTRA_OEMAKE = "-e MAKEFLAGS= ${PCI_CONF_FLAG}" + +ASNEEDED = "" + +# The configure script breaks if the HOST variable is set +HOST[unexport] = "1" + +do_install () { + oe_runmake DESTDIR=${D} install install-lib + + install -d ${D}${bindir} + ln -s ../sbin/lspci ${D}${bindir}/lspci + + oe_multilib_header pci/config.h +} + +PACKAGES =+ "${PN}-ids libpci" +FILES_${PN}-ids = "${datadir}/hwdata/pci.ids*" +FILES_libpci = "${libdir}/libpci.so.*" +SUMMARY_${PN}-ids = "PCI utilities - device ID database" +DESCRIPTION_${PN}-ids = "Package providing the PCI device ID database for pciutils." +RDEPENDS_${PN} += "${PN}-ids" -- Gitee From dfa2b42046d47e6cc0f72515a53ada2572d874b5 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Thu, 20 Jan 2022 15:02:32 +0800 Subject: [PATCH 183/304] add recipe for procps-ng Signed-off-by: lixiaoyong --- .../recipes-core/procps/procps/sysctl.conf | 67 +++++++++++++ .../recipes-core/procps/procps_3.3.17.bb | 96 +++++++++++++++++++ 2 files changed, 163 insertions(+) create mode 100644 meta-openeuler/recipes-core/procps/procps/sysctl.conf create mode 100644 meta-openeuler/recipes-core/procps/procps_3.3.17.bb diff --git a/meta-openeuler/recipes-core/procps/procps/sysctl.conf b/meta-openeuler/recipes-core/procps/procps/sysctl.conf new file mode 100644 index 00000000000..253f3701bd3 --- /dev/null +++ b/meta-openeuler/recipes-core/procps/procps/sysctl.conf @@ -0,0 +1,67 @@ +# This configuration taken from procps v3.3.15 +# Commented out kernel/pid_max=10000 line +# +# /etc/sysctl.conf - Configuration file for setting system variables +# See sysctl.conf (5) for information. + +# you can have the CD-ROM close when you use it, and open +# when you are done. +#dev.cdrom.autoeject = 1 +#dev.cdrom.autoclose = 1 + +# protection from the SYN flood attack +net/ipv4/tcp_syncookies=1 + +# see the evil packets in your log files +net/ipv4/conf/all/log_martians=1 + +# makes you vulnerable or not :-) +net/ipv4/conf/all/accept_redirects=0 +net/ipv4/conf/all/accept_source_route=0 +net/ipv4/icmp_echo_ignore_broadcasts =1 + +# needed for routing, including masquerading or NAT +#net/ipv4/ip_forward=1 + +# sets the port range used for outgoing connections +#net.ipv4.ip_local_port_range = 32768 61000 + +# Broken routers and obsolete firewalls will corrupt the window scaling +# and ECN. Set these values to 0 to disable window scaling and ECN. +# This may, rarely, cause some performance loss when running high-speed +# TCP/IP over huge distances or running TCP/IP over connections with high +# packet loss and modern routers. This sure beats dropped connections. +#net.ipv4.tcp_ecn = 0 + +# Swapping too much or not enough? Disks spinning up when you'd +# rather they didn't? Tweak these. +#vm.vfs_cache_pressure = 100 +#vm.laptop_mode = 0 +#vm.swappiness = 60 + +#kernel.printk_ratelimit_burst = 10 +#kernel.printk_ratelimit = 5 +#kernel.panic_on_oops = 0 + +# Reboot 600 seconds after a panic +#kernel.panic = 600 + +# enable SysRq key (note: console security issues) +#kernel.sysrq = 1 + +# Change name of core file to start with the command name +# so you get things like: emacs.core mozilla-bin.core X.core +#kernel.core_pattern = %e.core + +# NIS/YP domain (not always equal to DNS domain) +#kernel.domainname = example.com +#kernel.hostname = darkstar + +# This limits PID values to 4 digits, which allows tools like ps +# to save screen space. +#kernel/pid_max=10000 + +# Protects against creating or following links under certain conditions +# See https://www.kernel.org/doc/Documentation/sysctl/fs.txt +#fs.protected_hardlinks = 1 +#fs.protected_symlinks = 1 diff --git a/meta-openeuler/recipes-core/procps/procps_3.3.17.bb b/meta-openeuler/recipes-core/procps/procps_3.3.17.bb new file mode 100644 index 00000000000..89938044e46 --- /dev/null +++ b/meta-openeuler/recipes-core/procps/procps_3.3.17.bb @@ -0,0 +1,96 @@ +SUMMARY = "System and process monitoring utilities" +DESCRIPTION = "Procps contains a set of system utilities that provide system information about processes using \ +the /proc filesystem. The package includes the programs ps, top, vmstat, w, kill, and skill." +HOMEPAGE = "https://gitlab.com/procps-ng/procps" +SECTION = "base" +LICENSE = "GPLv2+ & LGPLv2+" +LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ + file://COPYING.LIB;md5=4cf66a4984120007c9881cc871cf49db \ + " + +DEPENDS = "ncurses" + +inherit autotools gettext pkgconfig + +SRC_URI = "file://procps-ng/procps-ng-${PV}.tar.xz \ + file://procps-ng/0001-top-fix-two-potential-alternate-display-mode-abends.patch \ + file://procps-ng/0002-top-In-the-bye_bye-function-replace-fputs-with-the-w.patch \ + file://procps-ng/0003-add-options-M-and-N-for-top.patch \ + file://procps-ng/0004-top-exit-with-error-when-pid-overflow.patch \ + file://sysctl.conf \ + " +SRC_URI[sha256sum] = "4518b3e7aafd34ec07d0063d250fd474999b20b200218c3ae56f5d2113f141b4" + +EXTRA_OECONF = "--enable-skill --disable-modern-top" + +PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)}" +PACKAGECONFIG[systemd] = "--with-systemd,--without-systemd,systemd" + +do_install_append () { + install -d ${D}${base_bindir} + [ "${bindir}" != "${base_bindir}" ] && for i in ${base_bindir_progs}; do mv ${D}${bindir}/$i ${D}${base_bindir}/$i; done + install -d ${D}${base_sbindir} + [ "${sbindir}" != "${base_sbindir}" ] && for i in ${base_sbindir_progs}; do mv ${D}${sbindir}/$i ${D}${base_sbindir}/$i; done + if [ "${base_sbindir}" != "${sbindir}" ]; then + rmdir ${D}${sbindir} + fi + + install -d ${D}${sysconfdir} + install -m 0644 ${WORKDIR}/sysctl.conf ${D}${sysconfdir}/sysctl.conf + if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then + install -d ${D}${sysconfdir}/sysctl.d + ln -sf ../sysctl.conf ${D}${sysconfdir}/sysctl.d/99-sysctl.conf + fi +} + +CONFFILES_${PN} = "${sysconfdir}/sysctl.conf" + +bindir_progs = "free pkill pmap pgrep pwdx skill snice top uptime w" +base_bindir_progs += "kill pidof ps watch" +base_sbindir_progs += "sysctl" + +ALTERNATIVE_PRIORITY = "200" +ALTERNATIVE_PRIORITY[pidof] = "150" + +ALTERNATIVE_${PN} = "${bindir_progs} ${base_bindir_progs} ${base_sbindir_progs}" + +ALTERNATIVE_${PN}-doc = "kill.1 uptime.1" +ALTERNATIVE_LINK_NAME[kill.1] = "${mandir}/man1/kill.1" +ALTERNATIVE_LINK_NAME[uptime.1] = "${mandir}/man1/uptime.1" + +python __anonymous() { + for prog in d.getVar('base_bindir_progs').split(): + d.setVarFlag('ALTERNATIVE_LINK_NAME', prog, '%s/%s' % (d.getVar('base_bindir'), prog)) + + for prog in d.getVar('base_sbindir_progs').split(): + d.setVarFlag('ALTERNATIVE_LINK_NAME', prog, '%s/%s' % (d.getVar('base_sbindir'), prog)) +} + +# 'ps' isn't suitable for use as a security tool so whitelist this CVE. +# https://bugzilla.redhat.com/show_bug.cgi?id=1575473#c3 +CVE_CHECK_WHITELIST += "CVE-2018-1121" + +PROCPS_PACKAGES = "${PN}-lib \ + ${PN}-ps \ + ${PN}-sysctl" + +PACKAGE_BEFORE_PN = "${PROCPS_PACKAGES}" +RDEPENDS_${PN} += "${PROCPS_PACKAGES}" + +RDEPENDS_${PN}-ps += "${PN}-lib" +RDEPENDS_${PN}-sysctl += "${PN}-lib" + +FILES_${PN}-lib = "${libdir}" +FILES_${PN}-ps = "${base_bindir}/ps.${BPN}" +FILES_${PN}-sysctl = "${base_sbindir}/sysctl.${BPN} ${sysconfdir}/sysctl.conf ${sysconfdir}/sysctl.d" + +ALTERNATIVE_${PN}_remove = "ps" +ALTERNATIVE_${PN}_remove = "sysctl" + +ALTERNATIVE_${PN}-ps = "ps" +ALTERNATIVE_TARGET[ps] = "${base_bindir}/ps" +ALTERNATIVE_LINK_NAME[ps] = "${base_bindir}/ps" + +ALTERNATIVE_${PN}-sysctl = "sysctl" +ALTERNATIVE_TARGET[sysctl] = "${base_sbindir}/sysctl" +ALTERNATIVE_LINK_NAME[sysctl] = "${base_sbindir}/sysctl" -- Gitee From d9eb5adb19e2e2b39e47f9029d3a7b9b3c69ba01 Mon Sep 17 00:00:00 2001 From: ShiXin Date: Sat, 22 Jan 2022 16:18:23 +0800 Subject: [PATCH 184/304] pam upgrade to 1.5.2 Signed-off-by: ShiXin --- .../0001-Makefile.am-support-usrmage.patch | 28 ------------------- ...space-Makefile.am-correctly-install-.patch | 28 ------------------- .../pam/{libpam_1.5.1.bb => libpam_1.5.2.bb} | 14 ++++++---- 3 files changed, 9 insertions(+), 61 deletions(-) delete mode 100644 meta-openeuler/recipes-core/pam/libpam/0001-Makefile.am-support-usrmage.patch delete mode 100644 meta-openeuler/recipes-core/pam/libpam/0001-modules-pam_namespace-Makefile.am-correctly-install-.patch rename meta-openeuler/recipes-core/pam/{libpam_1.5.1.bb => libpam_1.5.2.bb} (90%) diff --git a/meta-openeuler/recipes-core/pam/libpam/0001-Makefile.am-support-usrmage.patch b/meta-openeuler/recipes-core/pam/libpam/0001-Makefile.am-support-usrmage.patch deleted file mode 100644 index 740ba522c67..00000000000 --- a/meta-openeuler/recipes-core/pam/libpam/0001-Makefile.am-support-usrmage.patch +++ /dev/null @@ -1,28 +0,0 @@ -From c09e012590c1ec2d3b622b64f1bfc10a2286c9ea Mon Sep 17 00:00:00 2001 -From: Changqing Li -Date: Wed, 6 Jan 2021 12:08:20 +0800 -Subject: [PATCH] Makefile.am: support usrmage - -Upstream-Status: Inappropriate [oe-specific] - -Signed-off-by: Changqing Li ---- - modules/pam_namespace/Makefile.am | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/modules/pam_namespace/Makefile.am b/modules/pam_namespace/Makefile.am -index ddd5fc0..a1f1bec 100644 ---- a/modules/pam_namespace/Makefile.am -+++ b/modules/pam_namespace/Makefile.am -@@ -18,7 +18,7 @@ TESTS = $(dist_check_SCRIPTS) - securelibdir = $(SECUREDIR) - secureconfdir = $(SCONFIGDIR) - namespaceddir = $(SCONFIGDIR)/namespace.d --servicedir = /lib/systemd/system -+servicedir = $(systemd_system_unitdir) - - AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include \ - -DSECURECONF_DIR=\"$(SCONFIGDIR)/\" $(WARN_CFLAGS) --- -2.17.1 - diff --git a/meta-openeuler/recipes-core/pam/libpam/0001-modules-pam_namespace-Makefile.am-correctly-install-.patch b/meta-openeuler/recipes-core/pam/libpam/0001-modules-pam_namespace-Makefile.am-correctly-install-.patch deleted file mode 100644 index 6a3e26364cb..00000000000 --- a/meta-openeuler/recipes-core/pam/libpam/0001-modules-pam_namespace-Makefile.am-correctly-install-.patch +++ /dev/null @@ -1,28 +0,0 @@ -From e2db4082f6b988f1d5803028e9e47aee5f3519ac Mon Sep 17 00:00:00 2001 -From: Alexander Kanavin -Date: Sun, 27 Dec 2020 00:30:45 +0100 -Subject: [PATCH] modules/pam_namespace/Makefile.am: correctly install systemd - unit file - -Upstream-Status: Pending -Signed-off-by: Alexander Kanavin ---- - modules/pam_namespace/Makefile.am | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/modules/pam_namespace/Makefile.am b/modules/pam_namespace/Makefile.am -index 21e1b33..ddd5fc0 100644 ---- a/modules/pam_namespace/Makefile.am -+++ b/modules/pam_namespace/Makefile.am -@@ -18,7 +18,7 @@ TESTS = $(dist_check_SCRIPTS) - securelibdir = $(SECUREDIR) - secureconfdir = $(SCONFIGDIR) - namespaceddir = $(SCONFIGDIR)/namespace.d --servicedir = $(prefix)/lib/systemd/system -+servicedir = /lib/systemd/system - - AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include \ - -DSECURECONF_DIR=\"$(SCONFIGDIR)/\" $(WARN_CFLAGS) --- -2.24.0 - diff --git a/meta-openeuler/recipes-core/pam/libpam_1.5.1.bb b/meta-openeuler/recipes-core/pam/libpam_1.5.2.bb similarity index 90% rename from meta-openeuler/recipes-core/pam/libpam_1.5.1.bb rename to meta-openeuler/recipes-core/pam/libpam_1.5.2.bb index 29b964bd663..179eb2efff0 100644 --- a/meta-openeuler/recipes-core/pam/libpam_1.5.1.bb +++ b/meta-openeuler/recipes-core/pam/libpam_1.5.2.bb @@ -13,6 +13,10 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=7eb5c1bf854e8881005d673599ee74d3 \ " SRC_URI = "file://pam/Linux-PAM-${PV}.tar.xz \ + file://pam/bugfix-pam-1.1.8-faillock-systemtime.patch \ + file://pam/openEuler-change-ndbm-to-gdbm.patch \ + file://pam/0001-bugfix-cannot-open-database-file.patch \ + file://pam/add-sm3-crypt-support.patch \ file://99_pam \ file://pam.d/common-account \ file://pam.d/common-auth \ @@ -21,13 +25,11 @@ SRC_URI = "file://pam/Linux-PAM-${PV}.tar.xz \ file://pam.d/common-session-noninteractive \ file://pam.d/other \ file://libpam-xtests.patch \ - file://0001-modules-pam_namespace-Makefile.am-correctly-install-.patch \ - file://0001-Makefile.am-support-usrmage.patch \ file://run-ptest \ file://pam-volatiles.conf \ - " +" -SRC_URI[sha256sum] = "201d40730b1135b1b3cdea09f2c28ac634d73181ccd0172ceddee3649c5792fc" +SRC_URI[sha256sum] = "e4ec7131a91da44512574268f493c6d8ca105c87091691b8e9b56ca685d4f94d" #DEPENDS = "bison-native flex flex-native cracklib libxml2-native virtual/crypt" DEPENDS = "cracklib" @@ -51,11 +53,13 @@ PACKAGECONFIG ??= "" PACKAGECONFIG[audit] = "--enable-audit,--disable-audit,audit," PACKAGECONFIG[userdb] = "--enable-db=db,--enable-db=no,db," -PACKAGES += "${PN}-runtime ${PN}-xtests" +PACKAGES += "${PN}-runtime ${PN}-xtests ${PN}-pkgconfig ${PN}-service" FILES_${PN} = "${base_libdir}/lib*${SOLIBS}" FILES_${PN}-dev += "${base_libdir}/security/*.la ${base_libdir}/*.la ${base_libdir}/lib*${SOLIBSDEV}" FILES_${PN}-runtime = "${sysconfdir} ${sbindir} ${systemd_system_unitdir}" FILES_${PN}-xtests = "${datadir}/Linux-PAM/xtests" +FILES_${PN}-pkgconfig = "${base_libdir}/pkgconfig" +FILES_${PN}-service = "/usr/lib/systemd/system" PACKAGES_DYNAMIC += "^${MLPREFIX}pam-plugin-.*" -- Gitee From 6d2f1d76b1e7ddf6f127f89f68c17e2ac01c72fc Mon Sep 17 00:00:00 2001 From: ShiXin Date: Sat, 22 Jan 2022 16:23:47 +0800 Subject: [PATCH 185/304] audit upgrade to 3.0.1 Signed-off-by: ShiXin --- .../audit/{audit_3.0.bb => audit_3.0.1.bb} | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) rename meta-openeuler/recipes-core/audit/{audit_3.0.bb => audit_3.0.1.bb} (64%) diff --git a/meta-openeuler/recipes-core/audit/audit_3.0.bb b/meta-openeuler/recipes-core/audit/audit_3.0.1.bb similarity index 64% rename from meta-openeuler/recipes-core/audit/audit_3.0.bb rename to meta-openeuler/recipes-core/audit/audit_3.0.1.bb index 29b26c5e9de..5bcc11f4e1a 100644 --- a/meta-openeuler/recipes-core/audit/audit_3.0.bb +++ b/meta-openeuler/recipes-core/audit/audit_3.0.1.bb @@ -10,11 +10,34 @@ LICENSE = "GPLv2+ & LGPLv2+" inherit autotools LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" -SRC_URI = "file://audit/audit-${PV}.tar.gz \ +SRC_URI = "file://audit/${BP}.tar.gz \ + file://audit/bugfix-audit-support-armv7b.patch \ + file://audit/bugfix-audit-userspace-missing-syscalls-for-aarm64.patch \ + file://audit/bugfix-audit-reload-coredump.patch \ + file://audit/backport-Fix-the-default-location-for-zos-remote.conf-171.patch \ + file://audit/backport-Add-missing-call-to-free_interpretation_list.patch \ + file://audit/backport-fix-2-more-issues-found-by-fuzzing.patch \ + file://audit/backport-Fix-an-auparse-memory-leak-caused-in-recent-glibc.patch \ + file://audit/backport-Fix-double-free-with-corrupted-logs.patch \ + file://audit/backport-Fix-the-closing-timing-of-audit_fd-166.patch \ + file://audit/backport-Fix-some-string-length-issues.patch \ + file://audit/backport-Move-the-free_config-to-success-path.patch \ + file://audit/backport-Check-for-fuzzer-induced-invalid-value.patch \ + file://audit/backport-error-out-if-log-is-mangled.patch \ + file://audit/backport-Dont-run-off-the-end-with-corrupt-logs.patch \ + file://audit/backport-Another-hardening-measure-for-corrupted-logs.patch \ + file://audit/backport-Fix-busy-loop-in-normalizer-when-logs-are-corrupt.patch \ + file://audit/backport-Better-fix-for-busy-loop-in-normalizer-when-logs-are.patch \ + file://audit/backport-flush-uid-gid-caches-when-user-group-added-deleted-m.patch \ + file://audit/backport-In-auditd-check-if-log_file-is-valid-before-closing-.patch \ + file://audit/backport-Check-ctime-return-code.patch \ + file://audit/backport-When-interpreting-if-val-is-NULL-return-an-empty-str.patch \ + file://audit/backport-auditd.service-Restart-on-failure-ignoring-some-exit.patch \ + file://audit/backport-0001-In-auditd-close-the-logging-file-descriptor-when-log.patch \ + file://audit/backport-0002-In-auditd-close-the-logging-file-descriptor-when-log.patch \ file://auditd.conf \ file://audit.rules \ - " - +" UPDATERCPN = "auditd" INITSCRIPT_NAME = "auditd" -- Gitee From ad6d306d15ac665b6ef828fc5e1f75f4c98b387c Mon Sep 17 00:00:00 2001 From: ShiXin Date: Sat, 22 Jan 2022 16:26:01 +0800 Subject: [PATCH 186/304] shadow upgrade to 4.9 Signed-off-by: ShiXin --- meta-openeuler/recipes-core/shadow/shadow.inc | 31 ++++++++++++++++--- .../shadow/{shadow_4.8.1.bb => shadow_4.9.bb} | 0 2 files changed, 27 insertions(+), 4 deletions(-) rename meta-openeuler/recipes-core/shadow/{shadow_4.8.1.bb => shadow_4.9.bb} (100%) diff --git a/meta-openeuler/recipes-core/shadow/shadow.inc b/meta-openeuler/recipes-core/shadow/shadow.inc index a003cde1fe3..d0459063947 100644 --- a/meta-openeuler/recipes-core/shadow/shadow.inc +++ b/meta-openeuler/recipes-core/shadow/shadow.inc @@ -66,7 +66,30 @@ RDEPENDS_${PN}_remove += "base-passwd" RDEPENDS_${PN}_class-native = "" RDEPENDS_${PN}_class-nativesdk = "" -SRC_URI = "file://shadow/shadow-4.8.1.tar.xz" +SRC_URI = "file://shadow/${BP}.tar.xz \ + file://shadow/shadow-4.8-goodname.patch \ + file://shadow/shadow-4.9-null-tm.patch \ + file://shadow/shadow-4.8-long-entry.patch \ + file://shadow/usermod-unlock.patch \ + file://shadow/useradd-create-directories-after-the-SELinux-user.patch \ + file://shadow/shadow-4.1.5.1-var-lock.patch \ + file://shadow/shadow-utils-fix-lock-file-residue.patch \ + file://shadow/Makefile-include-libeconf-dependency-in-new-idmap.patch \ + file://shadow/usermod-allow-all-group-types-with-G-option.patch \ + file://shadow/useradd-avoid-generating-an-empty-subid-range.patch \ + file://shadow/libmisc-fix-default-value-in-SHA_get_salt_rounds.patch \ + file://shadow/semanage-close-the-selabel-handle.patch \ + file://shadow/Revert-useradd.c-fix-memleaks-of-grp.patch \ + file://shadow/useradd-change-SELinux-labels-for-home-files.patch \ + file://shadow/libsubid-link-to-PAM-libraries.patch \ + file://shadow/Fix-out-of-tree-builds-with-respect-to-libsubid-incl.patch \ + file://shadow/Respect-enable-static-no-in-libsubid.patch \ + file://shadow/Fixes-the-linking-issues-when-libsubid-is-static-and.patch \ + file://shadow/pwck-fix-segfault-when-calling-fprintf.patch \ + file://shadow/newgrp-fix-segmentation-fault.patch \ + file://shadow/groupdel-fix-SIGSEGV-when-passwd-does-not-exist.patch \ + file://shadow/shadow-add-sm3-crypt-support.patch \ +" LIC_FILES_CHKSUM="file://COPYING;md5=ed80ff1c2b40843cf5768e5229cf16e5" @@ -132,11 +155,11 @@ do_install() { sed -i 's/^#MAIL_DIR/MAIL_DIR/g' ${D}${sysconfdir}/login.defs # Now we don't have a mail system. Disable mail creation for now. - sed -i 's:/bin/bash:/bin/sh:g' ${D}${sysconfdir}/default/useradd - sed -i '/^CREATE_MAIL_SPOOL/ s:^:#:' ${D}${sysconfdir}/default/useradd + #sed -i 's:/bin/bash:/bin/sh:g' ${D}${sysconfdir}/default/useradd + #sed -i '/^CREATE_MAIL_SPOOL/ s:^:#:' ${D}${sysconfdir}/default/useradd # Use users group by default - sed -i 's,^GROUP=1000,GROUP=100,g' ${D}${sysconfdir}/default/useradd + #sed -i 's,^GROUP=1000,GROUP=100,g' ${D}${sysconfdir}/default/useradd } do_install_append() { diff --git a/meta-openeuler/recipes-core/shadow/shadow_4.8.1.bb b/meta-openeuler/recipes-core/shadow/shadow_4.9.bb similarity index 100% rename from meta-openeuler/recipes-core/shadow/shadow_4.8.1.bb rename to meta-openeuler/recipes-core/shadow/shadow_4.9.bb -- Gitee From db465e2a89765c17d650cb570d9ef7282ffcc37c Mon Sep 17 00:00:00 2001 From: lisimin Date: Sat, 22 Jan 2022 18:21:19 +0800 Subject: [PATCH 187/304] support build do_populate_sdk Signed-off-by: lisimin --- meta-openeuler/conf/local.conf.sample | 4 +++- .../recipes-core/glibc/glibc_2.34.bb | 14 +++++++++++-- .../recipes-core/images/openeuler-image.bb | 20 +++++++++++++++---- .../binutils/binutils-crosssdk_%.bbappend | 2 ++ 4 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 meta-openeuler/recipes-devtools/binutils/binutils-crosssdk_%.bbappend diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index f36d1c3aaed..f06fc21ead9 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -285,7 +285,9 @@ ASSUME_PROVIDED += "rpm-native dwarfsrcfiles-native depmodwrapper-cross kmod-nat pixman-native texinfo-dummy-native python3-native python3-setuptools-native gettext-native \ m4-native flex-native unifdef-native rsync-native init-system-helpers automake-native \ autoconf-native libtool-native opkg-utils-native patch-native pkgconfig-native \ - init-system-helpers update-rc.d-native run-postinsts cmake-native ninja-native" + init-system-helpers update-rc.d-native run-postinsts cmake-native ninja-native \ + cross-localedef-native nativesdk-glibc-locale nativesdk-qemuwrapper-cross \ + " PATCHTOOL = "patch" TCMODE = "gcc-bin" INHERIT_remove += "uninative" diff --git a/meta-openeuler/recipes-core/glibc/glibc_2.34.bb b/meta-openeuler/recipes-core/glibc/glibc_2.34.bb index f1a7bd36ebc..459fc1882bb 100644 --- a/meta-openeuler/recipes-core/glibc/glibc_2.34.bb +++ b/meta-openeuler/recipes-core/glibc/glibc_2.34.bb @@ -23,6 +23,7 @@ require ../../recipes-devtools/gcc/gcc-bin-toolchain.inc SRC_URI_aarch64 = "file://openeuler_gcc_arm64le" SRC_URI_arm = "file://openeuler_gcc_arm32le" +SRC_URI_class-nativesdk = "" #Not strip toolchain INHIBIT_SYSROOT_STRIP = "1" @@ -48,12 +49,21 @@ do_install() { install -m 0755 -d ${D}/${libdir} cp -pPR ${S}/sysroot/* ${D}/ rm -rf ${D}/etc/rpc - rm -rf ${D}/${base_libdir}/debug + rm -rf ${D}${datadir}/info + rm -rf ${D}${base_libdir}/debug chown root:root ${D}/ -R } +do_install_class-nativesdk() { + test -d ${D}/${base_libdir} || mkdir -p ${D}/${base_libdir} + pushd ${D}/${base_libdir} + local ldso="$(ldconfig -p | grep ld-linux | awk '{print $NF}')" + cp -p "${ldso}" ld-linux.so + popd +} + FILES_${PN} = " \ - ${base_libdir}/ld-linux*.so.* \ + ${base_libdir}/ld-linux*.so* \ ${libdir}/libc.so \ ${base_libdir}/libm.so \ ${base_libdir}/libc.so.6 \ diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 32aee147a23..b1fad56c429 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -14,6 +14,22 @@ INITRAMFS_MAXSIZE = "262144" #delete depends to cpio-native do_image_cpio[depends] = "" +inherit populate_sdk +#set IMAGE_LOCALES_ARCHIVE to 0 and unset SDKIMAGE_LINGUAS, to avoid run generate_locale_archive() +IMAGE_LOCALES_ARCHIVE = "0" +SDKIMAGE_LINGUAS = "" + +inherit populate_sdk_ext +export SDK_OS = "linux" +TOOLCHAIN_HOST_TASK_task-populate-sdk-ext = "" +TOOLCHAIN_HOST_TASK = " \ +meta-environment-${MACHINE} \ +nativesdk-glibc \ +" +FEATURE_PACKAGES_tools-sdk_remove = " packagegroup-core-sdk packagegroup-core-standalone-sdk-target" +TOOLCHAIN_TARGET_TASK_remove += "${@multilib_pkg_extend(d, 'packagegroup-core-standalone-sdk-target')}" + + #not add run-postinsts to PACKAGE_INSTALL, so that not fail when do_rootfs?? ROOTFS_BOOTSTRAP_INSTALL = "" @@ -23,14 +39,10 @@ do_rootfs[depends] = "" #LDCONFIGDEPEND = "" DEPENDS_remove += "qemuwrapper-cross depmodwrapper-cross cross-localedef-native" RPMROOTFSDEPENDS = "" -FEATURE_PACKAGES_tools-sdk_remove = " packagegroup-core-sdk packagegroup-core-standalone-sdk-target" -TOOLCHAIN_TARGET_TASK_remove += "${@multilib_pkg_extend(d, 'packagegroup-core-standalone-sdk-target')}" #IMAGE_ROOTFS_SIZE ?= "8192" #IMAGE_ROOTFS_EXTRA_SPACE_append = "${@bb.utils.contains("DISTRO_FEATURES", "systemd", " + 4096", "", d)}" -TOOLCHAIN_HOST_TASK_task-populate-sdk-ext = "" -TOOLCHAIN_HOST_TASK = "" OUTPUT_DIR = "${TOPDIR}/output" #No kernel-abiversion file found, cannot run depmod, aborting diff --git a/meta-openeuler/recipes-devtools/binutils/binutils-crosssdk_%.bbappend b/meta-openeuler/recipes-devtools/binutils/binutils-crosssdk_%.bbappend new file mode 100644 index 00000000000..5e0eda5b432 --- /dev/null +++ b/meta-openeuler/recipes-devtools/binutils/binutils-crosssdk_%.bbappend @@ -0,0 +1,2 @@ +PV = "2.37" +require binutils-${PV}.inc -- Gitee From 2137c355d01bbaa0b6e37f34b71e60aac0ac4fe4 Mon Sep 17 00:00:00 2001 From: lisimin Date: Mon, 24 Jan 2022 18:31:51 +0800 Subject: [PATCH 188/304] use BBFILES_DYNAMIC to enable bsp/meta-openeuer-bsp/raspberrypi when we enable meta-raspberrypi Signed-off-by: lisimin --- bsp/meta-openeuler-bsp/conf/layer.conf | 28 +++++++++++++++++++ .../raspberrypi/conf/layer.conf | 13 --------- meta-openeuler/conf/bblayers.conf.sample | 1 + 3 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 bsp/meta-openeuler-bsp/conf/layer.conf delete mode 100644 bsp/meta-openeuler-bsp/raspberrypi/conf/layer.conf diff --git a/bsp/meta-openeuler-bsp/conf/layer.conf b/bsp/meta-openeuler-bsp/conf/layer.conf new file mode 100644 index 00000000000..ca1deb16cfd --- /dev/null +++ b/bsp/meta-openeuler-bsp/conf/layer.conf @@ -0,0 +1,28 @@ +# We have a conf and classes directory, add to BBPATH +BBPATH =. "${LAYERDIR}:" + +# We have recipes-* directories, add to BBFILES +BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ + ${LAYERDIR}/recipes-*/*/*.bbappend" + +BBFILE_COLLECTIONS += "openeuler-bsp" +BBFILE_PATTERN_openeuler-bsp = "^${LAYERDIR}/" +BBFILE_PRIORITY_openeuler-bsp = "25" + +LAYERSERIES_COMPAT_openeuler-bsp = "hardknott honister" +#no bb file under meta-openeuler-bsp, set it to 1 to ignore "No bb files" warning +BBFILE_PATTERN_IGNORE_EMPTY_openeuler-bsp = "1" + + +#enable .bb under raspberrypi/ when exist meta-raspberrypi +BBFILES += "${@' '.join('${LAYERDIR}/%s/recipes*/*/*.bbappend' % layer \ +for layer in BBFILE_COLLECTIONS.split())}" +BBFILES += "${@' '.join('${LAYERDIR}/%s/recipes*/*/*.bb' % layer \ +for layer in BBFILE_COLLECTIONS.split())}" +BBFILES_DYNAMIC += " \ +meta-raspberrypi:${LAYERDIR}/raspberrypi/*/*/*.bb \ +meta-raspberrypi:${LAYERDIR}/raspberrypi/*/*/*.bbappend \ +" + +#enable find .inc under raspberrypi/, included in .bb +BBPATH_append =. ":${LAYERDIR}/raspberrypi" diff --git a/bsp/meta-openeuler-bsp/raspberrypi/conf/layer.conf b/bsp/meta-openeuler-bsp/raspberrypi/conf/layer.conf deleted file mode 100644 index 8a5eb624869..00000000000 --- a/bsp/meta-openeuler-bsp/raspberrypi/conf/layer.conf +++ /dev/null @@ -1,13 +0,0 @@ -# We have a conf and classes directory, append to BBPATH -BBPATH .= ":${LAYERDIR}" - -# We have a recipes directory containing .bb and .bbappend files, add to BBFILES -BBFILES += "${LAYERDIR}/recipes*/*/*.bb \ - ${LAYERDIR}/recipes*/*/*.bbappend" - -BBFILE_COLLECTIONS += "openeuler-raspberrypi" -BBFILE_PATTERN_openeuler-raspberrypi := "^${LAYERDIR}/" -BBFILE_PRIORITY_openeuler-raspberrypi = "10" - -LAYERSERIES_COMPAT_openeuler-raspberrypi = "hardknott honister" -LAYERDEPENDS_openeuler-raspberrypi = "raspberrypi" diff --git a/meta-openeuler/conf/bblayers.conf.sample b/meta-openeuler/conf/bblayers.conf.sample index 4661f5027db..0a2abc077e2 100644 --- a/meta-openeuler/conf/bblayers.conf.sample +++ b/meta-openeuler/conf/bblayers.conf.sample @@ -10,4 +10,5 @@ BBLAYERS ?= " \ ##OEROOT##/meta-poky \ ##OEROOT##/meta-yocto-bsp \ ##OEROOT##/../yocto-meta-openeuler/meta-openeuler \ + ##OEROOT##/../yocto-meta-openeuler/bsp/meta-openeuler-bsp \ " -- Gitee From fc98aed905974c03d4d47efb0c65cfe8cc2e3d98 Mon Sep 17 00:00:00 2001 From: lisimin Date: Mon, 24 Jan 2022 21:32:01 +0800 Subject: [PATCH 189/304] build linux-openeuler by kernel.bbclass Signed-off-by: lisimin --- .../linux/linux-openeuler.bbappend | 4 + .../recipes-core/images/openeuler-image.bb | 3 +- meta-openeuler/recipes-core/images/qemu.inc | 13 +- .../recipes-kernel/linux/linux-openeuler.bb | 217 +++--------------- 4 files changed, 43 insertions(+), 194 deletions(-) create mode 100644 bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend diff --git a/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend b/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend new file mode 100644 index 00000000000..785068b6b46 --- /dev/null +++ b/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend @@ -0,0 +1,4 @@ +SRC_URI += "\ + file://src-kernel-5.10/0000-raspberrypi-kernel.patch \ +" +OPENEULER_KERNEL_CONFIG = "${S}/arch/${ARCH}/configs/bcm2711_defconfig" diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index b1fad56c429..d598c588fe9 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -37,7 +37,7 @@ ROOTFS_BOOTSTRAP_INSTALL = "" do_rootfs[depends] = "" #not depends to ldconfig-native #LDCONFIGDEPEND = "" -DEPENDS_remove += "qemuwrapper-cross depmodwrapper-cross cross-localedef-native" +DEPENDS_remove += "cross-localedef-native" RPMROOTFSDEPENDS = "" #IMAGE_ROOTFS_SIZE ?= "8192" @@ -125,6 +125,7 @@ libevent \ iSulad \ kernel-module-overlay-5.10.0 \ kernel-img \ +kernel-vmlinux \ " IMAGE_INSTALL += "${ROOTFS_BOOTSTRAP_INSTALL} ${IMAGE_INSTALL_normal} ${IMAGE_INSTALL_pro}" diff --git a/meta-openeuler/recipes-core/images/qemu.inc b/meta-openeuler/recipes-core/images/qemu.inc index d00e196bc27..4080ef3758c 100644 --- a/meta-openeuler/recipes-core/images/qemu.inc +++ b/meta-openeuler/recipes-core/images/qemu.inc @@ -1,15 +1,18 @@ delete_boot_from_rootfs() { test -d "${OUTPUT_DIR}" || mkdir -p "${OUTPUT_DIR}" pushd "${IMAGE_ROOTFS}" - rm -f "${OUTPUT_DIR}"/*Image* "${OUTPUT_DIR}"/initrd "${OUTPUT_DIR}"/vmlinux* - mv boot/${KERNEL_IMAGETYPE}-* "${OUTPUT_DIR}"/${KERNEL_IMAGETYPE} - mv boot/vmlinux* "${OUTPUT_DIR}"/ - mv boot/Image* "${OUTPUT_DIR}"/ - rm -r ./boot + if [ -d ./boot ];then + rm -f "${OUTPUT_DIR}"/*Image* "${OUTPUT_DIR}"/vmlinux* + mv boot/${KERNEL_IMAGETYPE}-* "${OUTPUT_DIR}"/${KERNEL_IMAGETYPE} + mv boot/vmlinux* "${OUTPUT_DIR}"/ + mv boot/Image* "${OUTPUT_DIR}"/ + rm -r ./boot + fi popd } copy_openeuler_distro() { + rm -f "${OUTPUT_DIR}"/initrd cp -fp ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${IMAGE_FSTYPES} "${OUTPUT_DIR}"/initrd } diff --git a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb index f8f8320aceb..c823fdc5c65 100644 --- a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb +++ b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb @@ -1,211 +1,52 @@ -SUMMARY = "openEuler Linux kernel" -DESCRIPTION = "openEuler Embedded shares the same linux kernel with other \ - openEuler linux distribution" +SUMMARY = "Linux kernel" SECTION = "kernel" - LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" - -PROVIDES += "virtual/kernel" - -#inherit deploy linux-dummy -inherit kernel-arch -inherit kernel-version kernel-module-split -export EXTRA_CFLAGS = "${CFLAGS}" -export EXTRA_LDFLAGS = "${LDFLAGS}" - -EXTRA_OEMAKE = "CC='${CC}' V=1 ARCH=${ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y HOSTCC='${BUILD_CC}' HOSTCPP='${BUILD_CPP}'" - -PACKAGES_DYNAMIC += "^kernel-module-.*" -PACKAGES_DYNAMIC += "^kernel-image-.*" -PACKAGES_DYNAMIC += "^kernel-firmware-.*" - -KERNEL_CLASSES ?= " kernel-uimage " -inherit ${KERNEL_CLASSES} +LIC_FILES_CHKSUM ?= "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46" -KERNEL_VERSION = "${@get_kernelversion_headers('${B}')}" -KERNEL_PACKAGE_NAME ??= "kernel" -# kernel-base becomes kernel-${KERNEL_VERSION} -# kernel-image becomes kernel-image-${KERNEL_VERSION} -PACKAGES = "${PN} ${KERNEL_PACKAGE_NAME} ${KERNEL_PACKAGE_NAME}-base ${KERNEL_PACKAGE_NAME}-vmlinux ${KERNEL_PACKAGE_NAME}-image ${KERNEL_PACKAGE_NAME}-dev ${KERNEL_PACKAGE_NAME}-modules ${KERNEL_PACKAGE_NAME}-img" -FILES_${PN} = "" -FILES_${KERNEL_PACKAGE_NAME}-img = "/boot/Image-${KERNEL_VERSION}" -FILES_${KERNEL_PACKAGE_NAME}-base = "${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.order ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.builtin ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.builtin.modinfo" -FILES_${KERNEL_PACKAGE_NAME}-image = "/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION} /boot/vmlinux-${KERNEL_VERSION}" -FILES_${KERNEL_PACKAGE_NAME}-dev = "/boot/System.map* /boot/Module.symvers* /boot/config* ${KERNEL_SRC_PATH} ${nonarch_base_libdir}/modules/${KERNEL_VERSION}/build" -FILES_${KERNEL_PACKAGE_NAME}-vmlinux = "/boot/vmlinux-${KERNEL_VERSION_NAME}" -FILES_${KERNEL_PACKAGE_NAME}-modules = "" -RDEPENDS_${KERNEL_PACKAGE_NAME} = "${KERNEL_PACKAGE_NAME}-base (= ${EXTENDPKGV})" -# Allow machines to override this dependency if kernel image files are -# not wanted in images as standard -RDEPENDS_${KERNEL_PACKAGE_NAME}-base ?= "${KERNEL_PACKAGE_NAME}-image (= ${EXTENDPKGV})" -PKG_${KERNEL_PACKAGE_NAME}-image = "${KERNEL_PACKAGE_NAME}-image-${@legitimize_package_name(d.getVar('KERNEL_VERSION'))}" -RDEPENDS_${KERNEL_PACKAGE_NAME}-image += "${@oe.utils.conditional('KERNEL_IMAGETYPE', 'vmlinux', '${KERNEL_PACKAGE_NAME}-vmlinux (= ${EXTENDPKGV})', '', d)}" -PKG_${KERNEL_PACKAGE_NAME}-base = "${KERNEL_PACKAGE_NAME}-${@legitimize_package_name(d.getVar('KERNEL_VERSION'))}" -RPROVIDES_${KERNEL_PACKAGE_NAME}-base += "${KERNEL_PACKAGE_NAME}-${KERNEL_VERSION}" -ALLOW_EMPTY_${KERNEL_PACKAGE_NAME} = "1" -ALLOW_EMPTY_${KERNEL_PACKAGE_NAME}-base = "1" -ALLOW_EMPTY_${KERNEL_PACKAGE_NAME}-image = "1" -ALLOW_EMPTY_${KERNEL_PACKAGE_NAME}-modules = "1" -DESCRIPTION_${KERNEL_PACKAGE_NAME}-modules = "Kernel modules meta package" - -#PACKAGESPLITFUNCS_prepend = "split_kernel_packages " -inherit kernel-artifact-names -inherit kernel-devicetree -#INHIBIT_DEFAULT_DEPS = "1" - -COMPATIBLE_HOST = ".*-linux" - -PV = "5.10" -PR = "r1" +inherit kernel +#require recipes-kernel/linux/linux-yocto.inc SRC_URI = "file://kernel-5.10 \ - file://yocto-embedded-tools/config/${ARCH}/defconfig-kernel \ - " + file://yocto-embedded-tools/config/${ARCH}/defconfig-kernel \ +" SRC_URI_append_aarch64 += " \ file://yocto-embedded-tools/patches/${ARCH}/0001-arm64-add-zImage-support-for-arm64.patch \ " S = "${WORKDIR}/kernel-5.10" -B = "${WORKDIR}/build" - -KERNEL_CONFIG_COMMAND ?= "oe_runmake_call -C ${S} CC="${KERNEL_CC}" LD="${KERNEL_LD}" O=${B} olddefconfig || oe_runmake -C ${S} O=${B} CC="${KERNEL_CC}" LD="${KERNEL_LD}" oldnoconfig" -KCONFIG_CONFIG_COMMAND_append = " LD='${KERNEL_LD}' HOSTLDFLAGS='${BUILD_LDFLAGS}'" -KERNEL_RELEASE ?= "${KERNEL_VERSION}" -# The directory where built kernel lies in the kernel tree -KERNEL_OUTPUT_DIR ?= "arch/${ARCH}/boot" -KERNEL_IMAGEDEST ?= "boot" +LINUX_VERSION ?= "5.10" +LINUX_VERSION_EXTENSION_append = "-openeuler" -python do_symlink_kernsrc () { - s = d.getVar("S") - if s[-1] == '/': - # drop trailing slash, so that os.symlink(kernsrc, s) doesn't use s as directory name and fail - s=s[:-1] - kernsrc = d.getVar("STAGING_KERNEL_DIR") - if s != kernsrc: - bb.utils.mkdirhier(kernsrc) - bb.utils.remove(kernsrc, recurse=True) - if d.getVar("EXTERNALSRC"): - # With EXTERNALSRC S will not be wiped so we can symlink to it - os.symlink(s, kernsrc) - else: - import shutil - shutil.move(s, kernsrc) - os.symlink(kernsrc, s) -} -addtask symlink_kernsrc before do_patch do_configure after do_unpack - -do_configure() { - cp ../yocto-embedded-tools/config/${ARCH}/defconfig-kernel .config - set -e - unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS - oe_runmake -C ${S} ARCH=${ARCH} mrproper - ${KERNEL_CONFIG_COMMAND} - #yes '' | oe_runmake oldconfig - oe_runmake -C ${B} savedefconfig -} +PV = "${LINUX_VERSION}" -get_cc_option () { - # Check if KERNEL_CC supports the option "file-prefix-map". - # This option allows us to build images with __FILE__ values that do not - # contain the host build path. - if ${KERNEL_CC} -Q --help=joined | grep -q "\-ffile-prefix-map="; then - echo "-ffile-prefix-map=${S}=/kernel-source/" - fi -} +COMPATIBLE_MACHINE = "qemuarm|qemuarmv5|qemuarm64|qemux86|qemuppc|qemuppc64|qemumips|qemumips64|qemux86-64|qemuriscv64|qemuriscv32|qemu-aarch64|qemu-arm|raspberrypi4-64" -do_compile () { - cc_extra=$(get_cc_option) - oe_runmake CC="${KERNEL_CC} $cc_extra " LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} -} +PACKAGES += "${KERNEL_PACKAGE_NAME}-img" +FILES_${KERNEL_PACKAGE_NAME}-img = "/boot/Image-${KERNEL_VERSION}" -do_compile_kernelmodules() { - : -} -do_shared_workdir () { - : +# Skip processing of this recipe if it is not explicitly specified as the +# PREFERRED_PROVIDER for virtual/kernel. This avoids network access required +# by the use of AUTOREV SRCREVs, which are the default for this recipe. +python () { + if d.getVar("KERNEL_PACKAGE_NAME") == "kernel" and d.getVar("PREFERRED_PROVIDER_virtual/kernel") != d.getVar("PN"): + d.delVar("BB_DONT_CACHE") + raise bb.parse.SkipRecipe("Set PREFERRED_PROVIDER_virtual/kernel to %s to enable it" % (d.getVar("PN"))) } -do_install() { - # - # First install the modules - # - unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE - if (grep -q -i -e '^CONFIG_MODULES=y$' .config); then - oe_runmake DEPMOD=echo MODLIB=${D}${nonarch_base_libdir}/modules/${KERNEL_VERSION} INSTALL_FW_PATH=${D}${nonarch_base_libdir}/firmware modules_install - rm "${D}${nonarch_base_libdir}/modules/${KERNEL_VERSION}/build" - rm "${D}${nonarch_base_libdir}/modules/${KERNEL_VERSION}/source" - # If the kernel/ directory is empty remove it to prevent QA issues - rmdir --ignore-fail-on-non-empty "${D}${nonarch_base_libdir}/modules/${KERNEL_VERSION}/kernel" - else - bbnote "no modules to install" - fi - - # - # Install various kernel output (zImage, map file, config, module support files) - # - install -d ${D}/${KERNEL_IMAGEDEST} - install -d ${D}/boot +KERNEL_CC_append_aarch64 = " ${TOOLCHAIN_OPTIONS}" +KERNEL_LD_append_aarch64 = " ${TOOLCHAIN_OPTIONS}" - for imageType in ${KERNEL_IMAGETYPES} ; do - if [ $imageType != "fitImage" ] || [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ] ; then - install -m 0644 ${KERNEL_OUTPUT_DIR}/$imageType ${D}/${KERNEL_IMAGEDEST}/$imageType-${KERNEL_VERSION} - fi - done - - install -m 0644 System.map ${D}/boot/System.map-${KERNEL_VERSION} - install -m 0644 .config ${D}/boot/config-${KERNEL_VERSION} - install -m 0644 vmlinux ${D}/boot/vmlinux-${KERNEL_VERSION} - install -m 0644 ${KERNEL_OUTPUT_DIR}/Image ${D}/${KERNEL_IMAGEDEST}/Image-${KERNEL_VERSION} - [ -e Module.symvers ] && install -m 0644 Module.symvers ${D}/boot/Module.symvers-${KERNEL_VERSION} - install -d ${D}${sysconfdir}/modules-load.d - install -d ${D}${sysconfdir}/modprobe.d +OPENEULER_KERNEL_CONFIG = "../yocto-embedded-tools/config/${ARCH}/defconfig-kernel" +do_configure_prepend() { + cp -f "${OPENEULER_KERNEL_CONFIG}" .config } -do_bundle_initramfs() { - return 0 - if [ ! -z "${INITRAMFS_IMAGE}" -a x"${INITRAMFS_IMAGE_BUNDLE}" = x1 ]; then - echo "Creating a kernel image with a bundled initramfs..." - copy_initramfs - # Backing up kernel image relies on its type(regular file or symbolic link) - tmp_path="" - for imageType in ${KERNEL_IMAGETYPE_FOR_MAKE} ; do - if [ -h ${KERNEL_OUTPUT_DIR}/$imageType ] ; then - linkpath=`readlink -n ${KERNEL_OUTPUT_DIR}/$imageType` - realpath=`readlink -fn ${KERNEL_OUTPUT_DIR}/$imageType` - mv -f $realpath $realpath.bak - tmp_path=$tmp_path" "$imageType"#"$linkpath"#"$realpath - elif [ -f ${KERNEL_OUTPUT_DIR}/$imageType ]; then - mv -f ${KERNEL_OUTPUT_DIR}/$imageType ${KERNEL_OUTPUT_DIR}/$imageType.bak - tmp_path=$tmp_path" "$imageType"##" - fi - done - use_alternate_initrd=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio - kernel_do_compile - # Restoring kernel image - for tp in $tmp_path ; do - imageType=`echo $tp|cut -d "#" -f 1` - linkpath=`echo $tp|cut -d "#" -f 2` - realpath=`echo $tp|cut -d "#" -f 3` - if [ -n "$realpath" ]; then - mv -f $realpath $realpath.initramfs - mv -f $realpath.bak $realpath - ln -sf $linkpath.initramfs ${B}/${KERNEL_OUTPUT_DIR}/$imageType.initramfs - else - mv -f ${KERNEL_OUTPUT_DIR}/$imageType ${KERNEL_OUTPUT_DIR}/$imageType.initramfs - mv -f ${KERNEL_OUTPUT_DIR}/$imageType.bak ${KERNEL_OUTPUT_DIR}/$imageType - fi - done - fi +do_install_append(){ + install -m 0644 ${KERNEL_OUTPUT_DIR}/Image ${D}/${KERNEL_IMAGEDEST}/Image-${KERNEL_VERSION} } -do_bundle_initramfs[dirs] = "${B}" -do_deploy() { - : +#not found depmodwrapper, not run postinst now +pkg_postinst_${KERNEL_PACKAGE_NAME}-base () { + : } - -addtask bundle_initramfs after do_install before do_deploy -addtask deploy after do_install -addtask shared_workdir after do_compile before do_install -addtask compile_kernelmodules -- Gitee From de81c70d04cac530709fb8ee29bbd7f269bbd980 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Tue, 25 Jan 2022 15:19:46 +0800 Subject: [PATCH 190/304] add makeinfo for lvm2 Signed-off-by: lixiaoyong --- meta-openeuler/conf/local.conf.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index f06fc21ead9..ac3665e0501 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -274,7 +274,7 @@ CONF_VERSION = "2" HOSTTOOLS += "python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool \ ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader \ autoupdate libtool libtoolize pkg-config cmake fmt gperf m4 createrepo_c dnf ldconfig \ - msgfmt msgmerge rpcgen" + msgfmt msgmerge rpcgen makeinfo" HOSTTOOLS_remove += "diffstat lz4c pzstd" SANITY_REQUIRED_UTILITIES_remove += "diffstat chrpath" CONNECTIVITY_CHECK_URIS = "" -- Gitee From bde6076ee944c91da4596a718cadd44852efb9a3 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Tue, 25 Jan 2022 15:21:40 +0800 Subject: [PATCH 191/304] add recipe for lvm2 Description: LVM2 is a set of utilities to manage logical volumes in Linux. Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/lvm2/lvm2.inc | 64 +++++++++++++++++++ .../recipes-core/lvm2/lvm2_2.03.14.bb | 53 +++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 meta-openeuler/recipes-core/lvm2/lvm2.inc create mode 100644 meta-openeuler/recipes-core/lvm2/lvm2_2.03.14.bb diff --git a/meta-openeuler/recipes-core/lvm2/lvm2.inc b/meta-openeuler/recipes-core/lvm2/lvm2.inc new file mode 100644 index 00000000000..65c5609a242 --- /dev/null +++ b/meta-openeuler/recipes-core/lvm2/lvm2.inc @@ -0,0 +1,64 @@ +HOMEPAGE = "https://www.sourceware.org/lvm2/" +SECTION = "utils" +DESCRIPTION = "LVM2 is a set of utilities to manage logical volumes in Linux." +LICENSE = "GPLv2 & LGPLv2.1 & BSD" + +LIC_FILES_CHKSUM = "file://COPYING;md5=12713b4d9386533feeb07d6e4831765a \ + file://COPYING.LIB;md5=fbc093901857fcd118f065f900982c24 \ + file://COPYING.BSD;md5=d7e19e89ea9f54c1af1aa83c7b7122e7 \ +" + +SRC_URI = "file://lvm2/LVM2.${PV}.tgz \ + file://lvm2/0001-lvm2-set-default-preferred_names.patch \ + file://lvm2/0002-lvm2-default-allow-changes-with-duplicate-pvs.patch \ + file://lvm2/0003-devs-check-for-no-dev-when-dropping-aliases.patch \ + file://lvm2/0004-bugfix-lvm2-add-SSD.patch \ + file://lvm2/0005-bugfix-add-timeout-when-fail-to-wait-udev.patch \ + file://lvm2/0006-bugfix-fix-the-code-maybe-lead-to-buffer-over-bound-access.patch \ + file://lvm2/0007-enhancement-modify-default-log-level-to-error-level.patch \ + file://lvm2/0008-enhancement-add-dfx-log.patch \ + file://lvm2/0009-enhancement-syslog-more-when-use-libdevmapper-so.patch \ + file://lvm2/0010-enhancement-log-it-when-disk-slow.patch \ + file://lvm2/0011-bugfix-lvm2-fix-the-reuse-of-va_list.patch \ +" + +SRC_URI[sha256sum] = "4a63bc8a084a8ae3c7bc5e6530cac264139d218575c64416c8b99e3fe039a05c" +DEPENDS += "util-linux libaio" + +S = "${WORKDIR}/LVM2.${PV}" + +inherit autotools-brokensep pkgconfig systemd license + +LVM2_PACKAGECONFIG = "dmeventd" +LVM2_PACKAGECONFIG_append_class-target = " \ + ${@bb.utils.filter('DISTRO_FEATURES', 'selinux', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'udev', '', d)} \ +" + +# odirect is always enabled because there currently is a bug in +# lib/device/dev-io.c which prevents compiling without it. It is +# better to stick to configurations that were actually tested by +# upstream... +PACKAGECONFIG ??= "odirect ${LVM2_PACKAGECONFIG}" + +PACKAGECONFIG[dmeventd] = "--enable-dmeventd,--disable-dmeventd" +PACKAGECONFIG[odirect] = "--enable-o_direct,--disable-o_direct" +PACKAGECONFIG[readline] = "--enable-readline,--disable-readline,readline" +PACKAGECONFIG[selinux] = "--enable-selinux,--disable-selinux,libselinux" +PACKAGECONFIG[udev] = "--enable-udev_sync --enable-udev_rules --with-udevdir=${nonarch_base_libdir}/udev/rules.d,--disable-udev_sync --disable-udev_rules,udev" + +# Unset user/group to unbreak install. +EXTRA_OECONF = "--with-user= \ + --with-group= \ + --enable-realtime \ + --enable-cmdlib \ + --enable-pkgconfig \ + --with-usrlibdir=${libdir} \ + --with-systemdsystemunitdir=${systemd_system_unitdir} \ + --disable-thin_check_needs_check \ + --with-thin-check=${sbindir}/thin_check \ + --with-thin-dump=${sbindir}/thin_dump \ + --with-thin-repair=${sbindir}/thin_repair \ + --with-thin-restore=${sbindir}/thin_restore \ +" + diff --git a/meta-openeuler/recipes-core/lvm2/lvm2_2.03.14.bb b/meta-openeuler/recipes-core/lvm2/lvm2_2.03.14.bb new file mode 100644 index 00000000000..a1b6e54abe6 --- /dev/null +++ b/meta-openeuler/recipes-core/lvm2/lvm2_2.03.14.bb @@ -0,0 +1,53 @@ +require lvm2.inc + +DEPENDS += "autoconf-archive-native" + +MULTILIB_SCRIPTS = "${PN}:${sysconfdir}/lvm/lvm.conf" + +CACHED_CONFIGUREVARS += "MODPROBE_CMD=${base_sbindir}/modprobe" + +do_install_append() { + # Install machine specific configuration file + install -d ${D}${sysconfdir}/lvm + sed -i -e 's:@libdir@:${libdir}:g' ${D}${sysconfdir}/lvm/lvm.conf + if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then + oe_runmake 'DESTDIR=${D}' install install_systemd_units + sed -i -e 's:/usr/bin/true:${base_bindir}/true:g' ${D}${systemd_system_unitdir}/blk-availability.service + else + oe_runmake 'DESTDIR=${D}' install install_initscripts + mv ${D}${sysconfdir}/rc.d/init.d ${D}${sysconfdir}/init.d + rm -rf ${D}${sysconfdir}/rc.d + fi +} + +PACKAGE_BEFORE_PN = "${PN}-scripts ${PN}-udevrules" + +SYSTEMD_PACKAGES = "${PN}" +SYSTEMD_SERVICE_${PN} = "${@bb.utils.contains('PACKAGECONFIG', 'dmeventd', 'lvm2-monitor.service dm-event.socket dm-event.service', '', d)} \ + blk-availability.service" +SYSTEMD_AUTO_ENABLE = "disable" + +TARGET_CC_ARCH += "${LDFLAGS}" + +EXTRA_OECONF_append_class-nativesdk = " --with-confdir=${sysconfdir}" + +FILES_${PN} += "${libdir}/device-mapper/*.so" +FILES_${PN}-scripts = " \ + ${sbindir}/blkdeactivate \ + ${sbindir}/fsadm \ + ${sbindir}/lvmconf \ + ${sbindir}/lvmdump \ +" +# Specified explicitly for the udev rules, just in case that it does not get picked +# up automatically: +FILES_${PN}-udevrules = "${nonarch_base_libdir}/udev/rules.d" +RDEPENDS_${PN}-udevrules = "${PN}" +#RDEPENDS_${PN}_append_class-target = " libdevmapper" +RDEPENDS_${PN}_append_class-nativesdk = " libdevmapper" + +RDEPENDS_${PN}-scripts = "${PN} (= ${EXTENDPKGV}) bash" +RRECOMMENDS_${PN}_class-target = "${PN}-scripts (= ${EXTENDPKGV})" + +CONFFILES_${PN} += "${sysconfdir}/lvm/lvm.conf" + +BBCLASSEXTEND = "native nativesdk" -- Gitee From 79e498159b81ab81e245ee61e1edf582b09be659 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Tue, 25 Jan 2022 15:36:23 +0800 Subject: [PATCH 192/304] add meson for glib2 Signed-off-by: lixiaoyong --- meta-openeuler/conf/local.conf.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index ac3665e0501..37723d45976 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -274,7 +274,7 @@ CONF_VERSION = "2" HOSTTOOLS += "python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool \ ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader \ autoupdate libtool libtoolize pkg-config cmake fmt gperf m4 createrepo_c dnf ldconfig \ - msgfmt msgmerge rpcgen makeinfo" + msgfmt msgmerge rpcgen makeinfo meson" HOSTTOOLS_remove += "diffstat lz4c pzstd" SANITY_REQUIRED_UTILITIES_remove += "diffstat chrpath" CONNECTIVITY_CHECK_URIS = "" -- Gitee From 33fdc43abbe15d21cd40075e59eeea5a4fb03aa8 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Tue, 25 Jan 2022 15:42:58 +0800 Subject: [PATCH 193/304] add recipe for glib-2.0 Description: GLib is a general-purpose utility library, which provides many useful data types, macros, type conversions, string utilities, file utilities, a main loop abstraction, and so on. Signed-off-by: lixiaoyong --- .../glib-2.0/glib-2.0/meson.cross.d/common | 3 + .../glib-2.0/meson.cross.d/common-glibc | 5 + .../glib-2.0/meson.cross.d/common-linux | 5 + .../glib-2.0/meson.cross.d/common-mingw | 6 + .../glib-2.0/meson.cross.d/common-musl | 6 + .../recipes-core/glib-2.0/glib-2.0/run-ptest | 9 + .../recipes-core/glib-2.0/glib-2.0_2.68.1.bb | 40 ++++ meta-openeuler/recipes-core/glib-2.0/glib.inc | 202 ++++++++++++++++++ 8 files changed, 276 insertions(+) create mode 100644 meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common create mode 100644 meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-glibc create mode 100644 meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-linux create mode 100644 meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-mingw create mode 100644 meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-musl create mode 100644 meta-openeuler/recipes-core/glib-2.0/glib-2.0/run-ptest create mode 100644 meta-openeuler/recipes-core/glib-2.0/glib-2.0_2.68.1.bb create mode 100644 meta-openeuler/recipes-core/glib-2.0/glib.inc diff --git a/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common b/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common new file mode 100644 index 00000000000..0d7c5fa3f8c --- /dev/null +++ b/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common @@ -0,0 +1,3 @@ +[properties] +# On all known supported architectures the stack grows down +growing_stack = false diff --git a/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-glibc b/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-glibc new file mode 100644 index 00000000000..c4648f58c78 --- /dev/null +++ b/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-glibc @@ -0,0 +1,5 @@ +[properties] +have_c99_vsnprintf = true +have_c99_snprintf = true +have_unix98_printf = true +va_val_copy = true diff --git a/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-linux b/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-linux new file mode 100644 index 00000000000..adad7e62eeb --- /dev/null +++ b/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-linux @@ -0,0 +1,5 @@ +[properties] +have_proc_self_cmdline = true + +[binaries] +env = '/usr/bin/env' diff --git a/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-mingw b/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-mingw new file mode 100644 index 00000000000..75f911ba1ed --- /dev/null +++ b/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-mingw @@ -0,0 +1,6 @@ +[properties] +have_c99_vsnprintf = false +have_c99_snprintf = false +have_unix98_printf = false +va_val_copy = true +have_proc_self_cmdline = false diff --git a/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-musl b/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-musl new file mode 100644 index 00000000000..3049e5116ec --- /dev/null +++ b/meta-openeuler/recipes-core/glib-2.0/glib-2.0/meson.cross.d/common-musl @@ -0,0 +1,6 @@ +[properties] +have_c99_vsnprintf = true +have_c99_snprintf = true +have_unix98_printf = true +va_val_copy = true +have_strlcpy = true diff --git a/meta-openeuler/recipes-core/glib-2.0/glib-2.0/run-ptest b/meta-openeuler/recipes-core/glib-2.0/glib-2.0/run-ptest new file mode 100644 index 00000000000..7a231b514b4 --- /dev/null +++ b/meta-openeuler/recipes-core/glib-2.0/glib-2.0/run-ptest @@ -0,0 +1,9 @@ +#! /bin/sh + +set -eux +if id -u glib2-test; then + userdel glib2-test +fi +useradd glib2-test +su glib2-test -c 'gnome-desktop-testing-runner glib' +userdel glib2-test diff --git a/meta-openeuler/recipes-core/glib-2.0/glib-2.0_2.68.1.bb b/meta-openeuler/recipes-core/glib-2.0/glib-2.0_2.68.1.bb new file mode 100644 index 00000000000..49ac75de97e --- /dev/null +++ b/meta-openeuler/recipes-core/glib-2.0/glib-2.0_2.68.1.bb @@ -0,0 +1,40 @@ +require glib.inc + +SRC_URI = "file://glib2/glib-${PV}.tar.xz \ + file://glib2/backport-correctly-use-3-parameters-for-clise-range.patch \ + file://glib2/backport-fix-a-memory-leak.patch \ + file://run-ptest \ +" + +SRC_URI[sha256sum] = "241654b96bd36b88aaa12814efc4843b578e55d47440103727959ac346944333" + +# Find any meson cross files in FILESPATH that are relevant for the current +# build (using siteinfo) and add them to EXTRA_OEMESON. +inherit siteinfo +def find_meson_cross_files(d): + if bb.data.inherits_class('native', d): + return "" + + thisdir = os.path.normpath(d.getVar("THISDIR")) + import collections + sitedata = siteinfo_data(d) + # filename -> found + files = collections.OrderedDict() + for path in d.getVar("FILESPATH").split(":"): + for element in sitedata: + filename = os.path.normpath(os.path.join(path, "meson.cross.d", element)) + sanitized_path = filename.replace(thisdir, "${THISDIR}") + if sanitized_path == filename: + if os.path.exists(filename): + bb.error("Cannot add '%s' to --cross-file, because it's not relative to THISDIR '%s' and sstate signature would contain this full path" % (filename, thisdir)) + continue + files[filename.replace(thisdir, "${THISDIR}")] = os.path.exists(filename) + + items = ["--cross-file=" + k for k,v in files.items() if v] + d.appendVar("EXTRA_OEMESON", " " + " ".join(items)) + items = ["%s:%s" % (k, "True" if v else "False") for k,v in files.items()] + d.appendVarFlag("do_configure", "file-checksums", " " + " ".join(items)) + +python () { + find_meson_cross_files(d) +} diff --git a/meta-openeuler/recipes-core/glib-2.0/glib.inc b/meta-openeuler/recipes-core/glib-2.0/glib.inc new file mode 100644 index 00000000000..1e6aa456680 --- /dev/null +++ b/meta-openeuler/recipes-core/glib-2.0/glib.inc @@ -0,0 +1,202 @@ +SUMMARY = "A general-purpose utility library" +DESCRIPTION = "GLib is a general-purpose utility library, which provides many useful data types, macros, type conversions, string utilities, file utilities, a main loop abstraction, and so on." +HOMEPAGE = "https://developer.gnome.org/glib/" + +# pcre is under BSD; +# docs/reference/COPYING is with a 'public domain'-like license! +LICENSE = "LGPLv2.1+ & BSD & PD" +LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c \ + file://glib/glib.h;beginline=4;endline=17;md5=b88abb7f3ad09607e71cb9d530155906 \ + file://gmodule/COPYING;md5=4fbd65380cdd255951079008b364516c \ + file://gmodule/gmodule.h;beginline=4;endline=17;md5=b88abb7f3ad09607e71cb9d530155906 \ + file://glib/pcre/pcre.h;beginline=8;endline=36;md5=3e2977dae4ad05217f58c446237298fc \ + file://docs/reference/COPYING;md5=f51a5100c17af6bae00735cd791e1fcc" +BUGTRACKER = "http://bugzilla.gnome.org" +SECTION = "libs" + +CVE_PRODUCT = "glib" + +BBCLASSEXTEND = "native nativesdk" + +DEPENDS = "glib-2.0-native \ + virtual/libintl \ + virtual/libiconv \ + libffi \ + zlib" + +PACKAGES += "${PN}-codegen ${PN}-utils ${PN}-bash-completion" + +LEAD_SONAME = "libglib-2.0.*" + +#inherit meson gettext gtk-doc pkgconfig ptest-gnome upstream-version-is-even bash-completion gio-module-cache manpages +inherit meson gettext pkgconfig ptest-gnome upstream-version-is-even gio-module-cache manpages + +DEPENDS_append_class-target = "${@' gtk-doc' if d.getVar('GTKDOC_ENABLED') == 'True' else ''}" + +GTKDOC_MESON_OPTION = "gtk_doc" + +S = "${WORKDIR}/glib-${PV}" + +PACKAGECONFIG ??= "system-pcre libmount \ + ${@bb.utils.contains('PTEST_ENABLED', '1', 'tests', '', d)}" +# To use the system pcre it must be configured with --enable-unicode-properties +PACKAGECONFIG[system-pcre] = "-Dinternal_pcre=false,-Dinternal_pcre=true,libpcre" +PACKAGECONFIG[libmount] = "-Dlibmount=enabled,-Dlibmount=disabled,util-linux" +PACKAGECONFIG[manpages] = "-Dman=true, -Dman=false, libxslt-native xmlto-native" +# libelf is auto-detected without a configuration option +PACKAGECONFIG[libelf] = ",,elfutils" +PACKAGECONFIG[tests] = "-Dinstalled_tests=true,-Dinstalled_tests=false,dbus" + +EXTRA_OEMESON = "-Ddtrace=false -Dfam=false -Dsystemtap=false -Dselinux=disabled" + +do_configure_prepend() { + sed -i -e '1s,#!.*,#!${USRBINPATH}/env python3,' ${S}/gio/gdbus-2.0/codegen/gdbus-codegen.in +} + +FILES_${PN} = "${libdir}/lib*${SOLIBS} \ + ${libdir}/gio \ + ${libexecdir}/*gio-querymodules \ + ${datadir}/glib-2.0/schemas" + +FILES_${PN}-utils += "${bindir}/glib-genmarshal \ + ${bindir}/glib-gettextize \ + ${bindir}/glib-mkenums \ + ${bindir}/glib-compile-resources" + +FILES_${PN}-dev += "${libdir}/glib-2.0/include \ + ${libdir}/gio/modules/lib*${SOLIBSDEV} \ + ${libdir}/gio/modules/*.la \ + ${datadir}/glib-2.0/gettext/po/Makefile.in.in \ + ${datadir}/glib-2.0/schemas/gschema.dtd \ + ${datadir}/glib-2.0/valgrind/glib.supp \ + ${datadir}/gettext/its" +FILES_${PN}-dbg += "${datadir}/glib-2.0/gdb ${datadir}/gdb" +FILES_${PN}-codegen = "${datadir}/glib-2.0/codegen/*.py \ + ${bindir}/gdbus-codegen" +FILES_${PN}-utils = "${bindir}/*" +FILES_${PN}-bash-completion += "${datadir}/bash-completion/completions" + +SHAREDMIMEDEP = "shared-mime-info" +SHAREDMIMEDEP_class-native = "" +# When cross compiling for Windows we don't want to include this +SHAREDMIMEDEP_mingw32 = "" + +#RRECOMMENDS_${PN} += "${SHAREDMIMEDEP}" + +ARM_INSTRUCTION_SET_armv4 = "arm" +ARM_INSTRUCTION_SET_armv5 = "arm" +# Valgrind runtime detection works using hand-written assembly, which +# doesn't support mips16e +CPPFLAGS_append_class-target_mips16e = " -DNVALGRIND=1" + +# GLib generally requires gettext to be present so for USE_NLS to yes. For +# native builds as i18n is disabled globally we have to add a gettext-native dependency. +USE_NLS_class-target = "yes" +USE_NLS_class-nativesdk = "yes" +DEPENDS_append_class-native = " gettext-native" + +EXEEXT = "" +EXEEXT_mingw32 = ".exe" + +do_install_append () { + if [ -f ${D}${bindir}/gtester-report ]; then + sed ${D}${bindir}/gtester-report -i -e '1s|^#!.*|#!/usr/bin/env python3|' + fi + + # Remove some unpackaged files + rm -rf ${D}${datadir}/glib-2.0/codegen/__pycache__ + rm -f ${D}${datadir}/glib-2.0/codegen/*.pyc + rm -f ${D}${datadir}/glib-2.0/codegen/*.pyo + + if [ -e ${D}${libdir}/charset.alias ]; then + rm -f ${D}${libdir}/charset.alias + fi + + # Make sure gio-querymodules is unique among multilibs + if test "x${MLPREFIX}" != "x"; then + mv ${D}${libexecdir}/gio-querymodules${EXEEXT} ${D}${libexecdir}/${MLPREFIX}gio-querymodules${EXEEXT} + fi + # Autotools does this, meson does not + mkdir -p ${D}${libdir}/gio/modules +} + +do_install_append_class-target () { + # Tests are only installed on targets, not native builds. Separating this out + # keeps glib-2.0-native from depending on DISTRO_FEATURES + if [ -f ${D}${datadir}/installed-tests/glib/gdbus-serialization.test ]; then + if ${@bb.utils.contains("DISTRO_FEATURES", "x11", "false", "true", d)}; then + rm ${D}${datadir}/installed-tests/glib/gdbus-serialization.test + fi + fi + if [ -f ${D}${datadir}/installed-tests/glib/static-link.test ]; then + if test "x${MLPREFIX}" != "x"; then + mv ${D}${datadir}/installed-tests/glib/static-link.test ${D}${datadir}/installed-tests/glib/${MLPREFIX}static-link.test + fi + fi +} + +# As we do not build python3 for windows, makes no sense to ship the script that's using it +do_install_append_mingw32() { + rm -f ${D}${bindir}/gtester-report +} + +CODEGEN_PYTHON_RDEPENDS = "python3 python3-distutils python3-xml" +CODEGEN_PYTHON_RDEPENDS_mingw32 = "" + +#RDEPENDS_${PN}-codegen += "${CODEGEN_PYTHON_RDEPENDS}" + +RDEPENDS_${PN}-ptest += "${PN}-utils" + +RDEPENDS_${PN}-ptest += "\ + coreutils \ + libgcc \ + dbus \ + gnome-desktop-testing \ + tzdata \ + tzdata-americas \ + tzdata-asia \ + tzdata-europe \ + tzdata-posix \ + shared-mime-info \ + ${PN}-locale-ja \ + ${PN}-locale-fr \ + ${PN}-locale-el \ + ${PN}-locale-hr \ + ${PN}-locale-lt \ + ${PN}-locale-pl \ + ${PN}-locale-ru \ + ${PN}-locale-th \ + python3-core \ + python3-modules \ + ${@bb.utils.contains('GI_DATA_ENABLED', 'True', 'python3-dbusmock', '', d)} \ + ${PN}-codegen \ + " + +RDEPENDS_${PN}-ptest_append_libc-glibc = "\ + glibc-gconv-utf-16 \ + glibc-charmap-utf-8 \ + glibc-gconv-cp1255 \ + glibc-charmap-cp1255 \ + glibc-gconv-utf-32 \ + glibc-gconv-utf-7 \ + glibc-gconv-euc-jp \ + glibc-gconv-iso8859-1 \ + glibc-gconv-iso8859-15 \ + glibc-charmap-invariant \ + glibc-localedata-translit-cjk-variants \ + locale-base-tr-tr \ + locale-base-lt-lt \ + locale-base-ja-jp.euc-jp \ + locale-base-fa-ir \ + locale-base-ru-ru \ + locale-base-de-de \ + locale-base-hr-hr \ + locale-base-el-gr \ + locale-base-fr-fr \ + locale-base-es-es \ + locale-base-en-gb \ + locale-base-en-us \ + locale-base-pl-pl \ + locale-base-pl-pl.iso-8859-2 \ + " +DEPENDS_remove += "meson-native glib-2.0-native" -- Gitee From 8887546c21ae744d5ebbc8fc0f4abbafebba8eed Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Tue, 25 Jan 2022 15:48:38 +0800 Subject: [PATCH 194/304] add recipe for tzdata Description: The Time Zone Database contains code and data that represent \ the history of local time for many representative locations around the globe. Signed-off-by: lixiaoyong --- .../recipes-core/tzdata/timezone.inc | 23 ++ .../tzdata/tzcode-native_2021e.bb | 16 ++ .../recipes-core/tzdata/tzdata_2021e.bb | 210 ++++++++++++++++++ 3 files changed, 249 insertions(+) create mode 100644 meta-openeuler/recipes-core/tzdata/timezone.inc create mode 100644 meta-openeuler/recipes-core/tzdata/tzcode-native_2021e.bb create mode 100644 meta-openeuler/recipes-core/tzdata/tzdata_2021e.bb diff --git a/meta-openeuler/recipes-core/tzdata/timezone.inc b/meta-openeuler/recipes-core/tzdata/timezone.inc new file mode 100644 index 00000000000..44a6e7abe10 --- /dev/null +++ b/meta-openeuler/recipes-core/tzdata/timezone.inc @@ -0,0 +1,23 @@ +SUMMARY = "Timezone data" +DESCRIPTION = "The Time Zone Database contains code and data that represent \ +the history of local time for many representative locations around the globe." +HOMEPAGE = "http://www.iana.org/time-zones" +SECTION = "base" +LICENSE = "PD & BSD & BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=c679c9d6b02bc2757b3eaf8f53c43fba" + +SRC_URI = "file://tzdata/tzcode${PV}.tar.gz;name=tzcode \ + file://tzdata/tzdata${PV}.tar.gz;name=tzdata \ + file://tzdata/bugfix-0001-add-Beijing-timezone.patch \ + file://tzdata/remove-country-selection-from-tzselect-steps.patch \ + file://tzdata/remove-ROC-timezone.patch \ + file://tzdata/rename-Macau-to-Macao.patch \ + file://tzdata/remove-El_Aaiun-timezone.patch \ + file://tzdata/remove-Israel-timezone.patch \ + file://tzdata/skip-check_web-testcase.patch \ + " + +UPSTREAM_CHECK_URI = "http://www.iana.org/time-zones" + +SRC_URI[tzcode.sha256sum] = "584666393a5424d13d27ec01183da17703273664742e049d4f62f62dab631775" +SRC_URI[tzdata.sha256sum] = "07ec42b737d0d3c6be9c337f8abb5f00554a0f9cc4fcf01a703d69403b6bb2b1" diff --git a/meta-openeuler/recipes-core/tzdata/tzcode-native_2021e.bb b/meta-openeuler/recipes-core/tzdata/tzcode-native_2021e.bb new file mode 100644 index 00000000000..8a96af199bd --- /dev/null +++ b/meta-openeuler/recipes-core/tzdata/tzcode-native_2021e.bb @@ -0,0 +1,16 @@ +require timezone.inc + +SUMMARY = "tzcode, timezone zoneinfo utils -- zic, zdump, tzselect" + +S = "${WORKDIR}" + +inherit native + +EXTRA_OEMAKE += "cc='${CC}'" + +do_install () { + install -d ${D}${bindir}/ + install -m 755 zic ${D}${bindir}/ + install -m 755 zdump ${D}${bindir}/ + install -m 755 tzselect ${D}${bindir}/ +} diff --git a/meta-openeuler/recipes-core/tzdata/tzdata_2021e.bb b/meta-openeuler/recipes-core/tzdata/tzdata_2021e.bb new file mode 100644 index 00000000000..b580ac4cc6f --- /dev/null +++ b/meta-openeuler/recipes-core/tzdata/tzdata_2021e.bb @@ -0,0 +1,210 @@ +require timezone.inc + +DEPENDS = "tzcode-native" + +#inherit allarch + +RCONFLICTS_${PN} = "timezones timezone-africa timezone-america timezone-antarctica \ + timezone-arctic timezone-asia timezone-atlantic \ + timezone-australia timezone-europe timezone-indian \ + timezone-iso3166.tab timezone-pacific timezone-zone.tab" + +S = "${WORKDIR}" + +DEFAULT_TIMEZONE ?= "Universal" +INSTALL_TIMEZONE_FILE ?= "1" + +TZONES= "africa antarctica asia australasia europe northamerica southamerica \ + factory etcetera backward \ + " +# pacificnew + +do_compile () { + for zone in ${TZONES}; do \ + ${STAGING_BINDIR_NATIVE}/zic -d ${WORKDIR}${datadir}/zoneinfo -L /dev/null \ + ${S}/${zone} ; \ + ${STAGING_BINDIR_NATIVE}/zic -d ${WORKDIR}${datadir}/zoneinfo/posix -L /dev/null \ + ${S}/${zone} ; \ + ${STAGING_BINDIR_NATIVE}/zic -d ${WORKDIR}${datadir}/zoneinfo/right -L ${S}/leapseconds \ + ${S}/${zone} ; \ + done +} + +do_install () { + install -d ${D}/$exec_prefix ${D}${datadir}/zoneinfo + cp -pPR ${S}/$exec_prefix ${D}/ + # libc is removing zoneinfo files from package + cp -pP "${S}/zone.tab" ${D}${datadir}/zoneinfo + cp -pP "${S}/zone1970.tab" ${D}${datadir}/zoneinfo + cp -pP "${S}/iso3166.tab" ${D}${datadir}/zoneinfo + cp -pP "${S}/leapseconds" ${D}${datadir}/zoneinfo + cp -pP "${S}/leap-seconds.list" ${D}${datadir}/zoneinfo + + # Install default timezone + if [ -e ${D}${datadir}/zoneinfo/${DEFAULT_TIMEZONE} ]; then + install -d ${D}${sysconfdir} + if [ "${INSTALL_TIMEZONE_FILE}" = "1" ]; then + echo ${DEFAULT_TIMEZONE} > ${D}${sysconfdir}/timezone + fi + ln -s ${datadir}/zoneinfo/${DEFAULT_TIMEZONE} ${D}${sysconfdir}/localtime + else + bberror "DEFAULT_TIMEZONE is set to an invalid value." + exit 1 + fi + + chown -R root:root ${D} +} + +pkg_postinst_${PN} () { + etc_lt="$D${sysconfdir}/localtime" + src="$D${sysconfdir}/timezone" + + if [ -e ${src} ] ; then + tz=$(sed -e 's:#.*::' -e 's:[[:space:]]*::g' -e '/^$/d' "${src}") + fi + + if [ ! -z "${tz}" -a ! -e "$D${datadir}/zoneinfo/${tz}" ] ; then + echo "You have an invalid TIMEZONE setting in ${src}" + echo "Your ${etc_lt} has been reset to Universal; enjoy!" + tz="Universal" + echo "Updating ${etc_lt} with $D${datadir}/zoneinfo/${tz}" + if [ -L ${etc_lt} ] ; then + rm -f "${etc_lt}" + fi + ln -s "${datadir}/zoneinfo/${tz}" "${etc_lt}" + fi +} + +# Packages primarily organized by directory with a major city +# in most time zones in the base package + +TZ_PACKAGES = " \ + tzdata-core tzdata-misc tzdata-posix tzdata-right tzdata-africa \ + tzdata-americas tzdata-antarctica tzdata-arctic tzdata-asia \ + tzdata-atlantic tzdata-australia tzdata-europe tzdata-pacific" +PACKAGES = "${TZ_PACKAGES} ${PN}" + +FILES_tzdata-africa += "${datadir}/zoneinfo/Africa/*" +RPROVIDES_tzdata-africa = "tzdata-africa" + +FILES_tzdata-americas += "${datadir}/zoneinfo/America/* \ + ${datadir}/zoneinfo/US/* \ + ${datadir}/zoneinfo/Brazil/* \ + ${datadir}/zoneinfo/Canada/* \ + ${datadir}/zoneinfo/Mexico/* \ + ${datadir}/zoneinfo/Chile/*" +RPROVIDES_tzdata-americas = "tzdata-americas" + +FILES_tzdata-antarctica += "${datadir}/zoneinfo/Antarctica/*" +RPROVIDES_tzdata-antarctica = "tzdata-antarctica" + +FILES_tzdata-arctic += "${datadir}/zoneinfo/Arctic/*" +RPROVIDES_tzdata-arctic = "tzdata-arctic" + +FILES_tzdata-asia += "${datadir}/zoneinfo/Asia/* \ + ${datadir}/zoneinfo/Indian/* \ + ${datadir}/zoneinfo/Mideast/*" +RPROVIDES_tzdata-asia = "tzdata-asia" + +FILES_tzdata-atlantic += "${datadir}/zoneinfo/Atlantic/*" +RPROVIDES_tzdata-atlantic = "tzdata-atlantic" + +FILES_tzdata-australia += "${datadir}/zoneinfo/Australia/*" +RPROVIDES_tzdata-australia = "tzdata-australia" + +FILES_tzdata-europe += "${datadir}/zoneinfo/Europe/*" +RPROVIDES_tzdata-europe = "tzdata-europe" + +FILES_tzdata-pacific += "${datadir}/zoneinfo/Pacific/*" +RPROVIDES_tzdata-pacific = "tzdata-pacific" + +FILES_tzdata-posix += "${datadir}/zoneinfo/posix/*" +RPROVIDES_tzdata-posix = "tzdata-posix" + +FILES_tzdata-right += "${datadir}/zoneinfo/right/*" +RPROVIDES_tzdata-right = "tzdata-right" + +FILES_tzdata-misc += "${datadir}/zoneinfo/Cuba \ + ${datadir}/zoneinfo/Egypt \ + ${datadir}/zoneinfo/Eire \ + ${datadir}/zoneinfo/Factory \ + ${datadir}/zoneinfo/GB-Eire \ + ${datadir}/zoneinfo/Hongkong \ + ${datadir}/zoneinfo/Iceland \ + ${datadir}/zoneinfo/Iran \ + ${datadir}/zoneinfo/Israel \ + ${datadir}/zoneinfo/Jamaica \ + ${datadir}/zoneinfo/Japan \ + ${datadir}/zoneinfo/Kwajalein \ + ${datadir}/zoneinfo/Libya \ + ${datadir}/zoneinfo/Navajo \ + ${datadir}/zoneinfo/Poland \ + ${datadir}/zoneinfo/Portugal \ + ${datadir}/zoneinfo/Singapore \ + ${datadir}/zoneinfo/Turkey" +RPROVIDES_tzdata-misc = "tzdata-misc" + +FILES_tzdata-core += " \ + ${sysconfdir}/localtime \ + ${sysconfdir}/timezone \ + ${datadir}/zoneinfo/leapseconds \ + ${datadir}/zoneinfo/leap-seconds.list \ + ${datadir}/zoneinfo/Pacific/Honolulu \ + ${datadir}/zoneinfo/America/Anchorage \ + ${datadir}/zoneinfo/America/Los_Angeles \ + ${datadir}/zoneinfo/America/Denver \ + ${datadir}/zoneinfo/America/Chicago \ + ${datadir}/zoneinfo/America/New_York \ + ${datadir}/zoneinfo/America/Caracas \ + ${datadir}/zoneinfo/America/Sao_Paulo \ + ${datadir}/zoneinfo/Europe/London \ + ${datadir}/zoneinfo/Europe/Paris \ + ${datadir}/zoneinfo/Africa/Cairo \ + ${datadir}/zoneinfo/Europe/Moscow \ + ${datadir}/zoneinfo/Asia/Dubai \ + ${datadir}/zoneinfo/Asia/Karachi \ + ${datadir}/zoneinfo/Asia/Dhaka \ + ${datadir}/zoneinfo/Asia/Bangkok \ + ${datadir}/zoneinfo/Asia/Hong_Kong \ + ${datadir}/zoneinfo/Asia/Tokyo \ + ${datadir}/zoneinfo/Australia/Darwin \ + ${datadir}/zoneinfo/Australia/Adelaide \ + ${datadir}/zoneinfo/Australia/Brisbane \ + ${datadir}/zoneinfo/Australia/Sydney \ + ${datadir}/zoneinfo/Pacific/Noumea \ + ${datadir}/zoneinfo/CET \ + ${datadir}/zoneinfo/CST6CDT \ + ${datadir}/zoneinfo/EET \ + ${datadir}/zoneinfo/EST \ + ${datadir}/zoneinfo/EST5EDT \ + ${datadir}/zoneinfo/GB \ + ${datadir}/zoneinfo/GMT \ + ${datadir}/zoneinfo/GMT+0 \ + ${datadir}/zoneinfo/GMT-0 \ + ${datadir}/zoneinfo/GMT0 \ + ${datadir}/zoneinfo/Greenwich \ + ${datadir}/zoneinfo/HST \ + ${datadir}/zoneinfo/MET \ + ${datadir}/zoneinfo/MST \ + ${datadir}/zoneinfo/MST7MDT \ + ${datadir}/zoneinfo/NZ \ + ${datadir}/zoneinfo/NZ-CHAT \ + ${datadir}/zoneinfo/PRC \ + ${datadir}/zoneinfo/PST8PDT \ + ${datadir}/zoneinfo/ROC \ + ${datadir}/zoneinfo/ROK \ + ${datadir}/zoneinfo/UCT \ + ${datadir}/zoneinfo/UTC \ + ${datadir}/zoneinfo/Universal \ + ${datadir}/zoneinfo/W-SU \ + ${datadir}/zoneinfo/WET \ + ${datadir}/zoneinfo/Zulu \ + ${datadir}/zoneinfo/zone.tab \ + ${datadir}/zoneinfo/zone1970.tab \ + ${datadir}/zoneinfo/iso3166.tab \ + ${datadir}/zoneinfo/Etc/*" + +CONFFILES_tzdata-core = "${sysconfdir}/localtime ${sysconfdir}/timezone" + +ALLOW_EMPTY_${PN} = "1" +RDEPENDS_${PN} = "${TZ_PACKAGES}" -- Gitee From 5186909ab05f76d665a7107af8b9bcc2ba5a4b80 Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Tue, 25 Jan 2022 15:53:23 +0800 Subject: [PATCH 195/304] add recipe for bind Description: BIND 9 provides a full-featured Domain Name Server system. Signed-off-by: lixiaoyong --- ...for-lib-dns-gen.c-as-it-is-a-build-p.patch | 37 ++ meta-openeuler/recipes-core/bind/bind/bind9 | 2 + .../recipes-core/bind/bind/conf.patch | 330 ++++++++++++++++++ .../bind/bind/generate-rndc-key.sh | 8 + .../recipes-core/bind/bind/named.service | 22 ++ .../recipes-core/bind/bind_9.11.14.bb | 132 +++++++ 6 files changed, 531 insertions(+) create mode 100644 meta-openeuler/recipes-core/bind/bind/0001-revert-d10fbdec-for-lib-dns-gen.c-as-it-is-a-build-p.patch create mode 100644 meta-openeuler/recipes-core/bind/bind/bind9 create mode 100644 meta-openeuler/recipes-core/bind/bind/conf.patch create mode 100644 meta-openeuler/recipes-core/bind/bind/generate-rndc-key.sh create mode 100644 meta-openeuler/recipes-core/bind/bind/named.service create mode 100644 meta-openeuler/recipes-core/bind/bind_9.11.14.bb diff --git a/meta-openeuler/recipes-core/bind/bind/0001-revert-d10fbdec-for-lib-dns-gen.c-as-it-is-a-build-p.patch b/meta-openeuler/recipes-core/bind/bind/0001-revert-d10fbdec-for-lib-dns-gen.c-as-it-is-a-build-p.patch new file mode 100644 index 00000000000..b088f54cdf4 --- /dev/null +++ b/meta-openeuler/recipes-core/bind/bind/0001-revert-d10fbdec-for-lib-dns-gen.c-as-it-is-a-build-p.patch @@ -0,0 +1,37 @@ +From 7278f2529a4f811db8f1d7f5f4e36402986a4470 Mon Sep 17 00:00:00 2001 +From: Mark Andrews +Date: Mon, 23 Dec 2019 07:37:13 +1100 +Subject: [PATCH] revert d10fbdec for lib/dns/gen.c as it is a build platform + executable + +--- + lib/dns/gen.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/lib/dns/gen.c b/lib/dns/gen.c +index 99f0395b3a..6c6e55d4c6 100644 +--- a/lib/dns/gen.c ++++ b/lib/dns/gen.c +@@ -26,8 +26,6 @@ + + #include + +-#include +- + #include + #include + #include +@@ -39,6 +37,10 @@ + #include + #include + ++#ifndef PATH_MAX ++#define PATH_MAX 1024 ++#endif ++ + #ifdef WIN32 + #include "gen-win32.h" + #else +-- +2.12.3 + diff --git a/meta-openeuler/recipes-core/bind/bind/bind9 b/meta-openeuler/recipes-core/bind/bind/bind9 new file mode 100644 index 00000000000..968679ff7f7 --- /dev/null +++ b/meta-openeuler/recipes-core/bind/bind/bind9 @@ -0,0 +1,2 @@ +# startup options for the server +OPTIONS="-u bind" diff --git a/meta-openeuler/recipes-core/bind/bind/conf.patch b/meta-openeuler/recipes-core/bind/bind/conf.patch new file mode 100644 index 00000000000..aad345f9fcf --- /dev/null +++ b/meta-openeuler/recipes-core/bind/bind/conf.patch @@ -0,0 +1,330 @@ +Upstream-Status: Inappropriate [configuration] + +the patch is imported from openembedded project + +11/30/2010 - Qing He + +diff -urN bind-9.3.1.orig/conf/db.0 bind-9.3.1/conf/db.0 +--- bind-9.3.1.orig/conf/db.0 1970-01-01 01:00:00.000000000 +0100 ++++ bind-9.3.1/conf/db.0 2005-07-10 22:14:00.000000000 +0200 +@@ -0,0 +1,12 @@ ++; ++; BIND reverse data file for broadcast zone ++; ++$TTL 604800 ++@ IN SOA localhost. root.localhost. ( ++ 1 ; Serial ++ 604800 ; Refresh ++ 86400 ; Retry ++ 2419200 ; Expire ++ 604800 ) ; Negative Cache TTL ++; ++@ IN NS localhost. +diff -urN bind-9.3.1.orig/conf/db.127 bind-9.3.1/conf/db.127 +--- bind-9.3.1.orig/conf/db.127 1970-01-01 01:00:00.000000000 +0100 ++++ bind-9.3.1/conf/db.127 2005-07-10 22:14:00.000000000 +0200 +@@ -0,0 +1,13 @@ ++; ++; BIND reverse data file for local loopback interface ++; ++$TTL 604800 ++@ IN SOA localhost. root.localhost. ( ++ 1 ; Serial ++ 604800 ; Refresh ++ 86400 ; Retry ++ 2419200 ; Expire ++ 604800 ) ; Negative Cache TTL ++; ++@ IN NS localhost. ++1.0.0 IN PTR localhost. +diff -urN bind-9.3.1.orig/conf/db.empty bind-9.3.1/conf/db.empty +--- bind-9.3.1.orig/conf/db.empty 1970-01-01 01:00:00.000000000 +0100 ++++ bind-9.3.1/conf/db.empty 2005-07-10 22:14:00.000000000 +0200 +@@ -0,0 +1,14 @@ ++; BIND reverse data file for empty rfc1918 zone ++; ++; DO NOT EDIT THIS FILE - it is used for multiple zones. ++; Instead, copy it, edit named.conf, and use that copy. ++; ++$TTL 86400 ++@ IN SOA localhost. root.localhost. ( ++ 1 ; Serial ++ 604800 ; Refresh ++ 86400 ; Retry ++ 2419200 ; Expire ++ 86400 ) ; Negative Cache TTL ++; ++@ IN NS localhost. +diff -urN bind-9.3.1.orig/conf/db.255 bind-9.3.1/conf/db.255 +--- bind-9.3.1.orig/conf/db.255 1970-01-01 01:00:00.000000000 +0100 ++++ bind-9.3.1/conf/db.255 2005-07-10 22:14:00.000000000 +0200 +@@ -0,0 +1,12 @@ ++; ++; BIND reserve data file for broadcast zone ++; ++$TTL 604800 ++@ IN SOA localhost. root.localhost. ( ++ 1 ; Serial ++ 604800 ; Refresh ++ 86400 ; Retry ++ 2419200 ; Expire ++ 604800 ) ; Negative Cache TTL ++; ++@ IN NS localhost. +diff -urN bind-9.3.1.orig/conf/db.local bind-9.3.1/conf/db.local +--- bind-9.3.1.orig/conf/db.local 1970-01-01 01:00:00.000000000 +0100 ++++ bind-9.3.1/conf/db.local 2005-07-10 22:14:00.000000000 +0200 +@@ -0,0 +1,13 @@ ++; ++; BIND data file for local loopback interface ++; ++$TTL 604800 ++@ IN SOA localhost. root.localhost. ( ++ 1 ; Serial ++ 604800 ; Refresh ++ 86400 ; Retry ++ 2419200 ; Expire ++ 604800 ) ; Negative Cache TTL ++; ++@ IN NS localhost. ++@ IN A 127.0.0.1 +diff -urN bind-9.3.1.orig/conf/db.root bind-9.3.1/conf/db.root +--- bind-9.3.1.orig/conf/db.root 1970-01-01 01:00:00.000000000 +0100 ++++ bind-9.3.1/conf/db.root 2005-07-10 22:14:00.000000000 +0200 +@@ -0,0 +1,45 @@ ++ ++; <<>> DiG 9.2.3 <<>> ns . @a.root-servers.net. ++;; global options: printcmd ++;; Got answer: ++;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18944 ++;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 13 ++ ++;; QUESTION SECTION: ++;. IN NS ++ ++;; ANSWER SECTION: ++. 518400 IN NS A.ROOT-SERVERS.NET. ++. 518400 IN NS B.ROOT-SERVERS.NET. ++. 518400 IN NS C.ROOT-SERVERS.NET. ++. 518400 IN NS D.ROOT-SERVERS.NET. ++. 518400 IN NS E.ROOT-SERVERS.NET. ++. 518400 IN NS F.ROOT-SERVERS.NET. ++. 518400 IN NS G.ROOT-SERVERS.NET. ++. 518400 IN NS H.ROOT-SERVERS.NET. ++. 518400 IN NS I.ROOT-SERVERS.NET. ++. 518400 IN NS J.ROOT-SERVERS.NET. ++. 518400 IN NS K.ROOT-SERVERS.NET. ++. 518400 IN NS L.ROOT-SERVERS.NET. ++. 518400 IN NS M.ROOT-SERVERS.NET. ++ ++;; ADDITIONAL SECTION: ++A.ROOT-SERVERS.NET. 3600000 IN A 198.41.0.4 ++B.ROOT-SERVERS.NET. 3600000 IN A 192.228.79.201 ++C.ROOT-SERVERS.NET. 3600000 IN A 192.33.4.12 ++D.ROOT-SERVERS.NET. 3600000 IN A 128.8.10.90 ++E.ROOT-SERVERS.NET. 3600000 IN A 192.203.230.10 ++F.ROOT-SERVERS.NET. 3600000 IN A 192.5.5.241 ++G.ROOT-SERVERS.NET. 3600000 IN A 192.112.36.4 ++H.ROOT-SERVERS.NET. 3600000 IN A 128.63.2.53 ++I.ROOT-SERVERS.NET. 3600000 IN A 192.36.148.17 ++J.ROOT-SERVERS.NET. 3600000 IN A 192.58.128.30 ++K.ROOT-SERVERS.NET. 3600000 IN A 193.0.14.129 ++L.ROOT-SERVERS.NET. 3600000 IN A 198.32.64.12 ++M.ROOT-SERVERS.NET. 3600000 IN A 202.12.27.33 ++ ++;; Query time: 81 msec ++;; SERVER: 198.41.0.4#53(a.root-servers.net.) ++;; WHEN: Sun Feb 1 11:27:14 2004 ++;; MSG SIZE rcvd: 436 ++ +diff -urN bind-9.3.1.orig/conf/named.conf bind-9.3.1/conf/named.conf +--- bind-9.3.1.orig/conf/named.conf 1970-01-01 01:00:00.000000000 +0100 ++++ bind-9.3.1/conf/named.conf 2005-07-10 22:33:46.000000000 +0200 +@@ -0,0 +1,49 @@ ++// This is the primary configuration file for the BIND DNS server named. ++// ++// If you are just adding zones, please do that in /etc/bind/named.conf.local ++ ++include "/etc/bind/named.conf.options"; ++ ++// prime the server with knowledge of the root servers ++zone "." { ++ type hint; ++ file "/etc/bind/db.root"; ++}; ++ ++// be authoritative for the localhost forward and reverse zones, and for ++// broadcast zones as per RFC 1912 ++ ++zone "localhost" { ++ type master; ++ file "/etc/bind/db.local"; ++}; ++ ++zone "127.in-addr.arpa" { ++ type master; ++ file "/etc/bind/db.127"; ++}; ++ ++zone "0.in-addr.arpa" { ++ type master; ++ file "/etc/bind/db.0"; ++}; ++ ++zone "255.in-addr.arpa" { ++ type master; ++ file "/etc/bind/db.255"; ++}; ++ ++// zone "com" { type delegation-only; }; ++// zone "net" { type delegation-only; }; ++ ++// From the release notes: ++// Because many of our users are uncomfortable receiving undelegated answers ++// from root or top level domains, other than a few for whom that behaviour ++// has been trusted and expected for quite some length of time, we have now ++// introduced the "root-delegations-only" feature which applies delegation-only ++// logic to all top level domains, and to the root domain. An exception list ++// should be specified, including "MUSEUM" and "DE", and any other top level ++// domains from whom undelegated responses are expected and trusted. ++// root-delegation-only exclude { "DE"; "MUSEUM"; }; ++ ++include "/etc/bind/named.conf.local"; +diff -urN bind-9.3.1.orig/conf/named.conf.local bind-9.3.1/conf/named.conf.local +--- bind-9.3.1.orig/conf/named.conf.local 1970-01-01 01:00:00.000000000 +0100 ++++ bind-9.3.1/conf/named.conf.local 2005-07-10 22:14:06.000000000 +0200 +@@ -0,0 +1,8 @@ ++// ++// Do any local configuration here ++// ++ ++// Consider adding the 1918 zones here, if they are not used in your ++// organization ++//include "/etc/bind/zones.rfc1918"; ++ +diff -urN bind-9.3.1.orig/conf/named.conf.options bind-9.3.1/conf/named.conf.options +--- bind-9.3.1.orig/conf/named.conf.options 1970-01-01 01:00:00.000000000 +0100 ++++ bind-9.3.1/conf/named.conf.options 2005-07-10 22:14:06.000000000 +0200 +@@ -0,0 +1,24 @@ ++options { ++ directory "/var/cache/bind"; ++ ++ // If there is a firewall between you and nameservers you want ++ // to talk to, you might need to uncomment the query-source ++ // directive below. Previous versions of BIND always asked ++ // questions using port 53, but BIND 8.1 and later use an unprivileged ++ // port by default. ++ ++ // query-source address * port 53; ++ ++ // If your ISP provided one or more IP addresses for stable ++ // nameservers, you probably want to use them as forwarders. ++ // Uncomment the following block, and insert the addresses replacing ++ // the all-0's placeholder. ++ ++ // forwarders { ++ // 0.0.0.0; ++ // }; ++ ++ auth-nxdomain no; # conform to RFC1035 ++ ++}; ++ +diff -urN bind-9.3.1.orig/conf/zones.rfc1918 bind-9.3.1/conf/zones.rfc1918 +--- bind-9.3.1.orig/conf/zones.rfc1918 1970-01-01 01:00:00.000000000 +0100 ++++ bind-9.3.1/conf/zones.rfc1918 2005-07-10 22:14:10.000000000 +0200 +@@ -0,0 +1,20 @@ ++zone "10.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++ ++zone "16.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "17.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "18.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "19.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "20.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "21.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "22.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "23.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "24.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "25.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "26.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "27.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "28.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "29.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "30.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++zone "31.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; ++ ++zone "168.192.in-addr.arpa" { type master; file "/etc/bind/db.empty"; }; +diff -urN bind-9.3.1.orig/init.d bind-9.3.1/init.d +--- bind-9.3.1.orig/init.d 1970-01-01 01:00:00.000000000 +0100 ++++ bind-9.3.1/init.d 2005-07-10 23:09:58.000000000 +0200 +@@ -0,0 +1,70 @@ ++#!/bin/sh ++ ++PATH=/sbin:/bin:/usr/sbin:/usr/bin ++ ++# for a chrooted server: "-u bind -t /var/lib/named" ++# Don't modify this line, change or create /etc/default/bind9. ++OPTIONS="" ++ ++test -f /etc/default/bind9 && . /etc/default/bind9 ++ ++test -x /usr/sbin/rndc || exit 0 ++ ++case "$1" in ++ start) ++ echo -n "Starting domain name service: named" ++ ++ modprobe capability >/dev/null 2>&1 || true ++ if [ ! -f /etc/bind/rndc.key ]; then ++ /usr/sbin/rndc-confgen -a -b 512 -r /dev/urandom ++ chmod 0640 /etc/bind/rndc.key ++ fi ++ if [ -f /var/run/named/named.pid ]; then ++ ps `cat /var/run/named/named.pid` > /dev/null && exit 1 ++ fi ++ ++ # dirs under /var/run can go away on reboots. ++ mkdir -p /var/run/named ++ mkdir -p /var/cache/bind ++ chmod 775 /var/run/named ++ chown root:bind /var/run/named >/dev/null 2>&1 || true ++ ++ if [ ! -x /usr/sbin/named ]; then ++ echo "named binary missing - not starting" ++ exit 1 ++ fi ++ if start-stop-daemon --start --quiet --exec /usr/sbin/named \ ++ --pidfile /var/run/named/named.pid -- $OPTIONS; then ++ if [ -x /sbin/resolvconf ] ; then ++ echo "nameserver 127.0.0.1" | /sbin/resolvconf -a lo ++ fi ++ fi ++ echo "." ++ ;; ++ ++ stop) ++ echo -n "Stopping domain name service: named" ++ if [ -x /sbin/resolvconf ]; then ++ /sbin/resolvconf -d lo ++ fi ++ /usr/sbin/rndc stop >/dev/null 2>&1 ++ echo "." ++ ;; ++ ++ reload) ++ /usr/sbin/rndc reload ++ ;; ++ ++ restart|force-reload) ++ $0 stop ++ sleep 2 ++ $0 start ++ ;; ++ ++ *) ++ echo "Usage: /etc/init.d/bind {start|stop|reload|restart|force-reload}" >&2 ++ exit 1 ++ ;; ++esac ++ ++exit 0 diff --git a/meta-openeuler/recipes-core/bind/bind/generate-rndc-key.sh b/meta-openeuler/recipes-core/bind/bind/generate-rndc-key.sh new file mode 100644 index 00000000000..633e29c0e61 --- /dev/null +++ b/meta-openeuler/recipes-core/bind/bind/generate-rndc-key.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +if [ ! -s /etc/bind/rndc.key ]; then + echo -n "Generating /etc/bind/rndc.key:" + /usr/sbin/rndc-confgen -a -b 512 + chown root:bind /etc/bind/rndc.key + chmod 0640 /etc/bind/rndc.key +fi diff --git a/meta-openeuler/recipes-core/bind/bind/named.service b/meta-openeuler/recipes-core/bind/bind/named.service new file mode 100644 index 00000000000..cda56ef0150 --- /dev/null +++ b/meta-openeuler/recipes-core/bind/bind/named.service @@ -0,0 +1,22 @@ +[Unit] +Description=Berkeley Internet Name Domain (DNS) +Wants=nss-lookup.target +Before=nss-lookup.target +After=network.target + +[Service] +Type=forking +EnvironmentFile=-/etc/default/bind9 +PIDFile=/run/named/named.pid + +ExecStartPre=@SBINDIR@/generate-rndc-key.sh +ExecStart=@SBINDIR@/named $OPTIONS + +ExecReload=@BASE_BINDIR@/sh -c '@SBINDIR@/rndc reload > /dev/null 2>&1 || @BASE_BINDIR@/kill -HUP $MAINPID' + +ExecStop=@BASE_BINDIR@/sh -c '@SBINDIR@/rndc stop > /dev/null 2>&1 || @BASE_BINDIR@/kill -TERM $MAINPID' + +PrivateTmp=true + +[Install] +WantedBy=multi-user.target diff --git a/meta-openeuler/recipes-core/bind/bind_9.11.14.bb b/meta-openeuler/recipes-core/bind/bind_9.11.14.bb new file mode 100644 index 00000000000..8b336ef7483 --- /dev/null +++ b/meta-openeuler/recipes-core/bind/bind_9.11.14.bb @@ -0,0 +1,132 @@ +SUMMARY = "ISC Internet Domain Name Server" +HOMEPAGE = "https://www.isc.org/bind/" +DESCRIPTION = "BIND 9 provides a full-featured Domain Name Server system" +SECTION = "console/network" + +LICENSE = "MPL-2.0" +LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=8f17f64e47e83b60cd920a1e4b54419e" + +DEPENDS = "openssl libcap zlib" + +SRC_URI = "file://dhcp/dhcp-4.4.2.tar.gz \ + file://0001-revert-d10fbdec-for-lib-dns-gen.c-as-it-is-a-build-p.patch \ + file://conf.patch \ + file://named.service \ + file://bind9 \ + file://generate-rndc-key.sh \ + " + +SRC_URI[sha256sum] = "1a7ccd64a16e5e68f7b5e0f527fd07240a2892ea53fe245620f4f5f607004521" + +UPSTREAM_CHECK_URI = "https://ftp.isc.org/isc/bind9/" +# stay at 9.16 follow the ESV versions divisible by 4 +UPSTREAM_CHECK_REGEX = "(?P9.(16|20|24|28)(\.\d+)+(-P\d+)*)/" + +inherit autotools systemd pkgconfig multilib_header + +# PACKAGECONFIGs readline and libedit should NOT be set at same time +PACKAGECONFIG ?= "readline" +PACKAGECONFIG[httpstats] = "--with-libxml2=${STAGING_DIR_HOST}${prefix},--without-libxml2,libxml2" +PACKAGECONFIG[readline] = "--with-readline=-lreadline,,readline" +PACKAGECONFIG[libedit] = "--with-readline=-ledit,,libedit" +PACKAGECONFIG[urandom] = "--with-randomdev=/dev/urandom,--with-randomdev=/dev/random,," +PACKAGECONFIG[python3] = "--with-python=yes --with-python-install-dir=${PYTHON_SITEPACKAGES_DIR} , --without-python, python3-ply-native," + +EXTRA_OECONF = " --with-libtool --disable-devpoll --enable-epoll \ + --with-gssapi=no --with-lmdb=no --with-zlib \ + --with-ecdsa=yes --with-eddsa=no --with-gost=no \ + --sysconfdir=${sysconfdir}/bind \ + --with-openssl=${STAGING_DIR_HOST}${prefix} \ + " +LDFLAGS_append = " -lz" + +inherit ${@bb.utils.contains('PACKAGECONFIG', 'python3', 'python3native distutils3-base', '', d)} + +# dhcp needs .la so keep them +REMOVE_LIBTOOL_LA = "0" + +USERADD_PACKAGES = "${PN}" +USERADD_PARAM_${PN} = "--system --home ${localstatedir}/cache/bind --no-create-home \ + --user-group bind" + +INITSCRIPT_NAME = "bind" +INITSCRIPT_PARAMS = "defaults" + +SYSTEMD_SERVICE_${PN} = "named.service" + +do_unpak () { + cd ${WORKDIR} + tar -xf dhcp-4.4.2/bind/bind.tar.gz +} + +addtask unpak after do_unpack before do_patch + +do_install_append() { + + rmdir "${D}${localstatedir}/run" + rmdir --ignore-fail-on-non-empty "${D}${localstatedir}" + install -d bind "${D}${localstatedir}/cache/bind" + install -d "${D}${sysconfdir}/bind" + install -d "${D}${sysconfdir}/init.d" + install -m 644 ${S}/conf/* "${D}${sysconfdir}/bind/" + install -m 755 "${S}/init.d" "${D}${sysconfdir}/init.d/bind" + if ${@bb.utils.contains('PACKAGECONFIG', 'python3', 'true', 'false', d)}; then + sed -i -e '1s,#!.*python3,#! /usr/bin/python3,' \ + ${D}${sbindir}/dnssec-coverage \ + ${D}${sbindir}/dnssec-checkds \ + ${D}${sbindir}/dnssec-keymgr + fi + + # Install systemd related files + install -d ${D}${sbindir} + install -m 755 ${WORKDIR}/generate-rndc-key.sh ${D}${sbindir} + install -d ${D}${systemd_unitdir}/system + install -m 0644 ${WORKDIR}/named.service ${D}${systemd_unitdir}/system + sed -i -e 's,@BASE_BINDIR@,${base_bindir},g' \ + -e 's,@SBINDIR@,${sbindir},g' \ + ${D}${systemd_unitdir}/system/named.service + + install -d ${D}${sysconfdir}/default + install -m 0644 ${WORKDIR}/bind9 ${D}${sysconfdir}/default + + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + install -d ${D}${sysconfdir}/tmpfiles.d + echo "d /run/named 0755 bind bind - -" > ${D}${sysconfdir}/tmpfiles.d/bind.conf + fi + + oe_multilib_header isc/platform.h +} + +CONFFILES_${PN} = " \ + ${sysconfdir}/bind/named.conf \ + ${sysconfdir}/bind/named.conf.local \ + ${sysconfdir}/bind/named.conf.options \ + ${sysconfdir}/bind/db.0 \ + ${sysconfdir}/bind/db.127 \ + ${sysconfdir}/bind/db.empty \ + ${sysconfdir}/bind/db.local \ + ${sysconfdir}/bind/db.root \ + " + +ALTERNATIVE_${PN}-utils = "nslookup" +ALTERNATIVE_LINK_NAME[nslookup] = "${bindir}/nslookup" +ALTERNATIVE_PRIORITY = "100" + +PACKAGE_BEFORE_PN += "${PN}-utils" +FILES_${PN}-utils = "${bindir}/host ${bindir}/dig ${bindir}/mdig ${bindir}/nslookup ${bindir}/nsupdate" +FILES_${PN}-dev += "${bindir}/isc-config.h" +FILES_${PN} += "${sbindir}/generate-rndc-key.sh" + +PACKAGE_BEFORE_PN += "${PN}-libs" +# special arrangement below due to +# https://github.com/isc-projects/bind9/commit/0e25af628cd776f98c04fc4cc59048f5448f6c88 +FILES_SOLIBSDEV = "${libdir}/*[!0-9].so ${libdir}/libbind9.so" +FILES_${PN}-libs = "${libdir}/named/*.so* ${libdir}/*-${PV}.so" +FILES_${PN}-staticdev += "${libdir}/*.la" + +PACKAGE_BEFORE_PN += "${@bb.utils.contains('PACKAGECONFIG', 'python3', 'python3-bind', '', d)}" +FILES_python3-bind = "${sbindir}/dnssec-coverage ${sbindir}/dnssec-checkds \ + ${sbindir}/dnssec-keymgr ${PYTHON_SITEPACKAGES_DIR}" + +RDEPENDS_${PN}-dev = "" +RDEPENDS_python3-bind = "python3-core python3-ply" -- Gitee From 1f685a67993489b7e016f21e4592ae1852c30a6c Mon Sep 17 00:00:00 2001 From: lixiaoyong Date: Tue, 25 Jan 2022 15:56:25 +0800 Subject: [PATCH 196/304] add recipe for dhcp Description: DHCP (Dynamic Host Configuration Protocol) is a protocol \ which allows individual devices on an IP network to get their own \ network configuration information from a server. DHCP helps make it \ easier to administer devices. Signed-off-by: lixiaoyong --- meta-openeuler/recipes-core/dhcp/dhcp.inc | 184 ++++++++++++++++++ ...gument-to-make-the-libxml2-dependenc.patch | 62 ++++++ .../dhcp/dhcp/0013-fixup_use_libbind.patch | 64 ++++++ .../recipes-core/dhcp/dhcp/default-server | 7 + .../recipes-core/dhcp/dhcp/dhclient.conf | 50 +++++ .../recipes-core/dhcp/dhcp/dhcpd.conf | 108 ++++++++++ .../recipes-core/dhcp/dhcp/init-server | 44 +++++ .../recipes-core/dhcp/dhcp_4.4.2.bb | 8 + 8 files changed, 527 insertions(+) create mode 100644 meta-openeuler/recipes-core/dhcp/dhcp.inc create mode 100644 meta-openeuler/recipes-core/dhcp/dhcp/0007-Add-configure-argument-to-make-the-libxml2-dependenc.patch create mode 100644 meta-openeuler/recipes-core/dhcp/dhcp/0013-fixup_use_libbind.patch create mode 100644 meta-openeuler/recipes-core/dhcp/dhcp/default-server create mode 100644 meta-openeuler/recipes-core/dhcp/dhcp/dhclient.conf create mode 100644 meta-openeuler/recipes-core/dhcp/dhcp/dhcpd.conf create mode 100644 meta-openeuler/recipes-core/dhcp/dhcp/init-server create mode 100644 meta-openeuler/recipes-core/dhcp/dhcp_4.4.2.bb diff --git a/meta-openeuler/recipes-core/dhcp/dhcp.inc b/meta-openeuler/recipes-core/dhcp/dhcp.inc new file mode 100644 index 00000000000..21e1edc4ebc --- /dev/null +++ b/meta-openeuler/recipes-core/dhcp/dhcp.inc @@ -0,0 +1,184 @@ +SECTION = "console/network" +SUMMARY = "Internet Software Consortium DHCP package" +DESCRIPTION = "DHCP (Dynamic Host Configuration Protocol) is a protocol \ +which allows individual devices on an IP network to get their own \ +network configuration information from a server. DHCP helps make it \ +easier to administer devices." + +HOMEPAGE = "http://www.isc.org/" + +LICENSE = "ISC" +LIC_FILES_CHKSUM = "file://LICENSE;md5=b9c6e660b3d9260de9a342d2fb77540a" + +SRC_URI = "file://dhcp/${BP}.tar.gz \ + file://dhcp/backport-0001-change-bug-url.patch \ + file://dhcp/backport-0002-additional-dhclient-options.patch \ + file://dhcp/backport-0003-Handle-releasing-interfaces-requested-by-sbin-ifup.patch \ + file://dhcp/backport-0004-Support-unicast-BOOTP-for-IBM-pSeries-systems-and-ma.patch \ + file://dhcp/backport-0005-Change-default-requested-options.patch \ + file://dhcp/backport-0006-Various-man-page-only-fixes.patch \ + file://dhcp/backport-0007-Change-paths-to-conform-to-our-standards.patch \ + file://dhcp/backport-0008-Make-sure-all-open-file-descriptors-are-closed-on-ex.patch \ + file://dhcp/backport-0009-Fix-garbage-in-format-string-error.patch \ + file://dhcp/backport-0010-Handle-null-timeout.patch \ + file://dhcp/backport-0011-Drop-unnecessary-capabilities.patch \ + file://dhcp/backport-0012-RFC-3442-Classless-Static-Route-Option-for-DHCPv4-51.patch \ + file://dhcp/backport-0013-DHCPv6-over-PPP-support-626514.patch \ + file://dhcp/backport-0014-IPoIB-support-660681.patch \ + file://dhcp/backport-0015-Add-GUID-DUID-to-dhcpd-logs-1064416.patch \ + file://dhcp/backport-0016-Turn-on-creating-sending-of-DUID.patch \ + file://dhcp/backport-0017-Send-unicast-request-release-via-correct-interface.patch \ + file://dhcp/backport-0018-No-subnet-declaration-for-iface-should-be-info-not-e.patch \ + file://dhcp/backport-0019-dhclient-write-DUID_LLT-even-in-stateless-mode-11563.patch \ + file://dhcp/backport-0020-Discover-all-hwaddress-for-xid-uniqueness.patch \ + file://dhcp/backport-0021-Load-leases-DB-in-non-replay-mode-only.patch \ + file://dhcp/backport-0022-dhclient-make-sure-link-local-address-is-ready-in-st.patch \ + file://dhcp/backport-0023-option-97-pxe-client-id.patch \ + file://dhcp/backport-0025-bind-Detect-system-time-changes.patch \ + file://dhcp/backport-0026-Add-dhclient-5-B-option-description.patch \ + file://dhcp/backport-0027-Add-missed-sd-notify-patch-to-manage-dhcpd-with-syst.patch \ + file://dhcp/bugfix-dhcp-4.2.5-check-dhclient-pid.patch \ + file://dhcp/bugfix-reduce-getifaddr-calls.patch \ + file://dhcp/bugfix-dhcpd-2038-problem.patch \ + file://dhcp/dhcpd-coredump-infiniband.patch \ + file://dhcp/bugfix-dhclient-check-if-pid-was-held.patch \ + file://dhcp/bugfix-dhcp-64-bit-lease-parse.patch \ + file://dhcp/backport-CVE-2021-25217.patch \ + file://dhcp/fix-multiple-definition-with-gcc-10-1.patch \ + file://dhcp/fix-multiple-definition-with-gcc-10-2.patch \ + file://0007-Add-configure-argument-to-make-the-libxml2-dependenc.patch \ + file://0013-fixup_use_libbind.patch \ + file://init-server file://default-server \ + file://dhclient.conf file://dhcpd.conf \ + " + +SRC_URI[sha256sum] = "1a7ccd64a16e5e68f7b5e0f527fd07240a2892ea53fe245620f4f5f607004521" +DEPENDS = "openssl bind" + +UPSTREAM_CHECK_URI = "http://ftp.isc.org/isc/dhcp/" +UPSTREAM_CHECK_REGEX = "(?P\d+\.\d+\.(\d+?))/" + +inherit autotools-brokensep systemd + +USERADD_PACKAGES = "${PN}-server" +USERADD_PARAM_${PN}-server = "--system --no-create-home --home-dir /var/run/${BPN} --shell /bin/false --user-group ${BPN}" + +SYSTEMD_PACKAGES = "${PN}-server ${PN}-relay ${PN}-client" +#SYSTEMD_SERVICE_${PN}-server = "dhcpd.service dhcpd6.service" +#SYSTEMD_AUTO_ENABLE_${PN}-server = "disable" + +#SYSTEMD_SERVICE_${PN}-relay = "dhcrelay.service" +#SYSTEMD_AUTO_ENABLE_${PN}-relay = "disable" + +#SYSTEMD_SERVICE_${PN}-client = "dhclient.service" +#SYSTEMD_AUTO_ENABLE_${PN}-client = "disable" + +INITSCRIPT_PACKAGES = "dhcp-server" +INITSCRIPT_NAME_dhcp-server = "dhcp-server" +INITSCRIPT_PARAMS_dhcp-server = "defaults" + +TARGET_CFLAGS += "-D_GNU_SOURCE" +TARGET_CFLAGS += "-fcommon" +EXTRA_OECONF = "--with-srv-lease-file=${localstatedir}/lib/dhcp/dhcpd.leases \ + --with-srv6-lease-file=${localstatedir}/lib/dhcp/dhcpd6.leases \ + --with-cli-lease-file=${localstatedir}/lib/dhcp/dhclient.leases \ + --with-cli6-lease-file=${localstatedir}/lib/dhcp/dhclient6.leases \ + --enable-paranoia --enable-static=yes --enable-shared=yes \ + --with-randomdev=/dev/random \ + --with-libbind=${STAGING_DIR_HOST} \ + --enable-libtool \ + " + +do_unpak() { + cd ${WORKDIR}/${BP}/bind + tar -xf bind.tar.gz + mv bind-9.11.14/ bind +} + +addtask unpak after do_unpack before do_patch + +#Enable shared libs per dhcp README +do_configure_prepend () { + cp configure.ac+lt configure.ac +} + +do_install_append () { + install -d ${D}${sysconfdir}/init.d + install -d ${D}${sysconfdir}/default + install -d ${D}${sysconfdir}/dhcp + install -m 0755 ${WORKDIR}/init-server ${D}${sysconfdir}/init.d/dhcp-server + install -m 0644 ${WORKDIR}/default-server ${D}${sysconfdir}/default/dhcp-server + + rm -f ${D}${sysconfdir}/dhclient.conf* + rm -f ${D}${sysconfdir}/dhcpd.conf* + install -m 0644 ${WORKDIR}/dhclient.conf ${D}${sysconfdir}/dhcp/dhclient.conf + install -m 0644 ${WORKDIR}/dhcpd.conf ${D}${sysconfdir}/dhcp/dhcpd.conf + + install -d ${D}${base_sbindir}/ + if [ "${sbindir}" != "${base_sbindir}" ]; then + mv ${D}${sbindir}/dhclient ${D}${base_sbindir}/ + fi + install -m 0755 ${S}/client/scripts/linux ${D}${base_sbindir}/dhclient-script + #delete extra rpath + for dhcpFile in $(find ${D} -type f) + do + file ${dhcpFile} | grep ELF || continue + readelf -a ${dhcpFile} | grep rpath || continue + ${RPATH_DELETE} ${dhcpFile} + done +} + +PACKAGES += "dhcp-libs dhcp-server dhcp-server-config dhcp-client dhcp-relay dhcp-omshell" + +FILES_${PN} = "${base_sbindir}/dhclient \ + ${base_sbindir}/dhclient-script \ + ${sysconfdir}/dhcp/dhclient.conf \ + ${bindir}/omshell \ + ${sbindir}/dhcrelay \ + " +RDEPENDS_${PN}-dev = "" +RDEPENDS_${PN}-staticdev = "" +FILES_${PN}-libs = "${libdir}/libdhcpctl.so.0* ${libdir}/libomapi.so.0* ${libdir}/libdhcp.so.0*" + +FILES_${PN}-server = "${sbindir}/dhcpd ${sysconfdir}/init.d/dhcp-server" +RRECOMMENDS_${PN}-server = "dhcp-server-config" + +FILES_${PN}-server-config = "${sysconfdir}/default/dhcp-server ${sysconfdir}/dhcp/dhcpd.conf" + +FILES_${PN}-relay = "${sbindir}/dhcrelay ${sysconfdir}/init.d/dhcp-relay ${sysconfdir}/default/dhcp-relay" + +FILES_${PN}-client = "${base_sbindir}/dhclient \ + ${base_sbindir}/dhclient-script \ + ${sysconfdir}/dhcp/dhclient.conf \ + ${base_sbindir}/dhclient-systemd-wrapper \ + " + +FILES_${PN}-omshell = "${bindir}/omshell" + +pkg_postinst_dhcp-server() { + mkdir -p $D/${localstatedir}/lib/dhcp + touch $D/${localstatedir}/lib/dhcp/dhcpd.leases + touch $D/${localstatedir}/lib/dhcp/dhcpd6.leases +} + +pkg_postinst_dhcp-client() { + mkdir -p $D/${localstatedir}/lib/dhcp +} + +pkg_postrm_dhcp-server() { + rm -f $D/${localstatedir}/lib/dhcp/dhcpd.leases + rm -f $D/${localstatedir}/lib/dhcp/dhcpd6.leases + + if ! rmdir $D/${localstatedir}/lib/dhcp 2>/dev/null; then + echo "Not removing ${localstatedir}/lib/dhcp as it is non-empty." + fi +} + +pkg_postrm_dhcp-client() { + rm -f $D/${localstatedir}/lib/dhcp/dhclient.leases + rm -f $D/${localstatedir}/lib/dhcp/dhclient6.leases + + if ! rmdir $D/${localstatedir}/lib/dhcp 2>/dev/null; then + echo "Not removing ${localstatedir}/lib/dhcp as it is non-empty." + fi +} diff --git a/meta-openeuler/recipes-core/dhcp/dhcp/0007-Add-configure-argument-to-make-the-libxml2-dependenc.patch b/meta-openeuler/recipes-core/dhcp/dhcp/0007-Add-configure-argument-to-make-the-libxml2-dependenc.patch new file mode 100644 index 00000000000..feb0754fff4 --- /dev/null +++ b/meta-openeuler/recipes-core/dhcp/dhcp/0007-Add-configure-argument-to-make-the-libxml2-dependenc.patch @@ -0,0 +1,62 @@ +From 7107511fd209f08f9a96f8938041ae48f3295895 Mon Sep 17 00:00:00 2001 +From: Christopher Larson +Date: Tue, 15 Aug 2017 16:17:49 +0800 +Subject: [PATCH 07/11] Add configure argument to make the libxml2 dependency + explicit and determinisitic. + +Upstream-Status: Pending + +Signed-off-by: Christopher Larson + +Rebase to 4.3.6 + +Signed-off-by: Hongxu Jia +--- + configure.ac | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +Index: dhcp-4.4.1/configure.ac +=================================================================== +--- dhcp-4.4.1.orig/configure.ac ++++ dhcp-4.4.1/configure.ac +@@ -642,6 +642,17 @@ if test "$have_nanosleep" = "rt"; then + LIBS="-lrt $LIBS" + fi + ++AC_ARG_WITH(libxml2, ++ AS_HELP_STRING([--with-libxml2], [link against libxml2. this is needed if bind was built with xml2 support enabled]), ++ with_libxml2="$withval", with_libxml2="no") ++ ++if test x$with_libxml2 != xno; then ++ AC_SEARCH_LIBS(xmlTextWriterStartElement, [xml2], ++ [if test x$with_libxml2 != xauto; then ++ AC_MSG_FAILURE([*** Cannot find xmlTextWriterStartElement with -lxml2 and libxml2 was requested]) ++ fi]) ++fi ++ + # check for /dev/random (declares HAVE_DEV_RANDOM) + AC_MSG_CHECKING(for random device) + AC_ARG_WITH(randomdev, +Index: dhcp-4.4.1/configure.ac+lt +=================================================================== +--- dhcp-4.4.1.orig/configure.ac+lt ++++ dhcp-4.4.1/configure.ac+lt +@@ -909,6 +909,18 @@ elif test "$want_libtool" = "yes" -a "$u + fi + AM_CONDITIONAL(INSTALL_BIND, test "$want_install_bind" = "yes") + ++AC_ARG_WITH(libxml2, ++ AS_HELP_STRING([--with-libxml2], [link against libxml2. this is needed if bind was built with xml2 support enabled]), ++ with_libxml2="$withval", with_libxml2="no") ++ ++if test x$with_libxml2 != xno; then ++ AC_SEARCH_LIBS(xmlTextWriterStartElement, [xml2],, ++ [if test x$with_libxml2 != xauto; then ++ AC_MSG_FAILURE([*** Cannot find xmlTextWriterStartElement with -lxml2 and libxml2 was requested]) ++ fi]) ++fi ++ ++ + # OpenLDAP support. + AC_ARG_WITH(ldap, + AS_HELP_STRING([--with-ldap],[enable OpenLDAP support in dhcpd (default is no)]), diff --git a/meta-openeuler/recipes-core/dhcp/dhcp/0013-fixup_use_libbind.patch b/meta-openeuler/recipes-core/dhcp/dhcp/0013-fixup_use_libbind.patch new file mode 100644 index 00000000000..fcec010bd01 --- /dev/null +++ b/meta-openeuler/recipes-core/dhcp/dhcp/0013-fixup_use_libbind.patch @@ -0,0 +1,64 @@ +lib and include path is hardcoded for use_libbind + +use libdir and includedir vars + +Upstream-Status: Pending +Signed-off-by: Armin Kuster + +Index: dhcp-4.4.1/configure.ac+lt +=================================================================== +--- dhcp-4.4.1.orig/configure.ac+lt ++++ dhcp-4.4.1/configure.ac+lt +@@ -801,22 +801,22 @@ no) + if test ! -d "$use_libbind"; then + AC_MSG_ERROR([Cannot find bind directory at $use_libbind]) + fi +- if test ! -d "$use_libbind/include" -o \ +- ! -f "$use_libbind/include/isc/buffer.h" ++ if test ! -d "$use_libbind/$includedir" -o \ ++ ! -f "$use_libbind/$includedir/isc/buffer.h" + then +- AC_MSG_ERROR([Cannot find bind includes at $use_libbind/include]) ++ AC_MSG_ERROR([Cannot find bind includes at $use_libbind/$includedir]) + fi +- if test ! -d "$use_libbind/lib" -o \ +- \( ! -f "$use_libbind/lib/libisc.a" -a \ +- ! -f "$use_libbind/lib/libisc.la" \) ++ if test ! -d "$use_libbind/$libdir" -o \ ++ \( ! -f "$use_libbind/$libdir/libisc.a" -a \ ++ ! -f "$use_libbind/$libdir/libisc.la" \) + then +- AC_MSG_ERROR([Cannot find bind libraries at $use_libbind/lib]) ++ AC_MSG_ERROR([Cannot find bind libraries at $use_libbind/$libdir]) + fi + BINDDIR="$use_libbind" +- BINDLIBIRSDIR="$BINDDIR/lib" +- BINDLIBDNSDIR="$BINDDIR/lib" +- BINDLIBISCCFGDIR="$BINDDIR/lib" +- BINDLIBISCDIR="$BINDDIR/lib" ++ BINDLIBIRSDIR="$BINDDIR/$libdir" ++ BINDLIBDNSDIR="$BINDDIR/$libdir" ++ BINDLIBISCCFGDIR="$BINDDIR/$libdir" ++ BINDLIBISCDIR="$BINDDIR/$libdir" + DISTCHECK_LIBBIND_CONFIGURE_FLAG="--with-libbind=$use_libbind" + ;; + esac +@@ -856,14 +856,14 @@ AC_ARG_ENABLE(libtool, + + if test "$use_libbind" != "no"; then + if test "$want_libtool" = "yes" -a \ +- ! -f "$use_libbind/lib/libisc.la" ++ ! -f "$use_libbind/$libdir/libisc.la" + then +- AC_MSG_ERROR([Cannot find dynamic libraries at $use_libbind/lib]) ++ AC_MSG_ERROR([Cannot find dynamic libraries at $use_libbind/$libdir]) + fi + if test "$want_libtool" = "no" -a \ +- ! -f "$use_libbind/lib/libisc.a" ++ ! -f "$use_libbind/$libdir/libisc.a" + then +- AC_MSG_ERROR([Cannot find static libraries at $use_libbind/lib]) ++ AC_MSG_ERROR([Cannot find static libraries at $use_libbind/$libdir]) + fi + fi + diff --git a/meta-openeuler/recipes-core/dhcp/dhcp/default-server b/meta-openeuler/recipes-core/dhcp/dhcp/default-server new file mode 100644 index 00000000000..0385d169922 --- /dev/null +++ b/meta-openeuler/recipes-core/dhcp/dhcp/default-server @@ -0,0 +1,7 @@ +# Defaults for dhcp initscript +# sourced by /etc/init.d/dhcp-server +# installed at /etc/default/dhcp-server by the maintainer scripts + +# On what interfaces should the DHCP server (dhcpd) serve DHCP requests? +# Separate multiple interfaces with spaces, e.g. "eth0 eth1". +INTERFACES="" diff --git a/meta-openeuler/recipes-core/dhcp/dhcp/dhclient.conf b/meta-openeuler/recipes-core/dhcp/dhcp/dhclient.conf new file mode 100644 index 00000000000..0e6dcf96c21 --- /dev/null +++ b/meta-openeuler/recipes-core/dhcp/dhcp/dhclient.conf @@ -0,0 +1,50 @@ +# Configuration file for /sbin/dhclient, which is included in Debian's +# dhcp3-client package. +# +# This is a sample configuration file for dhclient. See dhclient.conf's +# man page for more information about the syntax of this file +# and a more comprehensive list of the parameters understood by +# dhclient. +# +# Normally, if the DHCP server provides reasonable information and does +# not leave anything out (like the domain name, for example), then +# few changes must be made to this file, if any. +# + +#send host-name "andare.fugue.com"; +#send dhcp-client-identifier 1:0:a0:24:ab:fb:9c; +#send dhcp-lease-time 3600; +#supersede domain-name "fugue.com home.vix.com"; +#prepend domain-name-servers 127.0.0.1; +request subnet-mask, broadcast-address, time-offset, routers, + domain-name, domain-name-servers, host-name, + netbios-name-servers, netbios-scope; +#require subnet-mask, domain-name-servers; +#timeout 60; +#retry 60; +#reboot 10; +#select-timeout 5; +#initial-interval 2; +#script "/etc/dhcp3/dhclient-script"; +#media "-link0 -link1 -link2", "link0 link1"; +#reject 192.33.137.209; + +#alias { +# interface "eth0"; +# fixed-address 192.5.5.213; +# option subnet-mask 255.255.255.255; +#} + +#lease { +# interface "eth0"; +# fixed-address 192.33.137.200; +# medium "link0 link1"; +# option host-name "andare.swiftmedia.com"; +# option subnet-mask 255.255.255.0; +# option broadcast-address 192.33.137.255; +# option routers 192.33.137.250; +# option domain-name-servers 127.0.0.1; +# renew 2 2000/1/12 00:00:01; +# rebind 2 2000/1/12 00:00:01; +# expire 2 2000/1/12 00:00:01; +#} diff --git a/meta-openeuler/recipes-core/dhcp/dhcp/dhcpd.conf b/meta-openeuler/recipes-core/dhcp/dhcp/dhcpd.conf new file mode 100644 index 00000000000..0001c0f00e2 --- /dev/null +++ b/meta-openeuler/recipes-core/dhcp/dhcp/dhcpd.conf @@ -0,0 +1,108 @@ +# +# Sample configuration file for ISC dhcpd for Debian +# +# $Id: dhcpd.conf,v 1.1.1.1 2002/05/21 00:07:44 peloy Exp $ +# + +# The ddns-updates-style parameter controls whether or not the server will +# attempt to do a DNS update when a lease is confirmed. We default to the +# behavior of the version 2 packages ('none', since DHCP v2 didn't +# have support for DDNS.) +ddns-update-style none; + +# option definitions common to all supported networks... +option domain-name "example.org"; +option domain-name-servers ns1.example.org, ns2.example.org; + +default-lease-time 600; +max-lease-time 7200; + +# If this DHCP server is the official DHCP server for the local +# network, the authoritative directive should be uncommented. +#authoritative; + +# Use this to send dhcp log messages to a different log file (you also +# have to hack syslog.conf to complete the redirection). +log-facility local7; + +# No service will be given on this subnet, but declaring it helps the +# DHCP server to understand the network topology. + +#subnet 10.152.187.0 netmask 255.255.255.0 { +#} + +# This is a very basic subnet declaration. + +#subnet 10.254.239.0 netmask 255.255.255.224 { +# range 10.254.239.10 10.254.239.20; +# option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org; +#} + +# This declaration allows BOOTP clients to get dynamic addresses, +# which we don't really recommend. + +#subnet 10.254.239.32 netmask 255.255.255.224 { +# range dynamic-bootp 10.254.239.40 10.254.239.60; +# option broadcast-address 10.254.239.31; +# option routers rtr-239-32-1.example.org; +#} + +# A slightly different configuration for an internal subnet. +#subnet 10.5.5.0 netmask 255.255.255.224 { +# range 10.5.5.26 10.5.5.30; +# option domain-name-servers ns1.internal.example.org; +# option domain-name "internal.example.org"; +# option routers 10.5.5.1; +# option broadcast-address 10.5.5.31; +# default-lease-time 600; +# max-lease-time 7200; +#} + +# Hosts which require special configuration options can be listed in +# host statements. If no address is specified, the address will be +# allocated dynamically (if possible), but the host-specific information +# will still come from the host declaration. + +#host passacaglia { +# hardware ethernet 0:0:c0:5d:bd:95; +# filename "vmunix.passacaglia"; +# server-name "toccata.fugue.com"; +#} + +# Fixed IP addresses can also be specified for hosts. These addresses +# should not also be listed as being available for dynamic assignment. +# Hosts for which fixed IP addresses have been specified can boot using +# BOOTP or DHCP. Hosts for which no fixed address is specified can only +# be booted with DHCP, unless there is an address range on the subnet +# to which a BOOTP client is connected which has the dynamic-bootp flag +# set. +#host fantasia { +# hardware ethernet 08:00:07:26:c0:a5; +# fixed-address fantasia.fugue.com; +#} + +# You can declare a class of clients and then do address allocation +# based on that. The example below shows a case where all clients +# in a certain class get addresses on the 10.17.224/24 subnet, and all +# other clients get addresses on the 10.0.29/24 subnet. + +#class "foo" { +# match if substring (option vendor-class-identifier, 0, 4) = "SUNW"; +#} + +#shared-network 224-29 { +# subnet 10.17.224.0 netmask 255.255.255.0 { +# option routers rtr-224.example.org; +# } +# subnet 10.0.29.0 netmask 255.255.255.0 { +# option routers rtr-29.example.org; +# } +# pool { +# allow members of "foo"; +# range 10.17.224.10 10.17.224.250; +# } +# pool { +# deny members of "foo"; +# range 10.0.29.10 10.0.29.230; +# } +#} diff --git a/meta-openeuler/recipes-core/dhcp/dhcp/init-server b/meta-openeuler/recipes-core/dhcp/dhcp/init-server new file mode 100644 index 00000000000..5e693adf785 --- /dev/null +++ b/meta-openeuler/recipes-core/dhcp/dhcp/init-server @@ -0,0 +1,44 @@ +#!/bin/sh +# +# $Id: dhcp3-server.init.d,v 1.4 2003/07/13 19:12:41 mdz Exp $ +# + +test -f /usr/sbin/dhcpd || exit 0 + +# It is not safe to start if we don't have a default configuration... +if [ ! -f /etc/default/dhcp-server ]; then + echo "/etc/default/dhcp-server does not exist! - Aborting..." + exit 0 +fi + +# Read init script configuration (so far only interfaces the daemon +# should listen on.) +. /etc/default/dhcp-server + +case "$1" in + start) + echo -n "Starting DHCP server: " + test -d /var/lib/dhcp/ || mkdir -p /var/lib/dhcp/ + test -f /var/lib/dhcp/dhcpd.leases || touch /var/lib/dhcp/dhcpd.leases + start-stop-daemon -S -x /usr/sbin/dhcpd -- -q $INTERFACES -user dhcp -group dhcp + echo "." + ;; + stop) + echo -n "Stopping DHCP server: dhcpd3" + start-stop-daemon -K -x /usr/sbin/dhcpd + echo "." + ;; + restart | force-reload) + $0 stop + sleep 2 + $0 start + if [ "$?" != "0" ]; then + exit 1 + fi + ;; + *) + echo "Usage: /etc/init.d/dhcp-server {start|stop|restart|force-reload}" + exit 1 +esac + +exit 0 diff --git a/meta-openeuler/recipes-core/dhcp/dhcp_4.4.2.bb b/meta-openeuler/recipes-core/dhcp/dhcp_4.4.2.bb new file mode 100644 index 00000000000..3ae90b51127 --- /dev/null +++ b/meta-openeuler/recipes-core/dhcp/dhcp_4.4.2.bb @@ -0,0 +1,8 @@ +require dhcp.inc + +COMPONENT = "isc dhcp" + +LDFLAGS_append = " -pthread" + +PACKAGECONFIG ?= "" +PACKAGECONFIG[bind-httpstats] = "--with-libxml2,--without-libxml2,libxml2" -- Gitee From f32cd475d4b188a433e3df22492adf47d4792f6d Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 25 Jan 2022 16:53:31 +0800 Subject: [PATCH 197/304] delete KERNEL_VERSION from rpmname such as kernel-module-xxx Signed-off-by: lisimin --- .../raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend | 2 ++ meta-openeuler/recipes-core/images/openeuler-image.bb | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend b/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend index 785068b6b46..579132ffe55 100644 --- a/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend +++ b/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend @@ -2,3 +2,5 @@ SRC_URI += "\ file://src-kernel-5.10/0000-raspberrypi-kernel.patch \ " OPENEULER_KERNEL_CONFIG = "${S}/arch/${ARCH}/configs/bcm2711_defconfig" +#delete v8 in kernel module name, such as kernel-module-xxx-5.10.0-v8 +KERNEL_MODULE_PACKAGE_SUFFIX = "" diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index d598c588fe9..9531e44af37 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -123,7 +123,7 @@ libevhtp \ libarchive \ libevent \ iSulad \ -kernel-module-overlay-5.10.0 \ +kernel-module-overlay \ kernel-img \ kernel-vmlinux \ " -- Gitee From 37095b13a135f9ca67b1ce0a71c00605ea4007c7 Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 25 Jan 2022 16:55:11 +0800 Subject: [PATCH 198/304] support build lib32 for raspberrypi4-64 Signed-off-by: lisimin --- bsp/meta-openeuler-bsp/conf/distro/openeuler-bsp.conf | 1 + .../conf/machine/openeuler-raspberrypi4-64.conf | 5 +++++ meta-openeuler/conf/distro/openeuler.conf | 1 + 3 files changed, 7 insertions(+) create mode 100644 bsp/meta-openeuler-bsp/conf/distro/openeuler-bsp.conf create mode 100644 bsp/meta-openeuler-bsp/conf/machine/openeuler-raspberrypi4-64.conf diff --git a/bsp/meta-openeuler-bsp/conf/distro/openeuler-bsp.conf b/bsp/meta-openeuler-bsp/conf/distro/openeuler-bsp.conf new file mode 100644 index 00000000000..e0ead5b7ed9 --- /dev/null +++ b/bsp/meta-openeuler-bsp/conf/distro/openeuler-bsp.conf @@ -0,0 +1 @@ +include conf/machine/openeuler-${MACHINE}.conf diff --git a/bsp/meta-openeuler-bsp/conf/machine/openeuler-raspberrypi4-64.conf b/bsp/meta-openeuler-bsp/conf/machine/openeuler-raspberrypi4-64.conf new file mode 100644 index 00000000000..2868a127fe8 --- /dev/null +++ b/bsp/meta-openeuler-bsp/conf/machine/openeuler-raspberrypi4-64.conf @@ -0,0 +1,5 @@ +require conf/multilib.conf +MULTILIB += "multilib:lib32" +DEFAULTTUNE_virtclass-multilib-lib32 = "armv7a" + +ROOTFS_PACKAGE_ARCH = "aarch64" diff --git a/meta-openeuler/conf/distro/openeuler.conf b/meta-openeuler/conf/distro/openeuler.conf index 24050299a4b..129891979ce 100644 --- a/meta-openeuler/conf/distro/openeuler.conf +++ b/meta-openeuler/conf/distro/openeuler.conf @@ -75,3 +75,4 @@ INHERIT += "get_rpmdeps" #disable the file checksum of fetch do_fetch[file-checksums] = "" SDK_INCLUDE_BUILDTOOLS = "0" +require conf/distro/openeuler-bsp.conf -- Gitee From 9a76bf5535a0e7399276a17196966c486cab6001 Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 25 Jan 2022 16:56:33 +0800 Subject: [PATCH 199/304] build all pkgs for raspberrypi4-64 Signed-off-by: lisimin --- .../recipes-core/images/raspberrypi4-64.inc | 8 -------- .../raspberrypi/recipes-core/images/rpi.inc | 13 +++++++------ 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/raspberrypi4-64.inc b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/raspberrypi4-64.inc index 4218b016e35..6168e321728 100644 --- a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/raspberrypi4-64.inc +++ b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/raspberrypi4-64.inc @@ -1,10 +1,2 @@ #image configuration for aarch64 require rpi.inc - -IMAGE_INSTALL = " \ -busybox-linuxrc \ -kernel \ -busybox \ -os-base \ -glibc \ -" diff --git a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc index 67cedfc46de..18bebaa6274 100644 --- a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc +++ b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc @@ -1,16 +1,17 @@ delete_boot_from_rootfs() { test -d "${OUTPUT_DIR}" || mkdir -p "${OUTPUT_DIR}" pushd "${IMAGE_ROOTFS}" - rm -f "${OUTPUT_DIR}"/*Image* "${OUTPUT_DIR}"/initrd "${OUTPUT_DIR}"/vmlinux* - mv boot/${KERNEL_IMAGETYPE}-* "${OUTPUT_DIR}"/${KERNEL_IMAGETYPE} - mv boot/vmlinux* "${OUTPUT_DIR}"/ - mv boot/Image* "${OUTPUT_DIR}"/ - rm -r ./boot - touch lsm + if [ -d ./boot ];then + rm -f "${OUTPUT_DIR}"/*Image* "${OUTPUT_DIR}"/vmlinux* + mv boot/${KERNEL_IMAGETYPE}-* "${OUTPUT_DIR}"/${KERNEL_IMAGETYPE} + mv boot/vmlinux* "${OUTPUT_DIR}"/ + rm -r ./boot + fi popd } copy_openeuler_distro() { + rm -f "${OUTPUT_DIR}"/initrd cp -fp ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${IMAGE_FSTYPES} "${OUTPUT_DIR}"/initrd } -- Gitee From 5caf8ec0a229b21a1ab38185d77e1223e57170ed Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 25 Jan 2022 18:02:39 +0800 Subject: [PATCH 200/304] build zImage for raspberrypi4-64 Signed-off-by: lisimin --- .../conf/machine/openeuler-raspberrypi4-64.conf | 4 ++++ .../raspberrypi/recipes-core/images/raspberrypi4-64.inc | 2 ++ .../raspberrypi/recipes-core/images/rpi.inc | 1 + .../raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend | 2 -- meta-openeuler/recipes-kernel/linux/linux-openeuler.bb | 2 ++ 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/bsp/meta-openeuler-bsp/conf/machine/openeuler-raspberrypi4-64.conf b/bsp/meta-openeuler-bsp/conf/machine/openeuler-raspberrypi4-64.conf index 2868a127fe8..bdd56ee9986 100644 --- a/bsp/meta-openeuler-bsp/conf/machine/openeuler-raspberrypi4-64.conf +++ b/bsp/meta-openeuler-bsp/conf/machine/openeuler-raspberrypi4-64.conf @@ -3,3 +3,7 @@ MULTILIB += "multilib:lib32" DEFAULTTUNE_virtclass-multilib-lib32 = "armv7a" ROOTFS_PACKAGE_ARCH = "aarch64" + +#set 0 to create zImage +RPI_USE_U_BOOT = "0" +KERNEL_IMAGETYPE_DIRECT = "zImage" diff --git a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/raspberrypi4-64.inc b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/raspberrypi4-64.inc index 6168e321728..ada8babbe54 100644 --- a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/raspberrypi4-64.inc +++ b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/raspberrypi4-64.inc @@ -1,2 +1,4 @@ #image configuration for aarch64 require rpi.inc + +IMAGE_INSTALL += "kernel-image-zimage" diff --git a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc index 18bebaa6274..4a5350cfda9 100644 --- a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc +++ b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc @@ -5,6 +5,7 @@ delete_boot_from_rootfs() { rm -f "${OUTPUT_DIR}"/*Image* "${OUTPUT_DIR}"/vmlinux* mv boot/${KERNEL_IMAGETYPE}-* "${OUTPUT_DIR}"/${KERNEL_IMAGETYPE} mv boot/vmlinux* "${OUTPUT_DIR}"/ + mv boot/Image* "${OUTPUT_DIR}"// || exit 1 rm -r ./boot fi popd diff --git a/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend b/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend index 579132ffe55..785068b6b46 100644 --- a/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend +++ b/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend @@ -2,5 +2,3 @@ SRC_URI += "\ file://src-kernel-5.10/0000-raspberrypi-kernel.patch \ " OPENEULER_KERNEL_CONFIG = "${S}/arch/${ARCH}/configs/bcm2711_defconfig" -#delete v8 in kernel module name, such as kernel-module-xxx-5.10.0-v8 -KERNEL_MODULE_PACKAGE_SUFFIX = "" diff --git a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb index c823fdc5c65..b936163f612 100644 --- a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb +++ b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb @@ -16,6 +16,8 @@ S = "${WORKDIR}/kernel-5.10" LINUX_VERSION ?= "5.10" LINUX_VERSION_EXTENSION_append = "-openeuler" +#delete v8 in kernel module name, such as kernel-module-xxx-5.10.0-v8 +KERNEL_MODULE_PACKAGE_SUFFIX = "" PV = "${LINUX_VERSION}" -- Gitee From e91860b40741b5ffff97da59e2bb2321402b2ffa Mon Sep 17 00:00:00 2001 From: lisimin Date: Tue, 25 Jan 2022 18:15:05 +0800 Subject: [PATCH 201/304] copy sdk to output Signed-off-by: lisimin --- meta-openeuler/recipes-core/images/openeuler-image.bb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 9531e44af37..47d81379c13 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -132,4 +132,9 @@ IMAGE_INSTALL += "${ROOTFS_BOOTSTRAP_INSTALL} ${IMAGE_INSTALL_normal} ${IMAGE_IN DISTRO_FEATURES += "glibc" +copy_opeueuler_sdk() { + cp -fp ${SDKDEPLOYDIR}/${TOOLCHAIN_OUTPUTNAME}.sh "${OUTPUT_DIR}"/ +} +SDK_POSTPROCESS_COMMAND += "copy_opeueuler_sdk;" + require recipes-core/images/${MACHINE}.inc -- Gitee From 7dc7d88b6cd576f05b52d3c0bb2bcba96fa747f9 Mon Sep 17 00:00:00 2001 From: ShiXin Date: Sat, 22 Jan 2022 16:29:19 +0800 Subject: [PATCH 202/304] curl upgrade to 7.79.1 Signed-off-by: ShiXin --- .../curl/{curl_7.77.0.bb => curl_7.79.1.bb} | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) rename meta-openeuler/recipes-core/curl/{curl_7.77.0.bb => curl_7.79.1.bb} (88%) diff --git a/meta-openeuler/recipes-core/curl/curl_7.77.0.bb b/meta-openeuler/recipes-core/curl/curl_7.79.1.bb similarity index 88% rename from meta-openeuler/recipes-core/curl/curl_7.77.0.bb rename to meta-openeuler/recipes-core/curl/curl_7.79.1.bb index 370eef54425..3618eaac341 100644 --- a/meta-openeuler/recipes-core/curl/curl_7.77.0.bb +++ b/meta-openeuler/recipes-core/curl/curl_7.79.1.bb @@ -7,16 +7,11 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" -SRC_URI = "file://curl/curl-7.77.0.tar.xz \ - file://curl/0101-curl-7.32.0-multilib.patch \ - file://curl/0102-curl-7.36.0-debug.patch \ - file://curl/0105-curl-7.63.0-lib1560-valgrind.patch \ - file://curl/0106-curl-fix-CVE-2019-15601.patch \ - file://curl/backport-CVE-2021-22925.patch \ - file://curl/backport-CVE-2021-22926.patch \ - " +SRC_URI = "file://curl/${BP}.tar.xz \ + file://curl/backport-0101-curl-7.32.0-multilib.patch \ +" -S = "${WORKDIR}/${BPN}-${PV}" +S = "${WORKDIR}/${BP}" CVE_PRODUCT = "curl libcurl" inherit autotools -- Gitee From 55a83c2091808ba37e4ffbc5130e90f702be62de Mon Sep 17 00:00:00 2001 From: ShiXin Date: Sat, 22 Jan 2022 16:33:30 +0800 Subject: [PATCH 203/304] libwebsockets upgrade to 4.3.0 Signed-off-by: ShiXin --- .../{libwebsockets_4.0.20.bb => libwebsockets_4.3.0.bb} | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) rename meta-openeuler/recipes-core/libwebsockets/{libwebsockets_4.0.20.bb => libwebsockets_4.3.0.bb} (84%) diff --git a/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb b/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.3.0.bb similarity index 84% rename from meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb rename to meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.3.0.bb index 52dd9eea0d0..db260bbc02b 100644 --- a/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.0.20.bb +++ b/meta-openeuler/recipes-core/libwebsockets/libwebsockets_4.3.0.bb @@ -3,9 +3,12 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" -SRC_URI = "file://libwebsockets/libwebsockets-4.0.20.tar.gz" +SRC_URI = "file://libwebsockets/${BP}.tar.gz \ + file://libwebsockets/0001-add-secure-compile-option-in-Makefile.patch \ + file://libwebsockets/0002-solve-the-BEP-problem.patch \ +" -S = "${WORKDIR}/${BPN}-${PV}" +S = "${WORKDIR}/${BP}" inherit cmake -- Gitee From 848bc6893cc493d29656730510aafa642d7e3cb0 Mon Sep 17 00:00:00 2001 From: ShiXin Date: Sat, 22 Jan 2022 16:34:10 +0800 Subject: [PATCH 204/304] libarchive upgrade to 3.5.2 Signed-off-by: ShiXin --- .../{libarchive_3.5.1.bb => libarchive_3.5.2.bb} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename meta-openeuler/recipes-core/libarchive/{libarchive_3.5.1.bb => libarchive_3.5.2.bb} (79%) diff --git a/meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb b/meta-openeuler/recipes-core/libarchive/libarchive_3.5.2.bb similarity index 79% rename from meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb rename to meta-openeuler/recipes-core/libarchive/libarchive_3.5.2.bb index d2da1f0d4b0..96568d49cb7 100644 --- a/meta-openeuler/recipes-core/libarchive/libarchive_3.5.1.bb +++ b/meta-openeuler/recipes-core/libarchive/libarchive_3.5.2.bb @@ -3,11 +3,11 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" -SRC_URI = "file://libarchive/libarchive-3.5.1.tar.gz \ - file://libarchive/libarchive-uninitialized-value.patch \ - " +SRC_URI = "file://libarchive/${BP}.tar.gz \ + file://libarchive/backport-libarchive-3.5.2-symlink-fix.patch \ +" -S = "${WORKDIR}/${BPN}-${PV}" +S = "${WORKDIR}/${BP}" inherit cmake -- Gitee From 9cc2ce4f457feb0a7ce682fe1e4fb264ebf298a1 Mon Sep 17 00:00:00 2001 From: ShiXin Date: Sat, 22 Jan 2022 16:35:52 +0800 Subject: [PATCH 205/304] libcap-ng upgrade to 0.8.2 Signed-off-by: ShiXin --- meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc | 8 ++++---- .../libcap-ng/{libcap-ng_0.7.11.bb => libcap-ng_0.8.2.bb} | 0 2 files changed, 4 insertions(+), 4 deletions(-) rename meta-openeuler/recipes-core/libcap-ng/{libcap-ng_0.7.11.bb => libcap-ng_0.8.2.bb} (100%) diff --git a/meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc b/meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc index 45478074b49..4a59d071442 100644 --- a/meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc +++ b/meta-openeuler/recipes-core/libcap-ng/libcap-ng.inc @@ -7,11 +7,11 @@ LICENSE = "GPLv2+ & LGPLv2.1+" LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f \ file://COPYING.LIB;md5=e3eda01d9815f8d24aae2dbd89b68b06" -SRC_URI = "file://libcap-ng/libcap-ng-${PV}.tar.gz" +SRC_URI = "file://libcap-ng/${BP}.tar.gz" -S = "${WORKDIR}/${BPN}-${PV}" +S = "${WORKDIR}/${BP}" -SRC_URI[md5sum] = "5883ed10b621c87e29a05cff36d2928e" -SRC_URI[sha256sum] = "85815c711862d01a440db471f12fba462c9949e923966f5859607e652d9c0ae9" +SRC_URI[md5sum] = "faf1ef766cf068ad1aba4008ced665f7" +SRC_URI[sha256sum] = "52c083b77c2b0d8449dee141f9c3eba76e6d4c5ad44ef05df25891126cb85ae9" BBCLASSEXTEND = "native nativesdk" diff --git a/meta-openeuler/recipes-core/libcap-ng/libcap-ng_0.7.11.bb b/meta-openeuler/recipes-core/libcap-ng/libcap-ng_0.8.2.bb similarity index 100% rename from meta-openeuler/recipes-core/libcap-ng/libcap-ng_0.7.11.bb rename to meta-openeuler/recipes-core/libcap-ng/libcap-ng_0.8.2.bb -- Gitee From de650e49aeed88d20b23a6443bf83db211941df0 Mon Sep 17 00:00:00 2001 From: ShiXin Date: Sat, 22 Jan 2022 16:36:36 +0800 Subject: [PATCH 206/304] libseccomp upgrade to 2.5.3 Signed-off-by: ShiXin --- .../libseccomp/{libseccomp_2.5.1.bb => libseccomp_2.5.3.bb} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename meta-openeuler/recipes-core/libseccomp/{libseccomp_2.5.1.bb => libseccomp_2.5.3.bb} (88%) diff --git a/meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.1.bb b/meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.3.bb similarity index 88% rename from meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.1.bb rename to meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.3.bb index a37f52bc387..d56ae9b3690 100644 --- a/meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.1.bb +++ b/meta-openeuler/recipes-core/libseccomp/libseccomp_2.5.3.bb @@ -7,10 +7,10 @@ LICENSE = "LGPL-2.1" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" -SRC_URI = "file://libseccomp/libseccomp-2.5.1.tar.gz" +SRC_URI = "file://libseccomp/${BP}.tar.gz" -S = "${WORKDIR}/${BPN}-${PV}" +S = "${WORKDIR}/${BP}" inherit autotools -- Gitee From 242a901135188ec1415fae72f974476ace495139 Mon Sep 17 00:00:00 2001 From: ShiXin Date: Sat, 22 Jan 2022 16:38:15 +0800 Subject: [PATCH 207/304] busybox upgrade to 1.34.1 Signed-off-by: ShiXin --- .../busybox/{busybox_1.33.1.bb => busybox_1.34.1.bb} | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) rename meta-openeuler/recipes-core/busybox/{busybox_1.33.1.bb => busybox_1.34.1.bb} (98%) diff --git a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb b/meta-openeuler/recipes-core/busybox/busybox_1.34.1.bb similarity index 98% rename from meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb rename to meta-openeuler/recipes-core/busybox/busybox_1.34.1.bb index 51af79e86cc..087f0eb3961 100644 --- a/meta-openeuler/recipes-core/busybox/busybox_1.33.1.bb +++ b/meta-openeuler/recipes-core/busybox/busybox_1.34.1.bb @@ -16,10 +16,11 @@ CFLAGS += "-I${STAGING_INCDIR}/tirpc" #get arch info inherit kernel-arch -SRC_URI = "file://busybox/busybox-1.33.1.tar.bz2 \ +SRC_URI = "file://busybox/${BP}.tar.bz2 \ file://yocto-embedded-tools/config/arm64/defconfig-busybox \ " -S = "${WORKDIR}/${BPN}-${PV}" + +S = "${WORKDIR}/${BP}" #not split debug files with dwarfsrcfiles,no dwarfsrcfiles INHIBIT_PACKAGE_DEBUG_SPLIT = "1" -- Gitee From 3b2aa248bebce20e328163acdfd317764c8146a8 Mon Sep 17 00:00:00 2001 From: ShiXin Date: Sat, 22 Jan 2022 16:39:12 +0800 Subject: [PATCH 208/304] openssl upgrade to 1.1.1m Signed-off-by: ShiXin --- meta-openeuler/recipes-core/openssl/openssl.inc | 14 ++++++++++++-- .../{openssl_1.1.1f.bb => openssl_1.1.1m.bb} | 0 2 files changed, 12 insertions(+), 2 deletions(-) rename meta-openeuler/recipes-core/openssl/{openssl_1.1.1f.bb => openssl_1.1.1m.bb} (100%) diff --git a/meta-openeuler/recipes-core/openssl/openssl.inc b/meta-openeuler/recipes-core/openssl/openssl.inc index 3a25c10dd2f..a371265b860 100644 --- a/meta-openeuler/recipes-core/openssl/openssl.inc +++ b/meta-openeuler/recipes-core/openssl/openssl.inc @@ -11,10 +11,20 @@ DEPENDS = "perl-native-runtime nettle" DEPENDS_append_class-target = " openssl-native" #DEPENDS_append_class-target = " linux-libc-headers" -SRC_URI = "file://openssl/openssl-1.1.1f.tar.gz" +SRC_URI = "file://openssl/${BP}.tar.gz \ + file://openssl/openssl-1.1.1-build.patch \ + file://openssl/openssl-1.1.1-fips.patch \ + file://0001-buildinfo-strip-sysroot-and-debug-prefix-map-from-co.patch \ + file://0001-skip-test_symbol_presence.patch \ + file://0003-Add-support-for-io_pgetevents_time64-syscall.patch \ + file://0004-Fixup-support-for-io_pgetevents_time64-syscall.patch \ + file://afalg.patch \ + file://reproducible.patch \ +" + LIC_FILES_CHKSUM = "file://LICENSE;md5=d343e62fc9c833710bbbed25f27364c8" -S = "${WORKDIR}/openssl-${PV}" +S = "${WORKDIR}/${BP}" PACKAGECONFIG[perl] = ",,," diff --git a/meta-openeuler/recipes-core/openssl/openssl_1.1.1f.bb b/meta-openeuler/recipes-core/openssl/openssl_1.1.1m.bb similarity index 100% rename from meta-openeuler/recipes-core/openssl/openssl_1.1.1f.bb rename to meta-openeuler/recipes-core/openssl/openssl_1.1.1m.bb -- Gitee From c748468faadaa91a0c2948a4ad3e56cf64bf89a2 Mon Sep 17 00:00:00 2001 From: ShiXin Date: Sat, 22 Jan 2022 16:40:45 +0800 Subject: [PATCH 209/304] openssh upgrade to 8.8p1 Signed-off-by: ShiXin --- .../openssh/{openssh_8.2p1.bb => openssh_8.8p1.bb} | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) rename meta-openeuler/recipes-core/openssh/{openssh_8.2p1.bb => openssh_8.8p1.bb} (98%) diff --git a/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb b/meta-openeuler/recipes-core/openssh/openssh_8.8p1.bb similarity index 98% rename from meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb rename to meta-openeuler/recipes-core/openssh/openssh_8.8p1.bb index 35d44c2565e..1e609f3223a 100644 --- a/meta-openeuler/recipes-core/openssh/openssh_8.2p1.bb +++ b/meta-openeuler/recipes-core/openssh/openssh_8.8p1.bb @@ -28,7 +28,7 @@ SYSTEMD_SERVICE_${PN}-sshd = "sshd.socket" inherit autotools-brokensep -LIC_FILES_CHKSUM="file://LICENCE;md5=18d9e5a8b3dd1790d73502f50426d4d3" +LIC_FILES_CHKSUM="file://LICENCE;md5=d9d2753bdef9f19466dc7bc959114b11" EXTRA_AUTORECONF_DEFINE = " ACLOCAL=echo " PACKAGECONFIG ??= "" @@ -63,7 +63,7 @@ CACHED_CONFIGUREVARS += "ac_cv_path_PATH_PASSWD_PROG=${bindir}/passwd" CACHED_CONFIGUREVARS += "ac_cv_header_maillock_h=no" # copy SRC_URI files -SRC_URI = "file://openssh/openssh-8.2p1.tar.gz \ +SRC_URI = "file://openssh/${BP}.tar.gz \ file://ssh_config \ file://init \ file://sshd.socket \ @@ -76,7 +76,6 @@ file://sshd_config_readonly \ file://sshd \ " - PAM_SRC_URI = "file://sshd" SRC_URI_EXTRA = "file://ssh_config \ file://init \ -- Gitee From 3c0fc8c6e83fc684e26181474e9f50df572dfcbb Mon Sep 17 00:00:00 2001 From: lisimin Date: Wed, 26 Jan 2022 16:12:45 +0800 Subject: [PATCH 210/304] config SDK_RELOCATE_AFTER_INSTALL to use toolchain-shar-extract.sh not use toolchain-shar-relocate.sh openeuler sdk used to build target files, not support build host Signed-off-by: lisimin --- meta-openeuler/recipes-core/glibc/glibc_2.34.bb | 9 --------- meta-openeuler/recipes-core/images/openeuler-image.bb | 2 +- .../binutils/binutils-crosssdk_%.bbappend | 2 -- 3 files changed, 1 insertion(+), 12 deletions(-) delete mode 100644 meta-openeuler/recipes-devtools/binutils/binutils-crosssdk_%.bbappend diff --git a/meta-openeuler/recipes-core/glibc/glibc_2.34.bb b/meta-openeuler/recipes-core/glibc/glibc_2.34.bb index 459fc1882bb..1eaee58de62 100644 --- a/meta-openeuler/recipes-core/glibc/glibc_2.34.bb +++ b/meta-openeuler/recipes-core/glibc/glibc_2.34.bb @@ -23,7 +23,6 @@ require ../../recipes-devtools/gcc/gcc-bin-toolchain.inc SRC_URI_aarch64 = "file://openeuler_gcc_arm64le" SRC_URI_arm = "file://openeuler_gcc_arm32le" -SRC_URI_class-nativesdk = "" #Not strip toolchain INHIBIT_SYSROOT_STRIP = "1" @@ -54,14 +53,6 @@ do_install() { chown root:root ${D}/ -R } -do_install_class-nativesdk() { - test -d ${D}/${base_libdir} || mkdir -p ${D}/${base_libdir} - pushd ${D}/${base_libdir} - local ldso="$(ldconfig -p | grep ld-linux | awk '{print $NF}')" - cp -p "${ldso}" ld-linux.so - popd -} - FILES_${PN} = " \ ${base_libdir}/ld-linux*.so* \ ${libdir}/libc.so \ diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index 47d81379c13..ee4525ec983 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -18,13 +18,13 @@ inherit populate_sdk #set IMAGE_LOCALES_ARCHIVE to 0 and unset SDKIMAGE_LINGUAS, to avoid run generate_locale_archive() IMAGE_LOCALES_ARCHIVE = "0" SDKIMAGE_LINGUAS = "" +SDK_RELOCATE_AFTER_INSTALL = "0" inherit populate_sdk_ext export SDK_OS = "linux" TOOLCHAIN_HOST_TASK_task-populate-sdk-ext = "" TOOLCHAIN_HOST_TASK = " \ meta-environment-${MACHINE} \ -nativesdk-glibc \ " FEATURE_PACKAGES_tools-sdk_remove = " packagegroup-core-sdk packagegroup-core-standalone-sdk-target" TOOLCHAIN_TARGET_TASK_remove += "${@multilib_pkg_extend(d, 'packagegroup-core-standalone-sdk-target')}" diff --git a/meta-openeuler/recipes-devtools/binutils/binutils-crosssdk_%.bbappend b/meta-openeuler/recipes-devtools/binutils/binutils-crosssdk_%.bbappend deleted file mode 100644 index 5e0eda5b432..00000000000 --- a/meta-openeuler/recipes-devtools/binutils/binutils-crosssdk_%.bbappend +++ /dev/null @@ -1,2 +0,0 @@ -PV = "2.37" -require binutils-${PV}.inc -- Gitee From dbc4adca73c57146bbd3aad4db2c3a937051222d Mon Sep 17 00:00:00 2001 From: lisimin Date: Wed, 26 Jan 2022 16:41:39 +0800 Subject: [PATCH 211/304] not depends to lib32-qemuwrapper-cross when no other lib32 pkgs Signed-off-by: lisimin --- meta-openeuler/recipes-core/images/openeuler-image.bb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/meta-openeuler/recipes-core/images/openeuler-image.bb b/meta-openeuler/recipes-core/images/openeuler-image.bb index ee4525ec983..d296982e59b 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image.bb @@ -37,7 +37,9 @@ ROOTFS_BOOTSTRAP_INSTALL = "" do_rootfs[depends] = "" #not depends to ldconfig-native #LDCONFIGDEPEND = "" -DEPENDS_remove += "cross-localedef-native" +#not depends to lib32-qemuwrapper-cross when no other lib32 pkgs +DEPENDS_remove += "${@' '.join(["%s-qemuwrapper-cross" % m for m in d.getVar("MULTILIB_VARIANTS").split()])} cross-localedef-native" +SDK_DEPENDS_remove += "${@' '.join(["%s-qemuwrapper-cross" % m for m in d.getVar("MULTILIB_VARIANTS").split()])}" RPMROOTFSDEPENDS = "" #IMAGE_ROOTFS_SIZE ?= "8192" -- Gitee From b115ec9f5fa9f6017289065f406e2851180149cf Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Thu, 27 Jan 2022 12:13:47 +0800 Subject: [PATCH 212/304] lcr: cleanup the lcr bb * apply the patches of lcr to fix compile error * clean up the layout of bb file, including wrong description Signed-off-by: Wayne Ren --- meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb | 29 ++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb b/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb index 35afc1b9959..7fbbfe11dcb 100644 --- a/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb +++ b/meta-openeuler/recipes-core/lcr/lcr_2.0.6.bb @@ -1,24 +1,43 @@ -DESCRIPTION = "Yet Another JSON Library - A Portable JSON parsing and serialization library in ANSI C" -LICENSE = "MIT" - +### Descriptive metadata +SUMMARY = "lcr(Lightweight Container Runtime)" +DESCRIPTION = "lcr`(Lightweight Container Runtime) is CLI tool for spawning and running containers according to \ + OCI specification. It is based on `liblxc` and written by `C`. It can use by container engine: \ + iSulad" +AUTHOR = "" +HOMEPAGE = "https://gitee.com/openeuler/lcr" +BUGTRACKER = "https://gitee.com/openeuler/yocto-meta-openeuler" + +### License metadata +LICENSE = "LGPLv2.1" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" +### Inheritance and includes if needed +inherit cmake + +### Build metadata SRC_URI = "file://lcr/v2.0.6.tar.gz \ + file://lcr/0001-modified-ipconfig.json-to-adapt-to-newest-version-of.patch \ + file://lcr/0002-disable-lxc_keep-with-oci-image.patch \ + file://lcr/0003-add-self-def-runtime-for-shimv2.patch \ + file://lcr/0004-move-cri-runtimes-to-daemon.patch \ + file://lcr/0005-config-v2-and-inspect-were-modified-to-support-modif.patch \ + file://lcr/0006-support-null-value-in-json.patch \ + file://lcr/0007-fix-the-error-of-gcc-compilation-optimization-level.patch \ " S = "${WORKDIR}/${BPN}" -inherit cmake - OECMAKE_GENERATOR = "Unix Makefiles" DEPENDS = "yajl lxc" +### Package metadata INHIBIT_PACKAGE_DEBUG_SPLIT = "1" #remove so from ${PN}-dev FILES_SOLIBSDEV = "" FILES_${PN} += "${libdir}/* " +### Tasks for package do_configure_prepend() { grep -q CMAKE_SYSROOT ${WORKDIR}/toolchain.cmake || cat >> ${WORKDIR}/toolchain.cmake < Date: Thu, 27 Jan 2022 15:13:34 +0800 Subject: [PATCH 213/304] libcap upgrade to 2.61 Signed-off-by: ShiXin --- .../libcap/{libcap_2.32.bb => libcap_2.61.bb} | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) rename meta-openeuler/recipes-core/libcap/{libcap_2.32.bb => libcap_2.61.bb} (72%) diff --git a/meta-openeuler/recipes-core/libcap/libcap_2.32.bb b/meta-openeuler/recipes-core/libcap/libcap_2.61.bb similarity index 72% rename from meta-openeuler/recipes-core/libcap/libcap_2.32.bb rename to meta-openeuler/recipes-core/libcap/libcap_2.61.bb index 8cf19b0ff93..1f0868c853d 100644 --- a/meta-openeuler/recipes-core/libcap/libcap_2.32.bb +++ b/meta-openeuler/recipes-core/libcap/libcap_2.61.bb @@ -1,5 +1,3 @@ -#require libcap.inc -#require ${OPEN_SRC_DIR}/${BPN}/series_yocto.conf SUMMARY = "Library for getting/setting POSIX.1e capabilities" HOMEPAGE = "http://sites.google.com/site/fullycapable/" @@ -8,10 +6,9 @@ LICENSE = "BSD | GPLv2" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" -SRC_URI = "file://libcap/libcap-2.32.tar.gz \ - file://libcap/libcap-buildflags.patch \ - file://libcap/Avoid-segfaulting-when-the-kernel-is-ahead-of-libcap.patch \ - " +SRC_URI = "file://libcap/${BP}.tar.gz \ + file://libcap/libcap-buildflags.patch \ +" S = "${WORKDIR}/${BPN}-${PV}" @@ -20,15 +17,6 @@ DEPENDS = "hostperl-runtime-native gperf-native" inherit lib_package -# do NOT pass target cflags to host compilations -# -do_configure() { - # libcap uses := for compilers, fortunately, it gives us a hint - # on what should be replaced with ?= - sed -e 's,:=,?=,g' -i Make.Rules - sed -e 's,^BUILD_CFLAGS ?= $(.*CFLAGS),BUILD_CFLAGS := $(BUILD_CFLAGS),' -i Make.Rules -} - PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'pam', d)}" PACKAGECONFIG_class-native ??= "" @@ -50,7 +38,14 @@ INSANE_SKIP += "installed-vs-shipped" CFLAGS += "-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64" do_compile() { - oe_runmake ${PACKAGECONFIG_CONFARGS} + unset CFLAGS BUILD_CFLAGS + oe_runmake ${PACKAGECONFIG_CONFARGS} \ + AR="${AR}" \ + CC="${CC}" \ + RANLIB="${RANLIB}" \ + OBJCOPY="${OBJCOPY}" \ + COPTS="${CFLAGS}" \ + BUILD_COPTS="${BUILD_CFLAGS}" } do_install() { @@ -77,7 +72,7 @@ do_install_append() { #FILES_${PN}-dev += "${base_libdir}/*.so" # pam files -FILES_${PN} += "/lib/security/*.so" +FILES_${PN} += "${base_libdir}/security/*.so" BBCLASSEXTEND = "native nativesdk" -- Gitee From c5017b7c448814deaaaed0fd6a91c9371b7fb917 Mon Sep 17 00:00:00 2001 From: ShiXin Date: Thu, 27 Jan 2022 15:14:49 +0800 Subject: [PATCH 214/304] bash upgrade to 5.1.8 Signed-off-by: ShiXin --- meta-openeuler/recipes-labtools/bash/bash.inc | 1 - .../recipes-labtools/bash/bash_5.1.8.bb | 20 +++++++++++++++++++ .../recipes-labtools/bash/bash_5.1.bb | 11 ---------- 3 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 meta-openeuler/recipes-labtools/bash/bash_5.1.8.bb delete mode 100644 meta-openeuler/recipes-labtools/bash/bash_5.1.bb diff --git a/meta-openeuler/recipes-labtools/bash/bash.inc b/meta-openeuler/recipes-labtools/bash/bash.inc index c3f31483501..95625d9843c 100644 --- a/meta-openeuler/recipes-labtools/bash/bash.inc +++ b/meta-openeuler/recipes-labtools/bash/bash.inc @@ -4,7 +4,6 @@ SECTION = "base/shell" DEPENDS = "ncurses bison-native" -#inherit autotools gettext update-alternatives ptest inherit autotools gettext EXTRA_OECONF = "--enable-job-control" diff --git a/meta-openeuler/recipes-labtools/bash/bash_5.1.8.bb b/meta-openeuler/recipes-labtools/bash/bash_5.1.8.bb new file mode 100644 index 00000000000..23a69ac5f91 --- /dev/null +++ b/meta-openeuler/recipes-labtools/bash/bash_5.1.8.bb @@ -0,0 +1,20 @@ +require bash.inc + +LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" + +SRC_URI = "file://bash/${BP}.tar.gz \ + file://bash/bash-2.05a-interpreter.patch \ + file://bash/bash-2.05b-pgrp_sync.patch \ + file://bash/bash-4.0-nobits.patch \ + file://bash/bash-4.2-coverity.patch \ + file://bash/bash-4.3-noecho.patch \ + file://bash/bash-4.3-memleak-lc_all.patch \ + file://bash/bugfix-Forbidden-non-root-user-to-clear-history.patch \ + file://bash/enable-dot-logout-and-source-bashrc-through-ssh.patch \ +" + +# GPLv2+ (< 4.0), GPLv3+ (>= 4.0) +LICENSE = "GPLv3+" + + +BBCLASSEXTEND = "nativesdk" diff --git a/meta-openeuler/recipes-labtools/bash/bash_5.1.bb b/meta-openeuler/recipes-labtools/bash/bash_5.1.bb deleted file mode 100644 index 5f67a448c72..00000000000 --- a/meta-openeuler/recipes-labtools/bash/bash_5.1.bb +++ /dev/null @@ -1,11 +0,0 @@ -require bash.inc - -LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" - -SRC_URI = "file://bash/bash-5.1.tar.gz" - -# GPLv2+ (< 4.0), GPLv3+ (>= 4.0) -LICENSE = "GPLv3+" - - -BBCLASSEXTEND = "nativesdk" -- Gitee From 5011ef46941afda414c6e5ca44bc759fc08f9323 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Fri, 28 Jan 2022 15:16:03 +0800 Subject: [PATCH 215/304] qemu_aarch64: only support 64 bit library by default for qemu aarch64, don't enable multilibs-lib32 support, i.e., everything is 64 bit. This will avoid the uncessary work related to lib32 Signed-off-by: Wayne Ren --- meta-openeuler/conf/machine/qemu-aarch64.conf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/meta-openeuler/conf/machine/qemu-aarch64.conf b/meta-openeuler/conf/machine/qemu-aarch64.conf index 742c3d700af..9abe74de24c 100644 --- a/meta-openeuler/conf/machine/qemu-aarch64.conf +++ b/meta-openeuler/conf/machine/qemu-aarch64.conf @@ -13,8 +13,9 @@ PACKAGE_EXTRA_ARCHS_tune-armv7a += " armv7a" PACKAGE_EXTRA_ARCHS_virtclass-multilib-lib32 = "armv7a" require conf/multilib.conf -MULTILIB += "multilib:lib32" -MULTILIB += "multilib:ilp32" +# for qemu-aarch64,don't enable multilib lib32 support, +# by default everything is 64 bit +MULTILIBS ?= "" DEFAULTTUNE_virtclass-multilib-ilp32 =. "aarch64_ilp32:" export ROOTFS_PACKAGE_ARCH = "aarch64" export ROOTFS_PACKAGE_ARCH_virtclass-multilib-lib32 = "armv7l" -- Gitee From 30920adff503bae5fe81e8778881569b3f6cd732 Mon Sep 17 00:00:00 2001 From: lisimin Date: Fri, 28 Jan 2022 17:03:22 +0800 Subject: [PATCH 216/304] support create raspberrypi image Signed-off-by: lisimin --- .../recipes-core/images/openeuler-image.bbappend | 3 +++ .../raspberrypi/recipes-core/images/rpi.inc | 16 ++++++++++++++++ bsp/meta-openeuler-bsp/wic/sdimage-rpi.wks | 6 ++++++ meta-openeuler/conf/local.conf.sample | 7 +++++-- .../recipes-kernel/linux/linux-openeuler.bb | 1 - 5 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 bsp/meta-openeuler-bsp/wic/sdimage-rpi.wks diff --git a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/openeuler-image.bbappend b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/openeuler-image.bbappend index 81fe7b794a1..80594cb9ba6 100644 --- a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/openeuler-image.bbappend +++ b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/openeuler-image.bbappend @@ -1 +1,4 @@ FILESEXTRAPATHS_prepend := "${THISDIR}/files:" +#fix mkfs.ext4 running error, add -E no_copy_xattrs to mkfs.ext4 +WKS_FILE = "sdimage-rpi.wks" +WKS_FILE_DEPENDS = "" diff --git a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc index 4a5350cfda9..bf36e9d4324 100644 --- a/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc +++ b/bsp/meta-openeuler-bsp/raspberrypi/recipes-core/images/rpi.inc @@ -18,3 +18,19 @@ copy_openeuler_distro() { IMAGE_PREPROCESS_COMMAND += "delete_boot_from_rootfs;" IMAGE_POSTPROCESS_COMMAND += "copy_openeuler_distro;" + + +#IMAGE_FEATURES += "splash" +IMAGE_FSTYPES = "wic.gz" + +#not depends to native parted/mtools and so on, use host command +export OPENEULER_WIC_IMAGE_REMOVE = "parted gptfdisk dosfstools mtools" +python() { + all_depends = d.getVarFlag("do_image_wic", "depends") + bb.note("all depends of do_image_wic: %s" % all_depends) + for dep in ('parted', 'gptfdisk', 'dosfstools', 'mtools'): + all_depends = all_depends.replace('%s-native:do_populate_sysroot' % dep, "") + new_depends = all_depends + d.setVarFlag("do_image_wic", "depends", new_depends) + bb.note("new depends of do_image_wic: %s" % new_depends) +} diff --git a/bsp/meta-openeuler-bsp/wic/sdimage-rpi.wks b/bsp/meta-openeuler-bsp/wic/sdimage-rpi.wks new file mode 100644 index 00000000000..283d94e9d2a --- /dev/null +++ b/bsp/meta-openeuler-bsp/wic/sdimage-rpi.wks @@ -0,0 +1,6 @@ +# short-description: Create Raspberry Pi SD card image +# long-description: Creates a partitioned SD card image for use with +# Raspberry Pi. Boot files are located in the first vfat partition. + +part /boot --source bootimg-partition --ondisk mmcblk0 --fstype=vfat --label boot --active --align 4096 --size 20 +part / --source rootfs --ondisk mmcblk0 --fstype=ext4 --label root --align 4096 --mkfs-extraopts='-E no_copy_xattrs' diff --git a/meta-openeuler/conf/local.conf.sample b/meta-openeuler/conf/local.conf.sample index 37723d45976..897468e94b1 100644 --- a/meta-openeuler/conf/local.conf.sample +++ b/meta-openeuler/conf/local.conf.sample @@ -274,7 +274,8 @@ CONF_VERSION = "2" HOSTTOOLS += "python chrpath rpmbuild pkg-config flex bison bc automake autoreconf libtool \ ninja xz autopoint autoreconf aclocal libtoolize autoscan autom4te autoconf autoheader \ autoupdate libtool libtoolize pkg-config cmake fmt gperf m4 createrepo_c dnf ldconfig \ - msgfmt msgmerge rpcgen makeinfo meson" + msgfmt msgmerge rpcgen makeinfo meson mkdosfs mcopy mkfs.ext4 debugfs fsck.ext4 dumpe2fs \ + parted" HOSTTOOLS_remove += "diffstat lz4c pzstd" SANITY_REQUIRED_UTILITIES_remove += "diffstat chrpath" CONNECTIVITY_CHECK_URIS = "" @@ -286,7 +287,9 @@ ASSUME_PROVIDED += "rpm-native dwarfsrcfiles-native depmodwrapper-cross kmod-nat m4-native flex-native unifdef-native rsync-native init-system-helpers automake-native \ autoconf-native libtool-native opkg-utils-native patch-native pkgconfig-native \ init-system-helpers update-rc.d-native run-postinsts cmake-native ninja-native \ - cross-localedef-native nativesdk-glibc-locale nativesdk-qemuwrapper-cross \ + cross-localedef-native nativesdk-glibc-locale nativesdk-qemuwrapper-cross gzip-native \ + parted-native gptfdisk-native dosfstools-native mtools-native meson-native ninja-native \ + bmap-tools-native \ " PATCHTOOL = "patch" TCMODE = "gcc-bin" diff --git a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb index b936163f612..c96fa978367 100644 --- a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb +++ b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb @@ -4,7 +4,6 @@ LICENSE = "GPLv2" LIC_FILES_CHKSUM ?= "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46" inherit kernel -#require recipes-kernel/linux/linux-yocto.inc SRC_URI = "file://kernel-5.10 \ file://yocto-embedded-tools/config/${ARCH}/defconfig-kernel \ -- Gitee From 60ea1752c1d8519b19e8b38e9ddf88deab8758f3 Mon Sep 17 00:00:00 2001 From: Wayne Ren Date: Fri, 28 Jan 2022 21:24:06 +0800 Subject: [PATCH 217/304] docs: add initial docs of yocto part add initial docs of yocto part Signed-off-by: lisimin Signed-off-by: Wayne Ren --- docs/image/yocto/bitbake_g.png | Bin 0 -> 36179 bytes docs/image/yocto/conf_bblayer_conf.png | Bin 0 -> 17966 bytes docs/image/yocto/conf_distro_conf.png | Bin 0 -> 70201 bytes docs/image/yocto/conf_layer_conf.png | Bin 0 -> 34820 bytes docs/image/yocto/conf_local_conf.png | Bin 0 -> 60880 bytes docs/image/yocto/create_layer.png | Bin 0 -> 61550 bytes docs/image/yocto/hosttools.png | Bin 0 -> 175700 bytes .../open_embedded_architecture_workflow.png | Bin 0 -> 167973 bytes docs/image/yocto/package_feeds.png | Bin 0 -> 50728 bytes docs/image/yocto/poky_code_structure.png | Bin 0 -> 32298 bytes docs/image/yocto/tasks_do_compile.png | Bin 0 -> 58259 bytes docs/image/yocto/tasks_do_fetch.png | Bin 0 -> 55487 bytes docs/image/yocto/tasks_do_image.png | Bin 0 -> 105634 bytes docs/image/yocto/tasks_do_package.png | Bin 0 -> 80216 bytes docs/image/yocto/tasks_do_patch.png | Bin 0 -> 69952 bytes docs/image/yocto/tasks_do_patch_log.png | Bin 0 -> 69525 bytes docs/image/yocto/yocto_main_components.png | Bin 0 -> 82729 bytes docs/image/yocto/yocto_tasks.png | Bin 0 -> 35181 bytes docs/source/features/index.rst | 2 +- docs/source/yocto/index.rst | 1575 ++++++++++++++++- 20 files changed, 1561 insertions(+), 16 deletions(-) create mode 100755 docs/image/yocto/bitbake_g.png create mode 100755 docs/image/yocto/conf_bblayer_conf.png create mode 100755 docs/image/yocto/conf_distro_conf.png create mode 100755 docs/image/yocto/conf_layer_conf.png create mode 100755 docs/image/yocto/conf_local_conf.png create mode 100755 docs/image/yocto/create_layer.png create mode 100755 docs/image/yocto/hosttools.png create mode 100755 docs/image/yocto/open_embedded_architecture_workflow.png create mode 100755 docs/image/yocto/package_feeds.png create mode 100755 docs/image/yocto/poky_code_structure.png create mode 100755 docs/image/yocto/tasks_do_compile.png create mode 100755 docs/image/yocto/tasks_do_fetch.png create mode 100755 docs/image/yocto/tasks_do_image.png create mode 100755 docs/image/yocto/tasks_do_package.png create mode 100755 docs/image/yocto/tasks_do_patch.png create mode 100755 docs/image/yocto/tasks_do_patch_log.png create mode 100755 docs/image/yocto/yocto_main_components.png create mode 100755 docs/image/yocto/yocto_tasks.png diff --git a/docs/image/yocto/bitbake_g.png b/docs/image/yocto/bitbake_g.png new file mode 100755 index 0000000000000000000000000000000000000000..74c1eb00a5f98fea8f58b2bf5f7f7cac78e8e9a6 GIT binary patch literal 36179 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 literal 0 HcmV?d00001 diff --git a/docs/image/yocto/conf_distro_conf.png b/docs/image/yocto/conf_distro_conf.png new file mode 100755 index 0000000000000000000000000000000000000000..69b36f9fbee64e5dde8d6e0723454f388e71e1db GIT binary patch literal 70201 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 Mcr6c;ef#l$0S0%;{r~^~ literal 0 HcmV?d00001 diff --git a/docs/image/yocto/conf_layer_conf.png b/docs/image/yocto/conf_layer_conf.png new file mode 100755 index 0000000000000000000000000000000000000000..52ce6750ec353a14e176e00785bb556d70b79b81 GIT binary patch literal 34820 zcmb@tWmH^2)2KVR4-gy%clU(Bo#1XExVyXSkU+5Dn&9s4?iPZ(ySsD9``&xjU3abX z{W?Ep_u6}=cUO0HRXttZ^G!)X3JsYM82|vFNq-hs0RUhO0RSj6MCkWx-{msN`xj8o zDpI0=@^R3?`wgtQh`a~@P!)~xYzX&$kL2)K+Zg}=_Wb)m4cHf&0058_X>k!X551EN zdAB1b^nex?*1@A8EB+>w{Z`eizny2!&vOnzY?o$xkL$H{(k5R&0&ggTHSWoDuOU?L0i{zdY@8Ku3xJ4>oR5_iYw~ zCq2>&BKRz0Q&Hi)(fO=7ev&makPIN#HG#EHxIOm+zIx(4{o54Yc-SsCZL*n=DDaw# zYF?;YWhP-Vy8Zk2q;?0~t4EOJ9(Mr&?kdSw%1O^g{uV=izj2ROjYR$LJy(PPLkD*T zdz8!8#85${v|LpAw|j=(RzXNJ=?U9*Y+j9)CjB9r$LW#a3QSy_OyqHwKH`CtKSN}* z@?)&IV+ARc(47eWut-n?0t0=ElRf(CJn5TvPex<^m7>JE&@q17-;j_AdP_qI9?ptsI_ySpyIWBP9^yowv2+54ii4;PGF%P8(BS*=NxKN)2o8l4WT(!-^? zG_v|-v7AYVJO4uQVn^djLoX2lP&j-(-`?@dRr%q^�lp8h-0S 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
2ngAsMZA;9#rJ8hBf1zQY2SUOVa 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≀xz@bFQS4ry9XjQoA0sw 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�(R?AoPm92`mzaRGj^aKz8aO;Uq9oyUI4 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

7SmeGEkt$2AqN! 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

tP&tSUE2a(A~VxEqz%h;(C}?~`GE)-O-J zp_0+z^{x88Stg+A(9)u!84ErepOE#x7%kPs9G6Vp;-a4q{PHg@=$)XSsOZuOXkYz} zDa@MH7pBvz+y6<@EoioX;@JKR{Kt#Oj$gNyldNBgOaCzQLM_Lu9}>$;Z@ze{99(yF zTc?Xw;U=fr6E+sjN~w>Xem{^6GQ24jvFaJtF8`CQ)t#rpxK&Qha@>UyF_=_R&X$ya zNTo3r>m6fz>LcO?nJgX|oOmM7$$QvS9KhwYcH|SsP*aMO|JcOvDuP^&XwPd@mzF`U zJtMWKf-}-9=P*9N$V&-nPo!2JNE!;&HHuPczsq%Ag=3(8kzh$$)as+{PVv7uX}66% zQ>fg*3C62DgNl27bjdmJO-p@~-th$OCh;o=^mV^K;02;I&ZQ+HCXK|6-EA;#isOpPDta&ZW#`W1<#TqneSUaLpqfeee5duyIwg$^RNq^Dj zUcd9c8#f_Qz7CYS^KUZbhtlfwU#sM(U~bgUe*F{&dHLd%<>l^Sq-tfkYHhU`Ycjhg zYF_y;R(0{sgRI&YH9&xdUBWbgQk&6kldvjLl9a*H;?r|3xg%dmv zwjLQqN4zggNwt9PN$kHddneh>$J;e?F0t=G=jPGu`0VNQd?`sFiQPaC^@iNLAZ;4e zeIWNo^Z8T0?q(R-MX!d_dinDoRg%Me-$H-{wY-@CmCOVaBcPhqCmrV(YqoKQ$XDH( zedrHg&u4WB0%o1w+>`Cx+b(~MpFZ=+$(8W0f#bkFs|$8XS|n8D+QLvhmxo2`PCB3L z{qj}arjVR&jl0|Bth{Uvo$Ja@7gbjSN{X?8&-@=coj!S+3%j=V9?ts|pweWu>6+vg z(qt%blG~hc7l`~_P`7Un>`ZktGf1A7K;^y!^)+us1pN|4jU#*4yVOGn^TjzYVr#N} zR|wD6e;D!xo^z0=bU^A>2or%S<+=?;7~QfJ+8Ce<;P1zAB{kj2O>n{VmWbPvqDgx4 z|Ds{q;@^w`2<}K;{Hze_n`-j{4e$;3^H19W10#0jcma4x@4)=6Z{b2IK=sNGX(Li->?KLH3 z%{11(=D*^`OjdU8DK2^)RB+{L)boRL>J)NYOs7%3*Uj*``ZKE$_2&%?^F9o`a;)jE z|JOF)ow|eOq0DbJ6*ACwnFr0ZT&xUDOiY3!?^!>@tbC4#z(lVy^Yin^2HIg0F{ie+ z1f)5YsfatgtKNy@z_2sY1cxmciF}OIcz_Y$l3$esY2;p-fCG8FZC&98ut4LTw8>H2 zPupL6Hb%q5sgZRE?gf>zex@?A(~gS@Q%oF}TzR!NmyoK~QnKJY`7W~`X%2=v%UR*V zEi1u!UCfQMmjX=2h>BSu6OY_n&7szR0o~ZsBYKsN!co)!tf1->nVO4;c+eMcjpF`B zqyLhG(!g<3;?MU!*-N71CCA#MI!q776-Az|0dkiUrcaMPisXfy&et#Taaa2O{p=_8 zlVuu*oS(f`si}Oc(>+pm?JP4t+(D%J{p#5akL$UVpd9NEp;dtNzXwmWJxH+LPeI2_ z4p0InZ;x-DO}v=F9#~ur6l82t|STS?V!VI7O0kE zh!VYERURRMQ1u0mu2Zj6Qfn4ucDL^aD^x2;*PXuoyPp3WTEDSvaN<&+BZWtIp0 z<`H4_huQqXx+rci0@Z1R@Db^ZMc1j?^1=?YJ5(k3)89SJSE`+omzNicgxATHY>|g> zrsX7?x4Fup*K9Sy6?J+t*YZ?F)$f}qq65cY`9$wePGh$hxB`MDKUy#C8Iv8@>;dtR zUGMws!Lb*5L`jhvigsAjH&IP0345}b}C1)Wa)ZAyhg3;mO^3YM4oUq zQ(HK_)bu$ZxP3-bGxREev8JrLtO03m2s`?#9KwUn-wb0~m8*Td4-$E8hR+!xA{h?u zO{9J19NQjXBO7#&{=rh%NA#=x5r578BU`OWcz7_do{K(!^ar7v+o?Po`YNH9sE*AVkP%t@BLFXIYxhiyj2`_eIv{~sv4K>kA7vSilS!*B)KIsTdB718cG^}AYg-#U+bG^yS9yl8m6TZZvp0Bb zbTl!69*G*laq6n8#W_D@Jjr`8t5-;55)U2dD3W;9FyLt&6xG5JHe0`UL#^= z{;sqhd`VuqAtfkW_zGy{iX#hMVrY@z==g_1+gx!D&rfzKXz{|_KeQ|GC_lk}9HD2_w$5Vstlf4Wdvh#a z6JvDV1M4q~tcF{cHf*R(4{|tQN+ew7eTTLN<=kC$(?^Wd+K(T~4v@w%(jW#-c~~vz zGDZhrAN6#8&&8D6UvIXbQas||uc&$_3?#ij_DR-E-($*VMDBX(-Hsd|Ds0cMCe!WH zq8&!2->!7B6<;LF0r#g?#zhAQ+67yk8MAPR){$AO%fZvRJ{Ec3BR*}Uq86cF+W2nt z+`?dSfR#$9Z=4^JD!QTc!YFhxqnHGctDC>FNNu!=_U;~#c)_`z>#VTvL2T&y>+r6# zXtJ{m?gJ$B4_gVdu<>Hw=#fp=%~DIQ6dTf71Pm6dhVUwQ=wUIL{BWM0hI;4r9JUnH z`V}>(ezALL$fPppOt95E*hOgp3+?7S9gu9~CI0u11__Biy^$oi(%tC;kzlCtvg*#A z^s1v4lY~X{7d={lH6b&EtYFqtGZkmU5f)r_GKu*XtEI~p>?yGZxSXZZKnq_l$lWy| zf69o>UAzp9D(^BJ=))=YpmoR?BlU}#(s|$Be*w0mmZ%+`4KdcKKZ2~EiInb6{#eMU zJ7J#KL=Rh1UFg`ZbbTYucw|`rTK_Y%{-CVejmI!f@a5qfM&0+VmnMjRVrHo=V7%%X z>XiA&3t64YmY6br^EQpQ)1I)r`Mo~+(%Qw%+AnhB?<=3%!8h$?J^jwj zEjNX7WZ0d2f;Z(_?k((IkY(@IBk61QpkYsU6VgHM2>mUrT-FB+_?>EFk09eB+A2o+ zqy9jbW+&O+x#LSIQuUzYWM!nMM-82#g{|^Jx4C~8jnwa@4U}e1N~GkO=J2IuC(!^2 zBwSysLrs22(+YVWA(Z(LJ{)M#7<43f{%}~TZ_VN|Rakzhj~fBFpz5_C85SD<8w}D0!pXoFqF-qMb0v9p}X~9qFP9E}X}5 z+mmZndfdhzMba&-v?0>bzn-`vrrwLHcYmX{4@v525)>xVJ(9W`Go@C&`KeCPU5#fE z^P$5wxfEar(9uzcEFxcemTG0z@niM1-@BiOqDaI`?~WYw)^Fv~W`+$8Z2+>-3Air6 z81cB5w6cQ{Un>7XPej~*lMb2uxudZhC)G3B|5o-$+sBS3VShvH=D_Q~TxY_5UC-)2 z{Q;>iN7}X*@@0dtOyQJ;h5;^t+fDm>K=ptgszFW=xsD&R`8-npSK4Q{H2KHqh>`wU zRYmHTHt=0EnPLoSvo%Wn$;vUB;z<*3hix3QFy!cG<1 zfkQj`_pp0r4*%wi3f#@qb#?grnD>&n4i@MdsVw6(erd%B_F&q*Mg@6O+kwB4bsweD zblo1gU^SN~u$`fPoU>zeQ(}HyhJ^7{MKX9r`2AWgAp+nC10<2@9Dmrv9t}q!l~N)z zr|JlgvWJsrJz*@iF)RuwkW$cwEGL)6v;C&g9S!3n1>LlKRq~uKWm#nJ z&N(tx<8@Tc;EO8JC5Mlj8jgqn1g-ld6{lW1EiNZ;;5X)_F25lQB+C@6fX@(qq}N3c zw2aC1!(Ej_FVJso;_?!en{{b-rk)#&0lF6B;SZ(=(Mko|Ds&~W$z*bAXP(4z?&#UZ zkOB|wD_^Bnr~Sb-qRwfj)5$Tn%&1fFwePML;C7jpW@lDwr^R-iq5bcgey;I<$AD#X5vLnGwYj**{yRfj3b=116gS$9h5B1lvkBr13A64wvw-k0v>s!8*g?BC=6^r+}h;kJhhKk8ir+|8N*|bptE;pRfwkB-+KQD9KswA?|pPMC()c&!13iX+rf|!uJt*pYT1TE;8uTqo7iwmKn`esXseN5P1 z-8=(X^k|fc`9%$>HT<*zKz9mDBk$=Qd_oFwe_`vS(}rdQRrprbhbial`5Sqf>NpDf zr`!@W8Pfpm(kf^il79Hr7|eTBVdC$3!Yb-?@q}I#l&R1dF|%ikBdpp&!MQv9T%t1k zWm~rN{{HXf11+I+2QU4Bl>RfRV_>O&|9y0!<=OEg`$;=xj$i#MtMFRuia~$ZzkeS( zg+Cd1CEe^UERt$EH)d&>2X&4dpAk(ofc@6;n|e&~4W)!q5qwQ+$Wp|vqK%4jOT}y1 z&>nT`ht`IytMGBY52yUCs&*q;u)8J8mBKbIvBz@n)pzry3yhS_AovQ8hakO}YD-%3 zBz)z`I41auxV2+vR%3_v6mEw9dftHTGyX$otYL)cM^h0E@-|#LXE~lex^Wu;gs|@X z=ek0fTr6W)3kRBr9hol8ZuI&Px7KAExOT{S{&A(Rh)X6k_&qx%3Q zZy;Q-#2Izg5x6&hhK2L0S0V#H}wlM%*q*o?gV% z8_Py$y0~@Bl>dupC93uXvvJ}iHZ79JDaI0lcnMw!ArC{Fi&blNCo$bl9);Q+>AS_B|ZT zc6Io3an2FWnpIq?c=@$_)Z$}uRD%fl`u3@OthH<7NU-@q^`gsd6Zfr&K^5H=mRhzP zOJwr|KDIt?@uigrX9{KGjX1a@elQlV<#HcY&25h{58X5sfxyFbmOlu=R8gwCpUxPb z3h6>knQdbEk-{G*hNpHfGI8|ach-z8AnSvFyUch*F--*{!fRuUgGPsAy1$n=Q>%@G z>HZRH07&37mooCJ{n`mHP~3U01`5>;_mOkwXCL0RE1{P zo7qoDa4J*mIEpk*)%Z-(ZS+x{(T$yOwm`858}fE2#JU!dFkZubTVYm5^<)rboFgj9 z{00|n?*yGX-dA^?s#=T3ay3!VP~q9J23VnZ^GQAb9bYNV3EqTq9wuT?#o`58Jm0;9 zCYftOWK7iE&yM>My73}$he%k%Hv`pCgD2|yiE(};apAlHMxA5CFCVgD^ z{eeDxm;TW!IWwJEj6B#xz#P>OwV5nf`{fHp%)hI-S}-}d1<|e zo!O3I=O_jvx0_`wAK6Nfox55GT*UDxIOEYb$yR zpxi7`Ym*sEQZG+yQu`u#J{CwM){PeJWbW$(~1QL8UcE~du zTCXv(#QwiHL00ljdBg#S{UPCVA8(d8j7)cqOe}**g9l!JPF~sV^k(R}&0gcZrh@_; zQxrl1B2CKYkmvOl8cYTUr|$)4$z>_89GxxNlGA8)%KQ6@hxfNUJL!VuZb~!vq|Y6f zGu-^7i2Pfc6$Q1{#=kB$Y8+T~KObaf+}8*RY;!itGWeCZNTME2;{T}48u_9;mu2cW zw`(OU_OQ>L=cOlnq((c4^GPcR#IL6}mm-_GDh?^nJtRBoYVO;tM^=w8qxFtnN&l99 z3Kn#Hxgn7eLK>&$R|p+R?S_uvhrRp)Qy+;viK_)aQlY8&*8XnPe05|RZ|KudjgP+r zqmmb|+gKQ_(%WG25bjV=Z4+OJf1L#Aq&mN`a6g4%Zpe+z6Wq@!7BK!N?SNsIi0L<+ zkmX|oACmncyn4xE;|IU<%0IT%9Yh=m-aoe=QJSB5>DdRF$N{KM_{^@Wmu^v=)>1<3 zy+fe~Okh;V`RUe&i*t6z6lcSJoqw=oG52mSac`Ar^{Z-+T>Bow>i$i_&`jB2eog;a zpX?l5-Z5KlG$m1JOLZUXs^}SWJ*HMr=B{&^j6bX4_bb~xX$BGI!|soLkdM$Q)e?NF z?y(JARYZG%=E|}Cv8ls<7Fg<#WQ5rr-ws#jDMRll`8U4ZUntF;pIMWlq?Le3cl^G+ zKEbE=AaT4CLEe8FMAM4d6TUEYrTU6E+8BNXLzy3DBwjG9q44VeYvRy)${eqWb zOoAH(T2iQpc_8>pbjr~(fQdt-S2Se?x9lw8^yLvaeT7*>8<*b#C=DO?eZ;+proG{- z@&Cwm?*H6h z{L281Ls?!iZd`-3AOib>c9% zs1XTYn=Kq?=_9Qw;wMFkTLFBLD3SE4>5k)@FW;R`WpTF4Dh9CnJEOKYPVl9n#)E$m z*W#SguF~l&23y`hkxogICe}^#K57a%aBNP^d{F!BnxTU5-h8xeDhI1xU`pO<)D&he zT>cg5id*`5lpy-&7mo8Gng6)GX9Qm{66mIj^M9~hJ5GX=AZA&JmhpTiehS3e>h<{$ z>HKPe?jjy#7*g02!U+=5d~Vir*zZ1} zb*lfeaz)*K>i*B(O=eK$tqW;2CtEWmD}O-GCoso0vtCvYte?h~l%I$Fc<(%=+W9`UyKWQ~Ry2Zh<}-={In}d`bxc?p32Vc6s)D zN-}Hje-V$?6!FKQ#iPSLZeFtaDqA7#vTEbr+rcXb;pG0^e5^qUW0;x;4tXdLBqu8} z;DUB+_{3K58Uo%vIL~i_Dvsu4>Qsm1nRR>O9;R4E1`4emY?tF$xkva7Go2i`VplcO z9Yf!W<%EkUoJawubCl$`x?fl%1t15v^Fu^1M}`0qhl^&Twm?>K@5CE?pQweHBHvy$ zW>B(Oy#RzA9%0^e=#77O@5&1F6r<2PdGN5zwn{Dcw@T`3j3wafWVVq-|9 z_~*1Qztc`(v{O_(QZ~GF1Sx%CF*nXj6evo#Y{&Lj=&n{CB_aeL6Y{WY8}enG6}fRm zB`N68(+@{o@ud3kj0a0Kj>sW zoF`%@X7ku3Sz4GJg&us?nmtyX8Qtq}w{B~-c%453;F?ouZwl^Ph9lC%U(3Jo$;vX) z*1N}MCi_(RrC%^?<0zG-z2WIJDh~B(FR@HE2RN2Z<;H{&bS; z;uJ=6gRQJsfj10$>~7*6^3HnP6T9*(&pd7riQT>`s>#N%-4wKHxH+cn#GsBK5#KbK zZL6SFm1V(uDc;QV*JQC%G9l4Xg-w-l*0JK(>--FZVut2y4+a##1S6}Pf~~@r6Lj~e zDp^3d9{tQp0|xSa)7C^)#H%o1vAB_6RWKIYmYBGQOV!#i`iW>3vzp||lSgykojzqQ?ztB4YyR#6wbCdsRw*UdEkW)rBhygs&qQ9NM&PBOI~ z`ekNX2V0`$ud`a*3X|j2{|kL~v@N_+Q7^YK-5haMe5N9!c>Cc6&xQP8*a7P;pNmur z-0LFfbWG`@v0=y@#R^|U{CZP`5a`epGJEROyL4x&AXeKQBG)=~b*z}noOwP5C|ApP zyU=gn*HT9dx^sfjuJuE>1Q;S82Aa{hNVPU znYR+HRrHLW096}Dw@sL#nM4>1I{xIJ#Wzj2XB~$V`hR|Hn6Ip5Rr! zsW?}>kXypexyvP8dT%BkyCOnu0H-bW+Dg;Y77Tw&ezRl?%8|1T4~bB%Im5U+YMs~b zZ(Z$|E}kz2qUag?5@q9&9%}4&Vo-~j+t|?kB)0b)ib7SxY}tr77;_vQ-NV6WQQaYS ziDkRKKjCiqz}dFNj#wC58ClcsQWg0s?(#N5B=R9cM*`Cfd)3x96K>;v{JcOw4LgW* zI~7KUtuW12aT~V|@ai?(e!p`@ZDlAsOK=^O87g0L)0yq>cE?s@BAmfHrkl8WcX=5eMB={kB#GX9kL1nA&kZq>~l@j5!=M zH`TQ+hnrl!K!6X+h|-eh7|!-CL1~_Q75%de=2A!1ySW&yXH7e;Nf?oJ6z(U|7iG@# zI5Z7^hAnlsXu9JBzkgj5a>Y2~0edPE!*Rvbk%oMFgh>C#uS4iqPJiD3A;;%jy<9=LhRQ~NSfA%ux z6ykuaNAB|(r&-4yBl)&-ZMd`Qro+eg;9vhcXXF}|a{TV4%G^Kxwa(HEuMd4IcX3h6 zc-z#bt8?8o&=F{U%8!5btm$nsAWfdn(z6qbHsK=SU{GKYb}*SMymc_nZav65axr)9 zYEa}8gIQjdfgq*l$IH!?0qwX}MLYC9n%|-FZ^mnzb1hawzMiBwW-)pE$yXQAuwKaFSp<=)n!9m zAAl@<@|(7MPdHDUuz)`(5ihz7un9CaF8=x7^*p*IAJ@*~V3QRXJvy!rtOsxfZgss| zoYern@4yBJ)Z_60MdU@p%QN#J6qDZ6m3tys+w4F|&yOzUW}TP+ zVo3@x^{vmv1TTh9aT>X`>NKM*pn<9T{DE>bZeL4Q**K8;Fcs%))s>zyOl4I-|DJC~lyiiaI8yb-QuUxL~X`vyOIho#i=~MpxG@0PD`@ zfI}Fy?Gp^EZRKP?x}Bd67G)A!$=fxV-I|5VGpU^*B4`ML%@b~s6mBl;TZG6METF$C zpJWtAQkO>S28qZ8Em8Yg4ue-WG*OSJj$5lW<>&9DNC$u)PJR-9dvYeqX8V|k)y-gA zx*3gt=L8Jv0;_RPeQC#la7f(+zRbG& z_2M+X*=AX{GH~&@YRKIe%9e{Dz|Ba?ANMDjDmV)BtsYnpSp$>Ki89VOM`+c@pU<FOiX|9+om?PpN*9Jy;j7=p5UK3J|Xm8s)*Lj?`X$x zl>NJ^&>wW4_8FPW2II0E<2s1tAs>Lm@jW7PKp0p0X%L z>Iyk$m@cr-3AU~dFX1dw*Kz*FBbp`Ds^Rj9z=9EM_trq^4BsGGVYJN85wA|y-+anN zcO(0e2wv4BVPi5@)De)(X{nqPWpS{g{u%Q`(3IXnE?&3X^FGKFN^AmxD!PNly-~P; zLQ8tz_ayebv?RN;cn$bjWY8q0r&W)qRbh{(5tcattJC}}n}@l|aK>_B2BW6qBlZ5` zEJF_IHe{qcy6wQKMl0?kZ=U zdtRtM;>ih2KuS|XNMhVvKV+Du_$Qzvj{FX=G(?io1GdMl~)SoBeyN z4fhQB=I9-#=Qm%D1Fyl8PjsW|!|IO`4@l@8yK%Ik{cxPrMi-WXPzlL;Hw^7Fq4`<} zuz@enLe*Js1DIWM)pxOuoo6(=^CSn`-k5{*H^V{Dxf~^+s`lE;dc%uLBL#^o z-WQvv+mj&x3vU@0qjYhl#A@vf1LNcDecay2DmlZLQIr&W z^hnjB89Yv-;nnWm-pl4g`8m*{?;Hz*p1FLIVlCSpo=<&n(E4i~#Ez>3M2Fi9_%S5X z@*s}>aMjvj+Bg2#OaPtEkG8O1(2%N))1q-VDC?gO$lw^c>eryXfmthW0@J%*zTqE+ zpz5ObG;II-%YqZ8TPwbloKkzQ^9Sd3cxB6!g~^YpL6dvSHjsj^ro-^(JkH{Jw7J9* zCjrM*G>e&wowYiL@cS%I$IgtZg9R5E9Y+6$wfBr_a%Hg`XImV2)ni2?MzaE<8V$x8{gu6K{~qziqMkdRo){Uho_gxA9UPf@u? zn-leceYhfdZ9IHO>Hb}roN4Y2M%S=h^4&-d9_E(HO)T0@Xj#803JJ=HCU3ViDXR4K zV;Z&G2e6X6(fZlrDvkqjJDn8zMb0sSdle30XrNH02B<&#`SVMJlDwOne6@yvs~{^DzhC^aB#ThytYZJ(vQuko3X`e!{rKlvp*m4qkU86b#rkZZ3Q0Dy!$KG*fmF+tjdD#it7ej<3(Efg%r3%QPO zl=&^B?N#WNNlN`QSo9zG1Yr-MF=&26FHk?^W4wC1u*m=Ar=h%Fk;)waraY>3QQ;J} z7S1myfRzjHY#;maDxjWD5U$q`_>hpUGM%5nAnqSBhFh7SMBUQ}5%wl!FZvuVBbuwO z3XneS&6{5A!M#p5+7SX?O1h?m#^WL7K<>n7MKl;5>!q3;B9F;;wF;qeNBhc^J+s^6 zcLqb=O#U4u2k(c^MCV92n4E|=$~o?i*j20Fx+inhTtUl1mPRYTm(sK3!Z8x7 z-+RbQq;Z#@@0>-H9I|I_A;p@AIt>uzY&8(+`Z_jcSambt$*6xuzmDqqM%px*xVii! zL&e?`tjxL+W6ZWDc|#H8d^!P@7jUG9sGhGG5YUr-6w=C(T=x5&ULl(s+_s(CnSQg; zoRdbFOJsUykLnxjY^wL^Z~dY(97PGYI`Rvhy3>Sn-<5le%~=L&v+doeQk? zAwe+ULLu#_qsqdU*XAXrV*x$7o!gL+Hxr7WM)Rcl3vco_tPcP}TQq-P`|FKT?-9)_Jc0>Q8Kp-d5A#qN)LYeGm~wV(T2S8^hve9ankX8!6rBmsgV zd=MegTZZ))`yrytTdfixUn;Zf#nHqyg;sXY3uw^;y=)U^qsTl|hOiORYiZi>8tkvt z3kK^qmn+INUXLBX6n{9*D@vVVt@xzR#eG)wM41v-Aml*TY5g)@HbZ?&q;L_kp&(Ypvsb{P5*=O?2Xs~$vU6!~n|LW?P3^iHKcQ-#)Z9hm&;P$KDYsP>Yoi$#!X}*fLY{JMTNa$(yj*riO9WbJ~{lJ~H5g);4^y=$SftZ1Y#ISvmgo@??LFLr3* z8&NsGY4McwXp9-aignfBvqvkw{}`rrv_Qmz#t5(TIp0s08i|~kHj-?%0-g{OH&|)x zhl^C+-9;;}$E*DMek8c{6{okn3{p}H>c6i5 zd2&-_Hz=~{^Bm#+c3XO>QqbF<+h4|7|EB?P=)no^n~Upat{Z6F&J0a>RXh7Pvx=`_ z{1t>LUZV8m?a!ZrW0nB5)W757^9@!+<1#dqSTnRMo_z^Tq%S^pq!r-V9n2T*z_)us z&!23ZxErlP9m)%ig#Q55o7^dT=GLHJyRM7krHK&A`$C5GzCgX5ur5C?+61mX+A@ef z&nKq-$kVn77o-R-s&9%uT%N%S8VdGz-mMrQg&qyWm+e|;lJ>Cl7-b~rGm>L5C3bf!*?)a zo6haG_9nH-hbAr(j8QQ7fzp&{_RB$VqO0b#9^Dj2*Ylv~V@{tlQ!ZP&+2nAuW;d(q6!f9;*?2$^q}44$ z%A>Ak^m6U1xI!s1zUQ&_HK5$)cwB?23;BlHx6qxi8yD{|0;qa7BoXq17Z?-N^2jP&atb8_kVAly0XNqEh#eiwqh0)wKjEIX7j+HH?-e7-Mr%- zRnTXeA?BHu0Cxiy+Rfo84@MOW6g?aJpP9^|JVGc3CeV%FLFCn+bh4sng{d5;fMXRO z)lGbjx7Is`BW%1SBPfGwzpvU^2K!LbZv)xGKK?nDNH)93vP1Ro!4_*ietx#*_gL~< zfFAXA97--S-X!!U=)N(GfslLsiLn6IPCKwNj3oD4nLh9Vj*C`?CM>ol%4f7t6(b8v zw2hs#QNna_5y74i6>P=Fxzd#3=Nw0f=$1xL5d4cNHFsxjsUh2%xYOQx_Z!Xd{Kxuo zFWSNeXKAJ5VCdipok?M_APWjg>ZC0a*4HlwdB;82tZKCtdKq0n-alIzr+pQ7J6Vz< z?C)kR5?*)yh8l@)()f%Z8joo(73p;JZnNsiu5@caE_mJrgHMZm8frM=K3_dCq!CQ~ z0#*^m?AD5W#&G*ZddG^ArLd*x3JgKluGqh3Sw3 z(1n-1<4;WC%}07>Yx^rU_S0tx&f2nah?6_(!xH(!4syjSti0P<$8^VKINC`Q-X{L_ z&f`b?q35F#SxaH&Jwlh}E>Wzae~@534!bVnMsI3{^?&&M2$gp2CyH=oiT9o+V<*N7 ziCI1O$~2ja*qH6*Bs)jfx8)a|jm0e|1(lB@*hn}vZglf_Fjr{Zg>kha#;HYJ`kzym zPR_tDbZ*$_{sswskt(s|3O6-nAXn6uG)}UFnxvEqz89P*--&;n0QSqGRhpJ%C?{f* z5Q$OX^UOEj)R?fyS;&(G&BTtyy+txYKaZoGI^<%|tG@;uLe6hVea~H+ma{B$nH`}9 z7R{g!peyKWAbxpcN8R~)siPEvFBFL;ap6oHay{-Rf7=#XnQ_PSzf^IG_0G#$U0XC+4HbcSP0$ zZy&!%RTh!^T?><&$>ZqnYjZR>^!bvgjr@0e7gOp=Z4P60I|6&+3T#<;pf-HCl>QKd5cAZR-yC( zrPQ@AAjCGZfmXL+7S(ma)ndy9(Lc2v)x=@VxwXzc)v+HnWc7dVKabNONV%xX2hJ$y9U9j zt=~JYD{r+ji@G>okmvptjTogxQ2NnrKZ;(vH(Xn7vc@wg-+uNC}H3Um%0ss&Q4a1RLjiXd>l*jaLp*fxVnrR!UthIsFC7h zw_*(U`o}nmG1-Aw&V|lywt=@94-(w1s{oq2;AbZP+DooK0PU9NAmncQ26>^A3nfRG z4ZTTh#oie_fFktH`<02|S^m5tC}XrKu;&J5)t?Z*1gatXd>Sk?h~@)?dS;9~)0;9k zO z09=SnmfQ#K4XbjFaMO+k0cYPy66iRp75@j_Z(Bk6*)Q7g_aoz1fdpXKt$RO5)Fl1H zgTt$a*56gFo9;E9pH7>O)$o7xIq16{F~tw4cH1*rq2s7>KRMo1KviyL`xgRgw9%sd z`0ivP5Bg|)O=d0(*Xg!&8BI_7uNwt$Sp$yUnG6lbQg_#qDwlUv)g>b0)$UbQ%5oJ$ zJ1MT7ni)TF8S6sE&d@ac8s?3jY-tt#dy|Gn~DZM_Rl>Zy^AJ^}6 z?SpC;Y*oRyXK5kSv-HXG8FA(9te)QYJDeJxF{b#dY`1Q%_oUAPYx=>zUP+@rWk%Ki zQgg9MEBxqGlC+S}Rb9H=ko9jV+TI81htT{VPJUYvOdpWGw^&4%;Z#ebzrOOo5?bvY z>Nl2#0w-Hq_LmbOV$n)q@;+C0dsk)E@3xA-)cor>!e1YppdW>~d)WR6c#VWdHuW}~ za#bXF>g7MV95&;!ao(3zK1}ihPvX~)ikXJ@z)0j+f(@L=0d~TD|P4P3~_Ka6B@tZS^ z*rmlW+xIGwqDUieY-^)vJ=KCka(du`?XlE>e5ivZ5@N z8OG;xaOgcByW>XyGX*RV;JK^is>P_WH4Ds$Y+%RTcir{XYX2AZ1q`Ui12}Q}kG=}3 zx$ipE0*FIHRebeVT54`uYS4Z-|I$;$hF&8H;6OGfYKB^BtX&a=l#h>>)E;^~hCcRv zAd{f1`M*7fqa^^vRJwoV%Yph5B?{P8ODi^uHCr@M&Etcgm=M;Ts=2f}PB(ScLM<|a z-lnLfZiW7Qj~?Ut-(I)B-%JKwdCA!M?cv(Z?pHk#Osg2WDUSVf6jn8`0dJUaB#P;L!Rc4u|{u{qePT$+O~>$XbKe-{aeF4+Q+jW4<3B~@OlD=DvI zRQ6^v_6tb~C@}C{HBi~}eEt{vNFGc>C{D z!1F@cK&ZvZRHS0)txHP?WkZVNt24gYJFC!bDoT_7A0vvO#~rlqi?$%D!?3=g6ZG|b z&s-<5fsUV#pP2f-+>5;YXH*A=bIn%kydm?&KZnv#TX@VWXrge`vDz2+6RR*b`9JSY ztp(nlLi}klbYIJFI-;qe>|ux2(EXb4zga&${%7j6;ljX!xx}9XL-!SeS&>bdG6A%z zA?EqVAgR^=3miqbg1B%FZna)LZfplv6C8!wu$BTY9CxjDdH3^cSeeED$*2wg1&rv( zH%%ktx4?ex+2D1JGkOyP%PPM<_q*Me_+RVb03n;Q%b*?`*MV!UCXJrY@b=79Nc(*o zt3|`T9rZuMdXE7&Ubxm_IcwL>;vNgER%Fv)CjF4>lJyf`?@zzp{rlYBe}t3^iT`P< z_^V?4zJl1Np@DaPoYhuWG~c_Wakrr}ROSECUu_*=CFw_COUokiU34!HmMtFy(3Omp2FQA1*3z@f zZ?aF!jqJ2EEW6sRr5SgKLgS!n)Sf-SBJi3r0HwOO7UYb(AD#F#SFY>NFD1!i=uw$6 z!L7prhb9u=wlUjbn9mlmLLyKrGioPxbnPGUB3uvr9Yw&aQW$iyFTk<#EH04z`{$R< zn&6!pAnkN&=HLVn!uwedg!xQ=cG_)z_E@-@k*f*$(P>eisI@U@G4>Wjb{yoY^O64h zJNIy3!vBnU@IgnSta8BW%(9un;UhSs0p2ecpP90|5%1u*gu2p5BU@XAmo32c8V&!_ocuQ zKzV%{ZgZFK9^9l*3dF{|w|?f@z2SXz#bMRN*C>9)+) zA@|s(kr(oA#&qz1qMb+275@`igg-fZYR$>Rp4p!Qfaw*+`mY_~6RYe+%_;1$@Owo5 zM-3zBum6^3THOJN5^vJuf*T~6n;k%AUehz=kQ54L-x$YTeLZ)5xts_U5TXh_!y@tc#dlZ0W|=1`u{#jkUS1_z5v|N zH$OgF{nFYR9oYU>{o=(7kA03%mUN=~(ib3Wm&nnWA_9pjZb z7y3cJsTU~DXCWge>vtH^K)pdidtK8>{KmJRU!G`uqeTNC{&!EZDvB%$eU%aE%I=?m z1`B?!k;mOo73&HOJ7ctJQp225HK0ipl{U?X=oTK8XB{FPh@4+}h6%r&Xlt&KZ1&uSr#3es%dmGIRFQsM5rq?6CL2W3#ydwE3sOJ$XD ze@CJxgz~_xryS5CWVAgkkW{bkBtVecnEDRdzH~!uV7OejO;k@5 zmnAtD#xX+PLa*8#*+@-))(}ySq;3cPG4zgjqP^5+hzki{m92?wCcztUEBov(5NitZ zFnvQbo{HTJ`O22vV$FP#c9}R~y`8V9!bskrgOA5Xy*Ajwzl;6#YDdok05@`G4Bjlg7^Wmjh* zsXH5qk})4ccWjd+?QbsJU#Xgy$!Z2W=FP^B!kJagu&v%T{QwW1_M~95w`*j@er@+hA#(a(Jy*v$E&78$gw}*(#6e z6ANb1d&JkHPF?v-$qFj7SsV$CiS~Rv{p3L|+2P>q!sG9TzxD~gFYa~<<#|-M(9=v% z_V7Ros~-uTW-NHeng?5w83mvT<8-r;WCX~?yu1T+z0Kv?(2s*t61MV<+PtX7JKe5z z%8RQhFFA`WT`5F!q*B_)iD#Mm^D;5LB*SHq8HY!Y2T!jhd-U`;Hu(Y%TR$2mmmCD-XoxB2XiFbCL$+gq*; z%VNul?^>kQI$G}oFJ3QPP_jzOjlXWcAhJ#Sux|G*Hj|Lp>3Kg{SU$g9OH$<&$&RUE zd=$)tBMwoN+1CKItmoW{P*0Y(|GVGE)(15WzvW6;FmphX*$IIj9J&Bt3j^huqQ@5PGOW^6xGV}KHLW{_GL|!&C)moM#qSho7er|2^ zEXJ4U5OLK*9=o<XEOKiC24=IYMnFeWyrHi3}Tuc)7I-ELMnY*l6gMBt(^)9?b~b+)S9 zP~zz5ao6RoOB>U}*wp^didm!nvL?%?U7A=~E}sdZ{3*TXt-L%2+<*f-~l1;2=S3=%Cg8p)E1M9$|OEB~zcm$pY zbltG`7R7rH;E=9gbYyoeIsL&GD>V{{0d(xgH1e|&xScV&Rz4%wG}IM)k%ILu{!lFL z*tY$aFn<+>={0oh+7P6#(d&S$*rqXh=%)ea{k~$>(`yrN#z`yrQc`+|Zx&JJaVhrEqblQ!u<;|hH?=p5X2f4D>wTa5uBZLp>)<)e8}#M@eRY)hg}Bf^n?}{5 z*Mhf6!D(6~yim3XYOw}wOcd`h7dO_+a0#|{v2)CX!x`p33L^Vn`6DQVj?fQ|yBzi= z-|h-uQaPdxymy8(ro!v>Nf0;Z;Xglv9a>so6K@LAE1umv7$Gp|WU-KbQTegkhXs|f zj4zR^CXF}I%!2GYqZi!goo@zE9qZza+c)&>XPQ-#zEb8Ljp|&Uz#TR>@k?leNFIb@ zfPQotk=)XnnYwe~IM!=v`tSySmNR8Wx&F;uf+MI*(-d>9cY%<~Aqz2H*qcceHVIj! z2{Sh`rjOtR_0uevksM^KdSYwCcl~G?^Nt%yzy>tF#vN^V`V@)3BB35GX5Lgh6uEPP z6mfGG-@_sfpO!3(lAd9G^XzaiMUd{uW?vU)L_om=I28Z9cQ9tLec`;{y4h;c>kNBY z#`WF3^D|)NyK>nPh~OoP1J>fT{Pf~w=1t+b7^G>!@U%aprJ}r4WR!avp6~kJeiZJKGfT!R#Au**PY7uJw#}b>!zk&5H%4mH6js_k2Ak3gZF0- z;-K`jrRyA6y(PFMuXAEr()LENsO|B^EDISuUBcYZ>?)u>#MMsr)>DN78 zL?JHyFh&Z-ZAXKZNpHoGa)jf*)*U3>{nVs&EUMjpIsn|uew5CihYueHoaxoyUwTJ! z;~-CAn)J|2XfVzuklp-BX6#S(j869m{CtbZr+cEFGs+!SuYvMq<*?e#g$-Pr){Vb? zLKO06i2U^7koV#ge9WDrYpZuo=;Xa`vOd)vc8@yS;}~JFuzgYB!WoQNp_Ipz0)4h; zTQIC>SL_nhQElV&C6f4dXH_IYb+A1$I)5`-H{dc-Qh!FJCtr9!vdC6(PC+yUgT%p& z^?CwN%CsAnyN^0s-4FMGWW#}dwuC;)=(5Og9kTK;S${h2*-q`Lr^i9C9JaXWijo}} zKM}=m@8se!T@i(+b5brD?|9|9DVBKHt~)rk1C<}800*R)|Kz^(Yfi7P*i?57mD^7Q z$o$^(X5WX4Q8iz917ubnQR8Y}lh3t)f|1QO$vA7E#HZA{B1eJnEsWb8a0xPHZZ)mv z%l`z}0_&~>zLYg^vA?l(ZyA5w_}U&3{oXyZ)V97_a`HG4gj)%V z6$i=N{jR>)5)=^7-2#lMP8g8xB7gsWyGHLc6-?`bErHsCx6GJS_tOQop_jJ@w&hqI!v_!32Gw8*+ z*BNG`7w#FZd-X}nbo3W;!&qHf&5Hnba^-BvU9R>bft#i?Ikby64v7!cYTm^Jo<>h5 zaBCL@Kr2jo;I~YWW>0%-i-P+QIKrxR@);bzMVFR4B6%||f`WTE1F3m6$~X5;IU;%d z@WWmb&&ISGQ?69DXYF*8qcB88;MhWaO4TeuNKA6c7?!63J{W+=ex2zZU2uw$*6W?w zuj15b{afQqz{k}qHHTL|7WWR$w@@G(A0zWgGER&)_e&C@E+q$u(@{wQ=-ne?n9s^c zAN^m15P(bf+4#=Loi<&~nWTLYA55lP5`t)rHSu5PZ)HOoCH<9MUe31N)|t_VUlbFlFDU=eT`4&)DUQ5b>E zOC&1vHliYhu?>5-N$lQ5Ztt@0Et_(MA@Ta`^|NJX-~8ZGvrd}7VZUGzDL2C$Ky#jk zuX8;d$#;l=W~K?UjOIA`FhO%YR7F?!q24>JH5_9Bm&Y#9<20BoqZC86sf5qwK`7Xw z9$9lOH96={mw?KQ>*1}80VJe+=DZeVDQBMQG^3UYqk7A!B-a=d>6%kP7nfVt)F!}l zb(Lb&XpAFnboUwi&grFh!CRTxm0PL{JJR{A;aHAd-Ev?>-zyn& zTGK9P+01iAYEhwAb3p4N5};jII%R3WZzOQ*<8^+{FcI=N9DsKuuM=3?YZ|bFRuuq# zJeJWu&?q^T6|}r?^o!-ni6vlm>-8JGSq$%bpnIAgOUJuo00z}^us6+6eW)^lLT(xS z8wgXlNLz_{H94itn=K%1K6UU#p_Fy)r)HRZF6QF?LZ@-Lll%203xxP;rHCqizz8zL_1@?1YLW=DEU|ZRB~wW^{Q~FiY-2}*?d4p1LWGkCcEif4 zOLRMr2Raa3c}}d1ucwgG=4Yw7ZlZzEpUAIz^F?~Y(G;Bh(fKFzTmfHW-_U+z5l zbZO*CLQ8$vTRe*cm5j z9VbW98Ta>}D?7zXkqOK$ikKJMV?Z;yN)7S6m~r-$8Q}>ii2q`-jxt`~lMGuc*k2U& zhI3F7J*RVx@ZQc)s_R|Um7+@`9vaiS779AuX=+$;?DVM@7}+}plB4TkZ0CqbOBxm z9gLY3U>Y3~BS=6O8kp(^Yj^cMO#0-V82Tt#m&kZ9d%ah-S`(2TB%WA zJJ6l7f>~USFL9-s9m#%CO&>pPNIHs%UdLSbXfume7*Eg?H!)yKoMIB?;vzt=Vt@*#m~8{T{4H}tLWC2fsWQ*obw-aV04whptCAK;2;j(0b% zg!+S1&NCzoy!Pq6mpW+*Z=gGN>5f{Ty7C$u5q*ANd$#5}$DH2L9VP(yAo^=Kgv7B~ zvlVY--(YKrv)o`F1+E$ulAOMiz9@eNHxo)U529L#bzTLvk{fi_g!;YttEgFsE3I+h z;Krkcmgt9;VE!PWTBh*rgID$$L|`M4b6S8NUVmzdyL&GIzJ12y^Y{QqlZYZf=SXa+ z$8(qL;<9c+3D%&&k4*i8a}uE7A88I^)9^d@igw>B6~%da^R&Y0YRqn}Ufl_xWKJ+9 zVAAfZ+K|vjPHWIDMa1tVqpkM%5$k5bN)E>oXTUSnGm+V;#!*1yK5#b+3V2DCD^H4k zapPrt26KewqS{&Qwpsm7T>!DM??H2&VQFp8Vk2pXILU*qod>NgS;U{iy7?klN@mp2qAx+~0Z_t%?v&3(|n1{*2 zT%t!)oCi7|H^$bfN%TCk$RwC6fqdBddT$es0wB9-zp+|NTt3+=CK*9nJ6=vM@Gjh7 z{C15(-PxGJK0W5x8c_dMv77kg)eb$WOF%7h@$w=2v~kIS?b1aJeLz2*5pixzjSFwf z1el`j?C0KOT2*JhqVN5zwbn&`;{`u-+8P`x;E-ExKsD~NHL~56UA8Z>{b4P~Jb)p^ z*v#5^h~Rhn;a_-jCMR4+wc#{4qH0!|ZSv>)eHAaGRL*GYo37vZFp0V^#`7>--6uri z+wl!5p7-EM)_XbaTPG|Tx87xURuNTU;#j1dd0|K*v7^^|d5%n2lgklE*qPVc#YZO{ z)bbSH!E17?PsP9~2c4OQzrcqf_|F*ucKly8UtPFXS3c9+t02y}v1?}S17$2Y^{G<6 z-G7SD>dA~VF^$wJIA96AxO0fBYC1oWF7XG_+lSy#o9Mp#vu}C~y%X zqT=H7>7Ld#2ZKjljffbOh4|HgV-ZgP_c{eDp*n*Z~);KD84iucXpmp5dfs_8GIx-*}Ue^D)vfKF$ zvlagK<+G(3R+RfYeMHinN_Rk6_K6{Lw*+Qt=K;(Y&dNF4CQF@N#=Gj?nAzJZWg4re zXiBn{6)6rmUF8blSeI*1?TBkBaCfXpaQTpqbCIC@BXVcik8OucyV6>rnq~DO1sw=p z3*RcuHUr(@cQi%%q;)Cf$dlCc?6JX8ZKpYb8YsQ!Sl9<;fjk%eAZm)k*AEs+d;}kR zpbWdl^m>8mWgr|57bqv9ut>C0*^P5)Ul(QkTXhHgn5$CYatEP>l>Qj2VHV!xzUV@M zoQ&d)`{f7SKPq2$qYh_yi_>}Rd4Wjj^#NQ?Tf9db!rxXoQZAbR$ShXXf(s0P{OKne5FZ`ct;N3`e|gEn1=VQ%b?)Mx~gem>QN#%d9Zx+aXpu0 zd*sc`dBH^dg~E%Q{Xl_+t_FnSP}=#?!Y775j@x*qb=Nx#gCrevG;dmuyP6@NnHww) zRpDF6(5Mi_w2tcZqw==9V}6F3Yjj|tcl#83D#Ze1b_IssaoborQkXJ)UEcSzB>m#n zcl>3y;){c%W?0BTtbV~7PZkjf7*@uR;%=WpJJ-d25G2O9Qw`V-ZmX#rjtTlj<&``q zhTz(pMVYXQpmtHrkS*VN^WBJSwUy7$E*GwE@wl_^8y3B8R5T6LVvgo1wtwWGJ|u@7 zL8NmkuIliIN@V5S$`(qDkw@O(?YroQk@)rF1WKM*i{Td!2=SF7@h!P@j?VRT7RNNi zLk~Vfy!$8!K)Vo!>PWUgzA?kPm3GT+#UC+6o^i%Pb0oxPkmbb7W(X!cHPmN3z~ zIp?YE-3`&^rg;r-y{R8N21pA(lQ#;?7@w7*O2R@=UPyTg+0{ktzbjE+nGwXZ7|&qi zQeB0~-iVF)UPmW%>yFSydKsEkRQzilNc77swzZOHrv2udDlz>*QX3y=*q->dD^uc&F^Rg7bRTfM9ji+}G|^_`VfWF1aC9eA>cnWO$%QK8&eNBex(zeZ?#6QcRpw`2rnbqj3%uCKamq_? zq^nZ*fvd@s%9J1};y5pGPPf00t|h~DribI>Mr8=0qgqxH?R?u;vbuk6UgT^lV7X>}6)p|IG;X?zb)wN%L1~ zL2r$bw%;n-k=|h5iP+ZymCwBOyPO^Oy;_;o`~U~H>k;3IvyLvF)B$HrM#8#*;ZMi7 z>X7jGL*B{TlqWwD-ZXwaGwIT2m;GQbMqvKm;mi2;*x7mk1_-UyHc5b$B(W!@*!}0{ zR-n(j2hd>b^WVwV44@&!r@ch($7`t5zv3nJ)nROhoh@3;Kq1Vp_g{oY?eY1hb9=~! zGKIS()(^9HS(K$wEE0%TD0_?!2NaIHQ+QH${{NFKK05xsa}lJszub*6uMfT0=Xc^m zV0bP+NwQ8Fuk&h)K^?2tZg{@Dpbba=lM5#aB*?&)8wd}jR*psd!`}pO2np~Cr}x(w zX*A>xG(8-j*lq*Uo<^^fk`_`l&9duI8Y(MU`pip>8i`v*Ly>&Zz4bSN_^VJ<;2@pu zvPcs%nNWx`(bYKntes+vo?${prTJC+2>ewHB<@}6 zwqN7B?YNYm%2ijK?)>p&Al+k-`ZaiUN@sTfX(|^S-O0$+9TV9;41GIS@l-CYR3>tTST49~kPh4&UBy{U&ts1H=)AMZOszkg5Zlv!{EqrJ>S9OFcn3$k z09!mf*)N2(%6C`=+!lQ?*Awx`ip05`vfae^87XaHR4dIqsIaHznFz-_Co!ml3>8y} z(XfgmO9xZl$XwQDn|lBpQMucqxAvxlbfTdp1#oPPe|_2`^Z}Y4yZ!v^G&C{c83$p0 z&|3d~v-)AnVc|1psMW{S5b13qZr=n3ij^&}CVWfIFWX2nk&@KA?io1`j+$MFU>vRn z^(!wFTuu2{dATOO0iM=n#(ZR%M$E8x^Z0q0VR)&Uy|?noIL?DYGoW%jUy_h2IRNYJMW&&IX5GjUG3PNP1XmN z&w9)`xWBdXs)*YV4O1fa3WVDqST|9_<-JLN#&ZB$l%6pEg^~%*wVu13vZ$V~2vz&g zDFk=K4y%bHMGc8C5|8(7nJ`4JjqUCNE8j7XXd+vctCGCHfQysejL-RPO`Kc4Us)f5b7->;2_0&U9T*E7uJ8{_jg9X$tIq za*s*ipM!B^2b1^ZbH9rqm;`i$hOh<7W<9=N7@fW+3GBZGpRrrn0>~tE+WH zsyvpW;1_c{b{C$2*?mvzSGsX;LA(!vId+cfg3;eQQ1F&vG9Kx;;4J`O;$W5Y;Bc%f$|Zj}oNA9DxL$BiUlZ&PT)%PJ^<|YHY5#Zq1rF$a<5t2; zoTDkdmu-NKA(@GKk4pgGLF;ERwMOZ+h_&fF$9($r_Uw6MbzYL$2rRU&(#6OY4Hc(c z1sPLiHrnqc_#8iNXlkur6c^iTxs0;`1*ylrl*f2pD($SpiEj0xX|uG9(cwYa*$i*s zpzG7irCZ$>V!qrVnSQglGpeN(8(s39kKguo-6eLB0kA|vMA&Kst%@8B$G5N!0oeQ8ae)DCpY08yx>W{wJBJYTyuPYshow^~yf{G{XPe!sj#3#xe!jQQ8@ydcFvMBDx~jbAQz}HL(|%_Z&=t~cU&?PjfD_^pS^GwgA7SSqThfSoDO%Y=%z*1L z1oFhrYp@2^8sU0$KKFzpU=E?5RgcKxvdn>#6L4e$0GJl$uQE>=t2m|E#WZj#UlWC( zWR%qpxU%$-N6~d6T<1Cl?c4uevtkh_W)vWD9s+U_84&b{2X1=~sAIk~T>Ht)!>Dd5 z+N-S6Owb|cTV2`l`Hy9h($g>bbGf!2;IRcO8h<^T=!vw^zV(b+2Hg4T%DB#z{mES1 zJC;-bxNO%j3?%2|t>x{re5dhTJL`o|_n^(+3&|0EuXuPIPC&^6mr@SE_E$uHD+U-v zrT4?dt>t0M`Cg(ci6B^9s|;V5kURf->+;cHpmc;@|6)R*WU3R(8!E&XO;E~l)sDCX zko^LitHb^Zp!4Dmivpe44%qyC&$a6Qn8J|2OIVhsi^7wh-wjQEK$3Ax;a`WY4D?^9 z;@^N#yb@4!zPCvOHM{#PX_^347w}t-?B5tcz)9R!Hkb0(**jEjYr8+yWYL0kEkQ2Z z-=M*T=b-HLRY?>wz?6Tpj&9SneNB{UvbdwtO1404No32C;Y?FK<}^AcW6kqN?~4fz zZk#b|IS!eo&73c2n`MHCF<1Fqf;`TM62g z3c@McE(*?$oYcPaPyH+Z^qJ>8_si4!`W&Q$r#|kJ7)o0I(tbF7P411Q`zPdD)LD|E z7`{o`LBJ>H_B{CP{<~E~kPhX}r{azqB|%uu4Hr@KRHh43wXt|WwJN%(`Uj>PH2Zm`Lc9a+HT%(e|opN`*Z^0 zsFTQ!UUp!mVfLqwAv|Xs9~8;^R6 zMR@*Ka@qN_zO?kZEYOA7=c#0+t7ka-(D=1CmyFq60%(U=a)yQ_`%b1LrYE6yG|*Ms zwr53c?yz|_0!v?1zY=bK3oj7n|Ci^GUc-}5ulga3Tc;^3u}HoJrLL;eq zR-m9<;z3DU`-KYP!q!Q`S@FT#@`&|8&RdbQA6$n{bNv zh#iiuDAK+iA*>l*hr>qa31csQAkJMn!qx%5q)$s<(ell)2V&7s3R#4j_I?jUZuJ|?CD<7$a?Lxe3hIZ!Ak8Rr^dX7H%q zgrr|0y2G`IaTNlp$NhWY3!eKw^prdp12Okq$ftk&dLWDw{0A72^df_V28rB z5VOJ$@dbDOe2+=k&M~#LB}Af$Jib)di|PlQTr|(OnVh&`d{&~h>TM^V&paPJ6e2m8 zACusk?Wo8;!1RW;n{{2u!_2jnf*y#W(04Wl9z`eGjU=*=s@Zm5Tz0Xex9=VgVW}hA z4lQ2QFY`3$q!$@U-6CmSZNi@-+5bITHOp-lCoH!!($f_S8PDZSsi15}UP%{w?4p?Y zganp8t(2h6UKjJjdU-w=tyNZy4cNzW;N3pmI;_YiKqV+80JAom9}xR}?kN{;Pv^X4 zO_`G!78IK<+mTb|O#m)Gj`<%Y(-BbCbsIswY}Lz(u^APqcpoE-n$X-noPu-_rO9mR znDZ(-yOq&ff2}0&*k;aKjMV1OuAg-Le|24JR1(-09#hLvQw$1HFiIVAEXmZue2`Ck zEHO1xQz2!{njWU6X(^x&d0y^t_O(hD|s z-Cy_oJ3r1k=dAsmwa?ybf8UO84^+_w8>%w4lBVXTcMvqo8>oD`@LU+*v1~BZN zDEy{Nu`|C6mITmVXZ%eN=)6?ulty7Bl_S4=O4%H1IJXxIdaHQPu6hw=yI%F%u5ffA z@(s7+#1gm+#`#yT?_7e>(7R+K1rItATEpsxyrVt+@*(BDjHQh97NJ#fqqFG!X>-62 zDTHSL@Edr?B6m7~uEciF(uk2?-OS^A7-P>VHup)&eDOf3cu;Zx!eDlu>T2MnyV~P= zY|xSTj>-69QGh8jt3L>oyp_R?Bj&rd=2|cjm{Op!(v8q5MSWV*UGQ|}%LofTcO@cm zqP~2#SLTg|Vpg3N?O@5ChNDJ!sq3^Bx_{YB(i(UVkJw#JYeKpKpMTXQe)at45%v`dZw{cxWwQdyKp$9DzP4J%PXtcEOS&1k9m5Z^6*Ri;kC@A1ek*)MEKpIuU-FrDOkH`rRe}PgUjnTra5*{++E5 zM;}LLy}oqhYBPNVyrS_A9u&4GDPxTk5WQY%#*XqOkul8dr-#(B)7bkV=INyR zWvolbi~YAQtz?bHxn+*l9&2$xgs-FVBzovcD9zC#pE0r*zd{UFB^V7Lzr_`O%Z$z& ztp}+o&P1h?;aK^$%*E94&$xFHEV)=vXV%cpX+k60AG9mjJ@b7(-F7B!tdgtCLWnRg zpMFt;U!9I@I(5dLFKn&0?y)-axt&my6;7!$&_@9B15#VUZlf!6zxQP%Yfj@+O}tg?COfA$qV9W>c8({-^5mrA4I;a?8odwA3aHG!KP^zT$mw1hHgIdGJk=|Z zE+gnehi=PiKtbwsU2B#~L+Xq!a9Dllvu3(qq}4$trlEa8_h?^TissNf)^x!+=A{MX zW*-01+?QwJEmlFy-VmLHEE#N|aTw0c1l`LB`Ih4oM!1Bg5Wv&Qp2E>UVjb z#SSEA7C4DhK$bNDV=I;?^;63a>Nk}!xi0$^fmAl@yb)^gsd@Du1#Sm8&5VQ2{P>lb zKYoQNmdc%kb(IA}3sD!s;4q{I?VSARkq}53%YUzXB#N?@XFkQPc6|?x0sGaiz2{t1sRq3}%-f zr+{8`r&2Aka=daX^LPy1>q#y1aatp2h_19Sb{m_8(x=JEWRb7+N8D$5Z^=rBbw)MR zWVk!oE~IE8s%Rtw+5PB3UUVp8|Am85I;Xzw{>vcUoPD4LXKR!>9{uwSCYey!6oVvc zzX1{y=@DUPEmAW?OCi6Cc0~&YM!0mbzQqIU4V`u z_+xa>IY2Ssn?F1*eHb)!%gaDGK-_vq3ezzm(+6X)#Ryz^>?4VO|Y)2b@XJMcZ0=UJGGY|Aq+i=+k64m;p<`^`hFNK zP<_7p*uh-5XXstm{ja3c)>EvObm!F#km>6gy)lH3QFB)W*{>$lkleFRQd{o{E{!x6 z`3}EY3dB-4UyPwm-H%>DacvG@HT|SvFn4c{CQoYKy@M!{M5w{oJo;eOzb1!9-JzZE)V zT$@YP;qwq+TPg2qKl9Hp$1Re~A~lOgtsg*u76k-3JewhRbtO<&P<#@+nhHz_fC-t= z*q5Zbo0ChiqpsV`6F}I3mI?uOS3`jr-j%y)u*_H$o3*f&w3MGw#G9{j>Uvd37d?l} zsY`XSG*di4WK;y6&#H%{hOxNU!vLHNb5_S^O2z+=ZNJ#bntc83h&pc~r+$x-C^kAdx5*S~p1}>5BnWHWmT)64Jn5)o*0oSd wRU>gv>02yoa!vjU@qeSNwSCFWKkZp=iz#6v6PV>@Kd6VFH`c4(<5W2`@s!4mYM?qZ^a*Fq}06(PhL>`DD*sN z07J?r1Gf%#Lmpk69@{NdRE~AWg32D9>$j)Zf7TW^2z=ps*4vj@RPifH3m%b*x1==prcc^I)kze#zju5 zZD|qYK+^zigtTv$j~+B-U81@?xp5!>3>pz$S)?YfW<6BntnwBRHsAm0TM(2*R$ zF`4&D4D4To6P}EHo8C?nb~Nd z*76F$z)m>`c~;_)VS04~WeatX97MPk*Cd13-2Pl@>4>|}veOZJ7h8X{%faAg%4H|< z!Gfe99>tj?2?OBk4v}VgP}PW(EClr$>d4d%z#oH0luPj2&5ISSGB&ca4NK_2Km2FC{wT{bg{0XE@$~HqY7qL)WpNs@t z8-MnQi-S~)76}t10@WI9*%ZGhhER!OVg~Y*h#e0`bN(TE*u`;QMEKrKDsp+1G5)61 zL4u%%W4pi^S10Cw$qikjX7K37`}7a@mk{A=V2;Dz9FD)8hJ`uGW|KX|rw)HFRn_J; zxgcHNULMcZ+MAl1Zf|d!9o7_;l=ygfqN1apF5?44g@n*bGMATiEV#pVJg5Z;Cv|`Q z`jtg-RX^Jg!J$j*H5L>W4u?QMZ(DCK-EVhEdC!O}#Q_jvQ32k1`p$8Ib4~&FPDi41 z`TNN<)-!~sW)D^AluaBOu?nxhLw=Q= z2DZk;#?hx|W~-OGrN&OM=c|WH!p^z*3wGba`iAiIE8?{1ylR{#eM2g!J!tFWOIfiL_7x9YO^Jl+8xZQNND_6?>Ia< z3T7HG)y_=;NfmW4Stx1=A>-ZdM$l_R`dUzbiR$U;fj}TG?XQlGkZHyoWg{aa8Zt5) zJ3IB%Ws*uzZx)#N7t~2LIOrWAB%e7(zM{N*^8^u%H5UDiI73Ms1j$7S5|c+1kerj% zTwL%V#Y9w0!M?&aJy`CSS!P2D`a-E?%*6@kzzS7Aq&+VNeNLJ1xwbS`3p6&@Th|aw z_1nK(?fzKI@Lwo-?tz(Y2L;i6BBCZGtYZ{p-hb~9K|%nxTHeoy8Nq)IptSa|c5YG*DzB(`YVUq(FDqja#B+CZOV6ZUGDA8Bqe8{S#VIH#aK%(rRcSrFy~%<(W96Q9 zl2nXa=GWFH_OGShCMmz#d}0*BH#m*#cAVyn9Xvc)Ai7cH3MWwd};0jt9-lcB~;k-O6zfKR|aXDa#WGZZtSL zfKWQkSmUOP=W8pZ*qxo5?De$)dl@SCTka)?A1ZBorn% zz&%x9nZ{;u{y67u%?)9x!GDE$58D z4VT;&fsGUhr@}U$m@mWoJ?aNql4e+6hKrCB(B9lBSsOQPabvLiC48Qb+>?gr6=2&K3)mvR*EV@*XH>|0YbR+DER^xjDZ3#xHI zc=+yQxs^jUhe=0?P#;Xu>{Db7R{y#zyXyHa=@)lSVk2P!C#MA=KV9x8)(|LsSrv<} z7|77sCE~3fW+|^E39=0_66o6~uL7qH@;SKGS(8|O5>X@#5DqalC@sSQnADBG7{uYG z>p_1EEx%nwh8+r|j#Yg6(q)ObnBZs!n$icDR=0zuKht6xSe>2PRe%2Ct3~|IT8;P9 zr}{he6+da3$8|-yQ+MZ5IXD3pHAwVHtWtZ%YCdyPKN%~LLQ#zjzJdMcCH;Zd0c?K* z%^#&?bqU4zQS3)PsVFzcXka2EdJP{LI;$ zOSEX%h7yJmaBY#-Ct$!fK|-^SD!zj9?1l@w^1}w@D#+}IB+3E%r!Xi{8`9y9k9zSnP`7WMI1Z3Qi{ucpXJ%Ior zzz6BU{HSX*OQNJ-g6iFnXMQ6K87Q7{xIx%8wM(6>a-ibwHw?VIK+2~Cc|frf_UXpv z-`cXa0ew)va6@p%_shx_Z@)-4q04q7ITS$=s1BfEcvK1LB46uetult~gbmHCVLG?~AEThEUM)~dGCj|+#n!l?{(L_F zOl~fVmN_CHGhaPg4Aa_~9MBfo+%shmH~Ovzv%MT|g;H3NO6oam^D!3lgq2o8gd(*> zh$SCe<8`D?;C*{`O%ch?!kCP^F`stj^zwhY(FX;UB~5O+Y#sHqmOg2o!30rbvfDiqueYd!~<9gj=*JL zHe~q|=~{$hO1nhD<0**Eq5kc=wkTn@ocD4m5V-&1!f9YsOxh2=!0iA{1|@vkpl~{0 z;M}TXeC&iQM`fJ-+}69c-!xwbkPIIILc&LLX_BS=t|(m?U2|(3>0TO=WcGOcGk4j* zoX8!B4T>6dR&)=`)MHh#$4m@XomRDT3Y)4$bviIgad3olR9DfV z5h_9)fX8zb{OVNb^4uKYuW)H&vWn#*Zf+(e`3ECPo)4ph-u5=Eyex;#>$4vfjYjJA z2LSt1eJA&G)_I%(uNu8Mfg_2NVM6Gb#mIVw?IMDom44I9PJPbaEZPCpRoGg$rE2Kv ze2=%rHaj>Bx<}ku%TBJroX2(}V0J1Mh9NJ9GESl$DlQh1>EX<{@tFaQ9Y-6Qm@uJ@ z1nbm;Hy2~d%3Txw`9P4(5n#OS7NZ@Hh86Gb&Jq_~2rH)zLv z|3Lrw{+nrNz#A?SH%QTxO3^AxQ_z&~K*%l06N(7Eg>b7I#1jWi3v+y;ir96gLhmE^ zB;dVb_)QXN*>*SToe)0=Pm-k)G!G}fMx+2kfQY}81}|FtT0arJn3$N2VxuBE$pR#} zdpE`g|HK_wpNF;pw7?_>+u+EP3C^grZ_n164B{MmQh85^V^^1*Gl>SVUa}^r15ZED zdj*q)MHLIzKKh@WP;Bj&LYGn50s^Or>C0|s7eK!#KY?`}vzNyr{f)YB1ExjT1r z$q=|pv|&9l7C77|&*Q0xRIF?fKGSISSIsLvWp7g4yue{9))Yl&!&&&7usjeYYnVxO zbBTOlwUxpWk%R;dikX1Y&lxH0SPy8HS2Om@DPQrGhz_s9w(k=fA`B>Zu*EVce}RL* zK!~aJecLusTuj8vpy@%kN-+jg-MOgILrFnnnAl}r(JaQ(f`@i6(@(e0v{ErC%G2$j zQ}#&uvY7tATj}*r zial={B7I0Wm*4VN7lT%uR+dlLt+f5yx4P=``^zgg6(N*gXf z(`%i}-;E!`HcvD}6$*F*%(OlprGVa&Huu-;Zp0+`m4RVBDLssKlJ-(Zllh z=G2#!(&~DwL`fHnn9mcVGVbY%eM8 z(?qizl_Wq|atu1{tL**#Ukpx95q9#A(r_Rw>ZIaSUTVh(%_~7md9Q5M zc*4RrhTRSfOlM{Ciiyr>I=_vW)>|~QJ;wg5ZF$(4%fGyL@qC%OK(#1+({L47f^rig zuIcHwH*T8W0>p&X%l~LollJ2)IxEKB7eXEdS%RRxA`^sXsEqRPjU}g)FN~PRIVCQg z=voxmf1VM{^u>U*wq6*mD~wOq^7R|a`2kOK23-T&bT5v%lliXLl6_q!FJo60LZi1q zMPq5*rMhdzWgXvGJWFNhd%Ztncr-O9ey6SBcBA1yPyQ^ynq8g<`p4$uRI1ca za@E$R8IgLGkE&co#at5rDZqiCH#@f%Aq9_+0)y4QhWUMEqb8FmD*kd&-1!zf!*u%hSW#O{K`h1=8K z-rmZ}%FGPJniBlCrz&C7N$@~TZqvt!$rQjNB7#9}RjX~>(bm>hbgmm2RW zd{Z*mKL`_Myph0heBuRhTOP?0#;QiBM<|n3&QZ!wJp{`}J@C5|!fN?y;m=$&Nl0K% z>pp|AagkJRyoKa6%MWG5aX$yj(?*w_iF!obYJZut4Rvg$Y6LVM>ZVP5)sHwdPuCr> z?L-XAD7hD(1$TuFhUg^L6`a<4wFsOiZko zlP2JqJ4||cbu}h-u-hrZ9hmL?Kums&ue88&zp8TC%3 zSV7v!R+sM?X5?iGa%i~OM!(|xg*JPu3X6oBA`NN0&|Ixt@>4x3%Wz_^^`3qwMlCs) z#LHF{A-rXF2D;%-+X^erJ0o_=F%i?433G}Gs)r00Jw16?U;ILgw}ZdMPyMNOf$_s^ zCyVr6we{ymCv4fh=dhMYk3j@@_=M13Ntg@y8-CZZsuj4T7(IdLA3=FE>|J$rF8na8 zAFd(Lpkh~jjpA{S*rY^nhfy?W`>C*KSzlj2I{G@*!_`nMID=x6+egx zGcTbIBN}6K>h{)ybh?igT@E}uI}4?uqzuJ7@^&fhLQ0PqC&4UGr}}Svx8lFR2#n4F zFtSTv9szB02W}8yFafHt(M4_4@nHUt;8-^j6r0Gz;Uit98Jf?Sb@a7|iXyY?fkXhq z+cz8!r7*wpUt<}7(KSmm?QJ<7;cYI+yLa#U(9F%v5x0ND$NzqQ_ES_;^n31oelOT7 zsE)}^2oFpe35^rG+1ZL|sI9%c+8xV#y(z&}dAoIdyM29mii^9dHtXPpwB6(T!K2FH zmwo78T~@QQ(VQ<1wzyIZi1Kpp%v*S zB#97iEMUNgeiDq&#`p0!sKHiKr<07{yn*Bg{57Vh(odD6v_WefRx|#ufxL*Di{ISD zbXQS}mpVH}PC1s1*rvaWwO3JnVP3^uY+z|g{-w@0XO?xciQ3E7eC4jQv~xtk@G&iC zSwM*?5b)4NG2_#Nz+qnFqrO)qxB zR*&CDaXeaK`xV_#BOhBP?+trDjP=On_$O51NQ7oM0!5se2^udYHvIoSA8y!hqFv;D5cL8`$L*KTCsrnwk(jFje^?6p%<3 z#G6@ww`k5cNbAF=^*6a!8%t8+1#B(>rwzeJ{V^?0Z7+)x`#L|cyfS@4;miD1Va;K> zQC;s@qo&%!nl^S|{l0=zF^i_^t8YqclcLdz$pV(LTyb)NEbdr8pfv(CAJ(*_wZ!n2 zoaO;{hc#jAiwz5aB(%1Q7E<&e8Xb5L+z#4vbZ(mnp{FYTFmt!CApA}O4I;`A+*jCC z4Z*E%Lk+&XpwwSM=?#`;2dFcHXKBLg5BPJClBvH$-t00ayZn~A0G6{l$7~F=q<{RB zx=#m_W02ZUHy;V&kEyrrzI0}SiZQMk#N2gK5h-G>fRMICCCW-Aqm<;BX=}?L9v*Q#@WuAxsTLz(>;?#F?GsQp51)>T~AR{Bho@skHs+Qx*vv?8O*LK99c z4VTo9G8CusTX|yAv68de?nIK~Xo^MHKT~`HFS6v&?SRIfM-U@=>{C`uvG+r0wt~GE zBu=$#>0?l%Bnjj;R^`s4If13{W#?Aor{b{uNiDX4fzke@ARBREouiF|vyHR6zlp}6 ze8`htFRM5G7lzo$9kixf^&kC6#_TBM(eMuD$QuF9&}sE7IlBu+HKiPJYCw<3jd?J? zG6ASJo_sPlLTn*_@p(1+il@R*oIL$cXI8d`-aj4=aq0;qDD0}c3Guc}`m*q1YP^J6 zs^F|DjmOTCYFYZ2=sVkfxVkBaN@7aQejTB?zSqa4`}_L=#GD0@&X!612;r5L%>&ZH z-*m|T-Gin1uRv3icQ(7aS|(BC4-|DXpvo`>&9TkiMAN1Q!C2I)T*;hq` zJDXFBnpph46Z!!4L2F>9hkSqSrcCUwSj`0e=7arE0`Gv{B zImOo$_3yD+X+~g8MR-&Gu5+~pD!}SZ#R0Z)itCd=L=E;J9zhO-sP~UE5cMFXtPqjy zP|5!H2K6uS!)gTt?okDdZUf^pb*u3rKsKGb0tEQPKgya5UrL%hOSFiYH3eK99*gC1 zb0QX0zCQLKAA{F|?v)v6Nt~^hNw1kz_6Z3P`|&>lFO#xce>{W;bXumgwCq@o_JcYS_-qHj)gsh^k|WCZ9rL+F$GHxfLp zp}+?GaSum}O%%b@Bmdyf?2UqYi2M<+ST#T?{L0<(pm}}|No~lnWW);l(etZMtR!VH ztY`9lIrDhaS@Wot7S>bbq%_Oa(Jj2JQIjLcR51}@naR|^7#Xs?nvd6=pWcjCB8rJn zF$$58ym39p)o5A}pkNpEwf~9F?_dN1Cc%Qww~_x*PM5Bqv+u84`(SabeAKh>Gc|t1o)_ z>kmJdtwRYfU>*x;a(7ArX0_EGIFgU&Xq2)s_xHXaQZY%0^YeyW7Wh3Rf{kMj`f>!?DF6 zxF9ZE+3^HZT7_dclF9t;k}+*VZfOWFj&e2L(ij7?1WSI}U%*nCFHS$Q<*U&uNihz> zR~$hXP189SBG(sOj8p|`r-WaB=Br=evU{f=g6V>2!(JgaH%sdwI(~nM1&xxcDaQ$8 zaztAE9(4DKpF!F}tstpkJrof?I@({SFJ!QZBQp1JYl^E3_|hZV_^A9FovwF~x3A&5 zY?WTJZ1P3M$`Bxszz+4t&x+-2>>CP4bCf%P1fLKmqFB2Qe?sf6?-Lb7MMXV4Ji4CN z&L8jZ1AA4zT_vTarp8OW3JM85aK2q}5)cr4R#LL&TfzBufdKrM_jVnC%v+}ZSP}r+ zo|*$N+~G3=0>sXc;y1njrjn?`Alhf z^{~AXJO3_dNJ=X>u9M5viMDDkeQ70ec=rd9CHdM^cc3aCt^mQLc0yX4#3y*O!F5 z1+rFZ8tyRDF*5F2wpG8I$=;L&2AGPk6xowtBKqGIO!$4|Me0U(VAqL8!OQXtBV7#UO188H@espqtKG}MlyMF7${kGU z?29&g&2qt}R!Q=`CByqGqP8QaN|KhwJ`#Kh&}*h2QXB(~a({c-qSyHUUb?6q2qo{Q zpWjf({?cvKOkeM|aTi(nTCi?j-0wwvElWc<#ANO5{SZqbU@Qaw@`ZH6Z(n31sFt^~ zuLbgZzn>IoBsfS}Q5<&(| z>5{{^#rr;y=7->;v+@_{U^4*CrNqGOZTbcVVTds=LX_A$eN9kH1<)rb*06_wfWTHn zFrPJT)ly#&DgD9WWgIFiQN-ftj`k3nz}J*zE0)4B^HFIWVg?Mcp~r>fGgI3CH7dXV z9@z%0|E-#=r%GfU&!boEVu*^~N5Qj=^{o)=C_rLT5+Mfrj9`?pLrU!fg2wRvhWPrs zd-a04R{_V+`a9>=ulM9e5+{V~$S7tR+OLC3**!vdcdKZC47Te^3p2IdT6M(jLZ6?^ zNialOlleuF8W5t~pj)7RU|>$a9+)l1g9j>`ZjM+O-Iec4AhJ^`6YjF6JE+jAhDSi~ z_3^p7x}p~MLwymYPi(2HgBKGuGcy|w{<&4U-6%#nRasr#&l)EE0D}W&6ch-|#c*-q zWKIAXF+oI%jE=Uowhpv_Dcyd4e(vs#d3iK;VgdprKApJM5-&GuwzkK=CEi2@1=B~& zgUN2dYHDg?qN33Dlk;;UUERmdbAOyn#lq>c)mGOn)UUY3+3l!4*(zg)9QzT_;1O+y z4I|g5*IxjQXPgXc`NKjSmGw8N8DBUxQUVsSM$V;bP(JCGEZkeR9TAniZ|_s$`fIy* zivNQ}Iw#TKZ#UEOIyyRBmEneajkb%7_#Z!i#Stv$Au3aof0+C$ zw5mrApasss-ds&X18F{3GL5i|a%Xoe4O~-Hgvdu50e7P+iPkEek9)`zVrglKTqjw! zGzXEN3f9x~I2$7l_VD}3jw<@8zKvhBECD$c(Bg(CMxkyNXYzj$tTb}@sdU*zOA9m50s zot$trrD#uK3|9y~DgPHDm{-U+floprey*&LQVu*EoQRcx8Lr>cdU$vk6a*)p*WJ+2 z(ZKkoL`cbnYMUQc^My-Ow7VHI1`(@{5EYTjOIKSPY&VK4#fi*^tIn44#UoTO=CmtT z?U^$wRotJSQ~ovBC8N6rlJWQ{9u~x5fylw%X#WdZdV=~QyEbA}lDzU)dpXqw!pXf( z#Cy5_24)gZ%AJtKF;V{Yv1Q{@U>GSSS{@wY2QFX)##A}oG2VnVHhwTC5DXG0azOmr z!xEGugct-am=QS0b?6ae@T5+dE>dE1m;h2l;W0^>*u^uXcGXn2bOjO!Tk7H?D93*r z7kG3cT@m&|Y)QODFCG*^yroDg?Vt$W&PJs@7VS@nTiT-;4-W}+y&#i(0cc6Ucb-H% z3Y0h@w;3C&k%6ZlY}Q?aSF{D=Vq-VPs-6B_RCxary>;+0S65e-6`90DaSsk|2X_|= zF0gqE!#AT*S%uC}9hIm9WFgfRhw!w*x>hi6Ls|vK-dzd01h>=+gIHe@{M3BRUd#RV z@c}DwFE{n;;;M7rACLH(!JpJ&UEj37qd(|$JwV&7` z0iWbiR5d?ks|EV{Ii!0gZ&dX~RH*dl^mRH~KI9vWGvxD1*%an-U^g{+3?JR6`#mtS zaER=un7Z3hrWTH>sP@)%SA4T;DRDJMoepd@jYP47Urr5zwr$=Z%JyuO9P-FN=Vouq z+wcX)=2Rq6P5#U;kGaXhxRci6MD$)?(;q1rZhVLY?Y z@%Gen)%E%6Z##Q|%HDjn*@07;QnrpHL@XtX-&;S5oeMrNb?hF)8|S{?4XMX*F!0WG zzO%5e&SJ2E_#P}`IA=|XNWs|+X2)q;)4^u#bm=<#cS<5Fx(@YCjvJ^(E4!O^;DczW zHPZz%De^~hr$=$%6&CGIVWepp=A;(=V7d0K99yC^dE)?FGn(61(@q4j4EP3ILUOk6 zicCC93=bW<2|at|2rn|(U60U-!d*e-Y>bmTxIKX%$ykHKt?#UTzch7sOBk_PZAA|) zN;0G>c0ZT=-g0~$9Vbgh6~XxnY$Q}1k2ZU#n%5NOT*DcLVWgbxF)?#gU zu7>wOscSe1>q7M@>S_IH$AwZn`FA0U=V8NLI;ak-fxdx1@tzT<4v2;x42y8u#7!EP z=^Us%CokPenD-L$Q>YhN0JqpoX0FfMY{28;MBt}TPByl+LM8DgdVd>ge+D!yT)3v! zdfL)kaaduGg^5m8g!MzhXH_$^qh5GyHAiJc;hgp3${(GPk&$(iv-NRco52*3&tEBB zlj9IAki(Zq>)k0`YhKlT8`PCW|b*5>G-saNeMYFPXea`Y4F1wfe+D6qD?j_YB`2DFqnRd6wKK}dpOXu;7EJ$ zFq8}KXZXDz1_fZpknfmX`}ZhFe+YU)04O3*66%DM8;yI}A|l1uVZ0+NATY}gVos$- zL)XZ`PcK*2qtGRSKiO~jGMxhTKm9k2gAwkl_tHm=jg1K-uVmSCKs!NSK768l_iHHe zGt`At${kLxs6#z;mL{@UZmO4HO<)KvGpdT<^;32b2blSQ-)Q&!8Z*LG0)qef)Y$Jf zgyyUg`U6QVj4(w6VPu&f?Lx~7jWM$&Sg@L1TLHLX62px}4CCeb`LASPnEw@h*97s@rlO6Qh#5D!vjZVK&EuymN4b9QYe(KLaT_ApotVC}H9qcI`!=6^-q8fOZ9tH7FKE|Cj zX+kNBzdS;KPL|EimrYGBE*KH@cbFGwkxtAy>n+rt0`&vEZ<*1K11~6KvGc{T8cf4f zet~iRQ%FsF=lwaPnE9ih6(XR5AuFSbM6og*17EHrX%j8Ps- zP5fDDZ{6MaE5lO;}TLxu^1HF93CRRg&yM= zy|?_V#rii7E+cl3wM>bKUbkQt}8|7kKAjM-}|phE(V7`jWxm z_xrIf^3A^l4wo23*B80C>a^SUj|T5%cOkTSzvaY7I_tQAbB}0qXUwb~(_X}4FgZj?JmTefJxzJ36XG5vFmv(2%Yy^uzW1V0l?VmOjN(z_F*{`epoqJdci}_KBLdtc^ zcw1d?!Ht5ImJyeADeFIs0K$I_f9qP&M#S3K4%=v^JA~iEJ^r(1(xore9*&4Xy{Y+7 zU&n)S>GZU0^t>`XvOK#?ccgnySj=#vc(KC9B)Y?+!shMMKRdDfPONWXcB1&irl_K^ zKPPSC;9bL=)Rx`1{WF7~+QFy1!?RHuGLZ(-&6u`jRXD7^e?fItT#F12MIX|{97~iR zP>e=Cb@R6WoRJlW!7;lB5=j*fx;$^2CjX@fDOL%x&z%wm_AZS_j9rC9IZm)$;~P=()f>G@;-D+^2N3=! zd8vHxim-2Uvu25AlNQNgg@|uT=O+ZSdizr<$*Hqfx}V^sW%*wz(oS1)mp(FYukQYz1w zG<{qQwpU@h*?JlcOa(D~?Z;cPHpG5I4Z@o@KY zzLO+nBK`_pxV)}S$xgDHJ_{mA7_?2aW}Jk^O)Mi*xsjRR#88P><+6t-4ytl4 z`vuuID4mQ2t@Y58^_s?9wB=B_VLS#6)upb^83XO6jl(3QZP91*T{i4fQDUUSOA zk8rn8Tn^cq5eVRSBbS^YDE}SZffP(1-1Sx_A4EQ+!p%}-8GP&R&c|QTaiL5`Pm((9 zXjhKVcLc;zPEpUMj(%trG6&HzzXJxlpY^81nZdp6|3V&p7%xsde5hKRzg-b^v9i}P z*m~r5waXQ6ZBboc8Qek58cI8ks>>T_`?B(Wrr&pnUtombsQt>CQ{jDwc*K^>F;F#H#fZAa|0>A50etsmB zZ#1NmWG6Q+@F1p?R*QiEg3Fmz%5@%d{H^yJ$FdNo0m4sYuay?<49y*;ji_kgH>WWE z88x*`1m@S10T@2cEKcs**yH5`m1XHZ5TnM zPD||W=6*epo<)FfV{qE*N*$A9ak2|ytN9nOi5P3$ii(&clntd-EpxN-)$C->dzZ*6C}NnyaD}`vR0bK}q?7w3ri8G@=(;mJQckmCY8n`jSCe4xK<$(dyM~fTd*b77@ zLveFEQ}SPpiuA4QCidSAA>jqc*0^4|Hs?|NoDw{SO(d@+!CeYB7i|I1wc^~FB1j_L zFa97w1j>8-UBUAhRP>O?GK+=tlIgc9(}Qbyo2$gpyrSsh0UJzd!5%e9~8|Y~K{7kDN7D{5B5IRm# zh*9$|FA0?ue~j}(pEc2|vBIXye30lL4>?36ar+Y|E34)V-;*_i*V)vR$)An8_GcSA z?D&dl94S>luNk`wHPHhZfGO`kpRW9v;3oNc0Ym9)ZH&pbu-=j7iP+jytl8+ z^;|+#Tujoc(*)d||IE(Xn)>uDj@g=pk^3xno@%VmXR)-@0qkC^q`-)v@-+4@!B<|s zg}gTlzf5^ro13`Yzt4Q4@ta?pUQ+!oE-uE)GuK(e#oJw*1D;w@%(#tGh*IRd?)1Kh z8Wi07INR(U1+j+AmV(lx@I$xauSvSD&Cg0&uiwN|Ui-6K9gAnW)5Jn}`?q%xsfuHL ze0(7W(J4krG*nD&h(h-UU-a`9{bo_42g78|2}-kRgXyiD9+D_WQ37^8o%#zB4!fV% zlQPm7qidYmP|1KJ8!Gg!+v(dj3*xumy2*I?Cq&q1|*K#?=Y@)YjEYXzWzNi}1=d?25_3qIsLjk1N+= ziYL<>>k7*EkCpwMS6o3rsP`sx7;=RDf`6lX{4Nfwq*n(|eF)=UAw!79gqT^O8J$4h zKxms0k2B`Krr56SBr5miKO+mh(_`-$d8Wn|=2t@bMM;Sd3^M&JVpg;?uFU=X=<92e zrKtwjkBU@O7_uaH5lilq;Pl>5l&4w^=y-62#GoLSaPp0g2k&)Cj^pI1{;J6@tSLW0 z-2@o_r0`LXdI=Q%ZkJfOy3JdcSW|KxtsIMhWODhhQN9A1=#y${z_jtdgxo&__LqbB4PyblyMa)c z&>=*KAcf`fb5If-l5Hy_fS3}6I9nTBR^cOCq%@$u!1*@yTxWcgnK@BLo84N~;t(F8 z)Q}ttdvC@Vaf^R6McE|5SK(-)SH--6iQgr8$l~oPQ!7v|Sel~5ycmjx{?^@u3Gj4w zT6%Botl}m=Bb^yd6U6M|UDPh?6QxjiWQqVXb4w)ZX4+gNUV?!U1Ek%ACbf9|Z!g z1x#!2>wk+E&K_oEWxc?2g?briBDb!go76AEgbP1$n7X0Kh`+nDv$MZX zLQLr60sF=ciC=;q|)q@||9tWaHVFXsqZ?QLz^Y?=W9 zZ~xO%P%RVAPEPz@pM{dKFfp?;GGJoKTcN~bVO$)x@lH=qU|!zF!NCD@o?l%{3#$C! zSQ_V_KYs-H`JrUm)MkT{Q)++xa0$I=QxxBh174~np>GcoZzVZ7R2P*61@u55>g$u$ z?_4;BASTJxm>A56;LFQP&$CrBGO{fv!32zKY*bW*j~@?@j}cVirJ9?XzTFhkw6?TJ zY6M&{2f(L<^cp=68u`JPQkW9-cI6px=NTCp8Ss!6fR=)=^?LIA_2g*2VzJuD(b`%; zSvg!AoBKYk`?)wI1Obf8|F{_NvIt{@si~<2999E`gP<^nm=mhKqvO-#<9c_1Q7gsQ z|KIiKh%nYM(8AD=`ohf03MCyS5eGj3)>Y_e!$_IZ7a2Ix~Sj;z4w zU5U1qqxESea2_PO-$Z@P9r2bJB(PWTCfjS`XLOVZZl`dr93f2=aMYU@t*LRR6&C#7 z(SbGq=p*rvG5W2Br_SY8R=0$S?>ERA04@_~T-0Vq7ABY*$-QCSSp6M)aHi}Oe2#zj(B`@3&L-;VL1pa16jtq zl9ej8OZI$cle`dR{z-h4|2-nz!MN>gjzi%+m+gD{>G>3|^DYa!j+A(u{I;ppF$g%- zoQ&ve?EBze?nkJkTZAj>+U}vhu|1!pRj}#TRFp5UbyR%#>UFbaaRNMLJWp(4UCLRS zNdErn86}Rbq=*(bWcCZ0HOL$(qP+Fa^y@7)I+>2*v&KB@b{%UD9qZ1x`tweFQq6y2 z_Q;h2GfOQC_o332hP-j~){b$bWRyPH60o|m7yjnMv(2F+mj?n2Y5ZRtw+ub*ce^ip;*L6u2*|)6&3ekS8?Kpkyjo%ff(a+ zg_9A!07}UNrN)SB21J;1Qa=JG_@Cs|^z@fV8JJCZZ2y{$Zj~fRl2!xtJ94i7zj-Z8 zWCU)4_lPc1ocK0o4=|O-9}EWT>XH*e%I)m!6VVgd`!q|{znYrT1AFnwajB@VQWFv! zwb_sn%#TMWPGH)swMU@)qS7uZ_cU^Z8_dFT`1tR*wY61taBypDYt-HvpB?e#`TDns9vT|j-PzjHN&Rnl zczE%L9Rfl1z5V^52+64umAt0r=Cri5kjuO7H~%F*yZ3^EUcRzmQU{gs*yi#so83*x4hp68GM*p;3uB-O*W$BAo9v+f7>8`bY^WLLcV*NZl#k56 zoK-F_1gfj5V3>J+dMc$YO|7}Iv=pd89gji@&t%;Lh^T99L<-$=5|lK>RS1#m3IgqL z1xpjFV+HAGGNWL z>1)jBH`mB})|IH|x$S-80Tqr!4k5g^*H8HEZ!>SNQ8&VqqYqPR7Z8OhULtlxF%0e- zDV11Hn8`sm(W_IbBYg0<*)=1wZYrdISh|@Oxfh7MK@jMC&qmesrSYa%5TZC6T(e)zv7^84!r#oii z$bBI-N){>K^iw**iXT{FS)pUCU|g_kvosR0#0w*v5*19%%!;FaS2#L4GTip|_SS^5 zg$^Wq5EqZj&BS9$8x#A!t&92?Li4-{TiP8##=3+a@Hm_2U}snANYBWK=ud)^8A>YZ zbAyUc5(z6x*MsR%{rxQ+w?{*-%X+BAC#Yr=b8=-z83NFJ;hqZAvlX1?WB_l#sWaH3 zX?t7Sr!Aa-gTH@yd3izal0JX_oRghROhN*iW601?zx*FfR{<5(_jQQ@hE4(L?vU;n zq`Nx=q+3cFhVBLlWsvTWPU#LoP`U-_?)aX+|N2;qwOGK+dh_1B=k9aP-upblo7<>SvEYv4oKsj84AIvC}G9qT88v89=xo}%MD849-rFqWGU+d=mw5Fgeg8g9=K8*l8^)|E2|{f z>|e=+<6~#!P@uL12-pk0ehrhNK1Iy<*IKTSiHs(MUf7itIc8dMJ zJor^ZUD4G=af>pf?BmlK9*#uDzVqr8EE4%UE|SX8(NQ>mtv*|=|Jf$edlN}0i8QsK zJxy?sc2)qHkS_C^!8&|bsCa1tDId<|SF~LGIbbyw)A)Vsd$(R2V4Wk*2})PETYe7O zzJ7{_7d$Pq`9<0V2lO>ZNreyXun{>Ft_Rbdd%>={GRW#x5Pr8o}LOtnj#`1$rcG5(^KQ)k_dpsg2sGljxDvVon0B=*`N*Pv$3-3 z!2|Jw;^Ff(%j605ds$M@QT3l@C7!f^<*1Le6(5i3m@3W&{cz85=ZEWsqVwf@ByW8T z+t?F5$Zhs;KkIe^;ffTv$}}v`N%m+tid0 z8(UFPad3DTCea0iAanB#z3%(;ygV~6FaGy;_xHNm+QFKzPmUULLUAze1ya0dP*}Uq z#h*^Un}5;qH;$vTDzzv@qE!CJj~~M#A^`n@uAW}se4eOJN?sne$Kylyi=W`fPs+u~ z$+*O`w!GDw)DB75v9RS3B`-Qno%$W$Z*DGSue;ZxG_4fN_^UX0OSW@nN0op1#*J=O zvQ5ZS>wy~#QwNYO?X&(Wmbl&VT(sX*l9*;^i6k+Us~pqoduC>1>e&aPYMlrYLPF4h z_2tN)qgql^S^1q(LPP-l`aSpS4B(z81$R?^0%=>nA$|v!ucT3=`js9krSqLVU%jQF zp`op9e`~AHqVAo06f!>=O5Z38uRYQtvhvdoXOIvtF9>A{VBBtQZZ0k^9v&XTq^21H z^g%^LSxEOdgykyLCUvHE{0ZQ1$WZ9&K#%?tC{D@=7{A4zrQNU4^h2^*h$6u*1R$< zZ!*)Xv|rIf+-jQkaOI!&>xT(9oM&Id%;JvG(z{kOD>F!26uKv|>kYSSyjlL^0|5PK zvbsy8!oXa%+I~S75?4avMO`0d<_A&yhPy%FgEk=S${|i-(TtC*N~&W@?hm2qu?-0Q z2>#ahxY`q!j|{bk)0EK75F+u-!w3Q0lwUFb=nh!}O|GZ?Ubj0gI*h)orEL)gXpgx) z$vE<98o^MZu{;N8Q*HvRfS1L|qoKP3u|xt-{z*T}3Qglz0ZwV_Z5ma@yhI0k|La^l z*ZuzaL@A~oqc3o?%ITKGP2oJ#NTn!gfkEAHvX|BHC z8V88}iLY{Ra62SGI^RU$FXgA7Q}K8k4`W{V5`RVzYvU7dM-}T#6CVYw(6TU+RVa_& z^i@+t&wkkqfq9yQno~3(smqyqQOcr30`?zu__PO_4FE?pHbukKKdiaA(i#QX; zDVl3s*TM0=IT6|M;r4Ds#r2!Ld~9J+`G{|#AXWL)hX-?1#z0;@k=iAGoJ;w=aM)J+ zdHpnz-u=@jkO~LdsBMfwO&4AsCEmldNYQ>QDU&51vnvqc@tj^w z?c0~zXFDj3vWywtqm7nxyDKdMytf0ELEE3B^IdyO*c4){35t`^eo1zgP7Y36`#X}Z zb>3i4#srq(7z=aLo%nJ~TtM%yI?29~*0x@WiuQdz5y2+3?{SX5V;aTw21UEK9iNqLlL?iToJ5`^~AHt)sk}TD9$w137VY zdn!Tl?d=DB&`58DG}VH>(SnHYa>r&2{T_uoHb9sgqOlE*+@i=_($FGHPs(;3s3>_p zdukcpvvqsrW*%4qCYiWrCtt?O)iXxVAupp znSo3!SUKmNU3c(5c2MG8x=xplC@5&NysAMdjZkJwy081d2A$;O;3J^RZW(MMSdPDH zbYSTs+TY=qtp-@@s!h6`Pl$qk1fk_udAJbxgL1t?w^pWGn*7vwlfMNH90}64O{_hw zMZ6|V$(!Riju-U5h1F!IUnSI=``3NI3%j9%?h^qU58#muaA!#~;E%l59Kf4Nf)gv; za0xZ8-(L zHV!w9V4FK51jpck(JSE<+2pAt(`%L06zyt82<6`qB^hIi)Uzk$9VF8Xg$qLx36k}L zi++wy=5lXI)1)iZUrUJO%m(UN28(J=@mJ21+L7#SZAHn%_Jwch-mvH`jOXlczpT z)O6(bI%8j6E{F*IUTD+HESB>TZcG=e3d#~)J~L#}SV(SsQr#{C$F!=~#15|xQ+P^Ap3$aXdg#d{X|x&BUv#S%@2q6w~p4~oD* z+^Z0=*AKvdm>l%l=~OM0ryQ-P42%Yy-2)c}R@%~)a(wp*6(&6J?0>> z=FBWC+C8^2FFFXdl24v8J32}L9`75v2w8GF-_L8ax|UX3+IKWpfgkqcm(JR72;K+@ zMLUAGc|l@a0He36pdpdp%KDMdGI7A-n|(d)g8%dJaf0MCTuj=~Zc53#s|*gAqB`Fg z{`wKFHck88UZZ5ps)rcKBI>@~`CLtq)BOeKI9q)8!Unp6-KG7 zel0ZMRZ=L!wzhcLp3-V3ZiM(9-nN;P~Z<21^>~BuNPH8i5DZWxEUU~D$MIg(Tooo8o3Dgb@4cX3B z1?;gP9Nswa;ia+9y#0lV5GL7!uRY^rIz9f@KjSh^} z+0`o2Rp5BI0uA>eCxIOP|je9tj?UR(Ani|N;{A{l^Qt-7S?h{pW*b*wk^$%MoIH0Fhicer1 z?Qs7$B(|UpJH_LDpP!UE-}felVw;BCv$ZFxvWBvf_U@{}%8r(%{98{01uagd6XV!m zdYntoAKym54$)6>XODf!)cLhblrA>Wvhqt^{eh;SxV+=dZr!Vq)iXsFLs9@8P9i}D zHvjH8RsJ#67R_E=GLgc*ug*|B>!OH7S5e1G{5G~xkdaMw668R(w+4 zh>$FAi6cf0;h}i-)sAd2g777^E?htxbL~b&QBLG{8aNSsX zCNsK^hCe1Pj;d=Ww+ZIb#Fg3~r~>Sq9~I0eW;>u?o|FBsDdis8-%I#nlsvRIpS;P6 z8~;g{R>??L8VJDCbaxy`k=G1a15qa69^pPlX0EcJ#VEJ7nWD)^y5#q)dVP$`89O#E zHIrwv{Gr~{^?rx*?~~^hXX+h|o5qwe>145xQ(5keoGI~bP`aEO=kgtX3pnO+XZV%6 zJmR|Os?I$a%UL^`Zo23`n!-o|4Ioqb(C;)3Wa-gv4Mi+%Ixok@w?_(ZX+iGXn#og$2VE>+gF;!a`yb7F-}2uKQZh zF~QV3N41G@G-+to-OfOG>q-?LMIK`M)FeBg&~bKjsTGQ=6605+2`Rs&p;luvKXHHR zq$-v6T3Fy>q9e#fswna_LF@cE^8gzw#bqR=gADiEHNZXd95Ubl%-2(Ciw9P_#ILzt ze~{Y_+->gdy>ufQ-(V95b1R?xJESJ4?11*yFt0d&v6-@(3iXxcP7BDBPhcVndvr4J zy(6i;yU?Gzr`kW+QbtCcMql|>i4j-8EGt&r!8Y!(v9-e84Jm}A!yEOt2&-6nwRLra z>#hRLSofdz*N>(e;t_0uEi4`UA_siPwwjt62R7V%5WYxyTpHsIE8Xma!Z%_ue{lUA zO6E)#%KBtS<^i;2ZCttcl3^_`@}v;l<}4EE>E{9c3u(MJBW&1lRS$`x7*HnyiIDsTf*WmSb<#3J8w7YnxO^w zZb)^+YkA^W@Em%WB%cbAXk!?2exi=<98VmdhI6|S1?0QE<84of;DK8QqYa zg!n1C>IIL;%p#y#$r;R@X24bGF%bO5FV{w@_-!l%N^$CXpBs{g`fLmBA{TO|^mwsA z`NJnaP-PlV1X16UpWeI8$zhw17hygycJqInh}l)!qdf{&qb#-&ZBN#@9r=}Tm#B$i z&9`<00?vLcSvcyK?~f467 zTcd;Ua=tYrT;F9DcGQ7_e2i{Nu+m9D2i+o!sHp#f?E9Re+aosi-;kwXs zb>1k_ifzjO8lQ7%LFD)1Z||Stfy93^10>p-PJ7O^Q54mWP6jxust~bwBgrfosrI+NHHi9r&S28o|&L&@q|YMtMEWu}|WCss+LL!2Z8rpo_boL=WFzr$3k(oG|jHBLN7#c+4^ zqE2>n6h(}y{H$;dk;;m*-OAORSrBP%7kQSJd|JemDP48^%IW%@!K!q z24cf9iqzj*!E)-+aT09}_>?~3%mi(I_sg+Z6E&n)=v@&adAVYcD-0*l=lt2aUlEu8 zP#T%SbomT|enw{3C0hJ3sgdhVB5|%My93GJtlz_mYOBAE%boxJUNUhY%humTO~J?a zq1oV9n-*w_`}Yy#7=cWEY%ix>hn7cjdf=)kJpS`$0wi*(3R=C^DA4qV`u9}TNzD8D znEb4y1MCpkrOKb!ru=;<3QU?sC=K>tB!t<3uT8g;$nLmJq;nb15rOp4lb{4O41tqq z=q3xcdm&uv&p+|B^viTvBO0Dnj5am3AXl!?(kK0&} z>cqpDw)7`Su<3VuQ-^g6)3@Xd=*Y^($)9@ulr7piulfv@ncfL<0jcCyRdu+@){@AC zP&!fR$OIwRk0qcv)Ch1n{=Yx^0a4C_w$#JRD}|n*xv{y=-cQfl*KvLRe&+ak|L~q8 zUh0dH;cH6r4clz7DM|ItK1ubCczKp$wl^jSGnO?bRVGbg|JUs$X}6*1#_!au+kkkSb2keCi=}{jOo85Kdk9-u& zP)VxqCso1_c){H-6vN~~1d+JBT+B|9eF}b;{yCh1pE7>@P;ccGGd8;ZT3fjBd{M5( z+4?=o$=?TE566`Wg56zPF0#r1!R=9fU#&>cPm3MsYxc9WP)1VB$78c=R`rh4{=yIRFrajgJD#m#NI80E==;_X%oS!BUc8j$Wh~go?Oi{ zmI7NP56zL2t9SalxMjgk=Cr7#5`kJ@P$VFd(t8Gj8%{qal~!)<`=f)zL>9sWv>4QA zY*tZZdbZAzoIZbot-JMK33hTwqM`+Lr^b%W!C?ysP;TV~9Buv~&(r$5O=<38Pq=UG zBG=G#KOXho?&x6S%XwwrfCz7AWrd$Jv*@*~C!^5DDtQ`fB<>{}j1%g7(ch(VATg2m zGP1QmDWN%(n=PA=Cz|!Ja1q{aVzjRu>bW<=JK=7s@w$k%eMn}3I2EnYzALYQU;?+{ zaE>*5zqvIA{mX{9YZO$rD1(4tJx!48PPgP(@-fi(9qN9LwgT0H_l*Z>(0i{t*`@%X zsds+xE~PcO=xGH9TgiPlOrB`5Kh0>mFXQjku-`zZyVBd)SmpupMq%Spl<%Lmc-7Z> zX7LGRsU-ZnP602rAa}G!T^6whC;U5n+`FgBg`f&+FE+{4uFr~7lvXsa%43BgcEI!h z-m0-!n^krPZe95`P~2KRys)sN0J#z{Bi-2%B`^3v(vJMLBe# z4rjnJQ7DD#;-mK*^P1_0A{K3FU~!j5=R|-nvww3Mon<98;Fm9y(cWgbW(r(avKg}He_V;lMA@9mMnrMxWhGi#T7XQ?UK zUZcZcOkX(O#Z#&*#i9fZ?6=3Iy~rSN{5&F1iH?zl_GS_70-iJ8UmufD(cVL6nG$dq z2b(pEH`KPH3QG>(te*meujMSlWFAU70JZ_FAKH9x=yM1OwQAg2&>JLC3sgG6C+4%f z84RFOEQHBH0I~9=+oPlc?T~`Yzn{+>F2{_vSz_4R?gu64-y;B@-h;99(-g6pwJXx&UhVh8P2aWP+V$U#DW6STuW?l&`Z|}_fXqh$6 zKqxD;S8|#s4rUJu=ep%L!q|4NHfT>1I52FyUf9Yy{4@8GrNBwL@N}Ho+S@h3Rm@c4 zeV{h`wu1_^eE9BL zM{JNH(SQi;-a}AKo~Fb=BzE0yGm?zcSh&g<2C_s+pu#vlU9+>X%kuM6VyHHFNP2u*2R#ArAI}m#zrn& z#rjTh3M96q_2^PKgP1cPB#?eQTRZ=D>CX9Dnbc}`>f4^gRNjj-p;)=o#Smv^w@>H! z4U!V&&cus?uvoFvg?GL6ix$h%Nj;V?5>X<|sA4wU^D~!%ke{C)LUdZ+?wO2KmwxXn zw2ydye;=}ZW`6f(XI5Rudaa*O+7&2xoYq@<@ZHC7db%}ReWY%MA=v~YU5lXYvOzad z(NSWDiV9ErZ zyN> z#~jX=RYc?C<5X9cGICI<4pcNuRwoiLCRX;!J3UPH-ArscLhXAHQmW1Te&in_A?Ww- z-vm`B*IA4AWv-IQ+Ym>$wxxX{z{*l5i4v_gyApgmKq?aMF z2k(&kqj5+WEe<-8MVI{O`->YvDdgCxKd}pBdsp($e*3&X-9Zq}>2Tlp3-XFBK*%dZ zFqIKaf4=MeDx21KM*g#n{4`|J<`wChUlaG#t6!X`#58uVFWJL3v&+PmHj5(pE`U4e z3B^+5@j|LE)VLlRV3pw1Cna0kjG?QM%aWXKyb>e+!>uospx)Nivtkw7bZaq4QDbTE zZJ$h!6CGx8M#-|@ngnuk5!x%NyN#Sg0ygHL)&p{%ft>pHjABmy{MKm~WMP^_=@H6F z33;U*Ees{PvtO3N2j^6evD=BqN;39&KP3-DX`#>UfYFJ3a^CdDIQs66OUX2fKsY*S zu1nvYSokvv^DK!-@_xXygkrJ;H=~3@iSpZ^OK%u93nvGP?Yg$A!SVwkfpY!}qfl{o zI!!m*)dO>Fy4~*>)skCxdG)Agg8`Ka<-nsoMaOF;BJ8!U!A$W$_zA04cvEL{_~){z zazrU9T4(FU1rayUM<_>~&L3i7bST30PjR#uYm@7nriXn!Ecm+PNoNi0yi~H@mFoVW zi`H*y%G|9bnRI#ggN@~ae9L`RCD$@fV}%=&A1>+f-@R#?!-ES^N~| zq3!D{T;KY*d@jyt#`*Fr1!Zt68IK`=>Qr`ChdyO^2EPVDSeQS;WHuM*96m%W?5RS$PJi!Maq5$t|#mQ^=_p+l%S zCZ}9p9!J{bJU8unwI6+mc~Hn&AFx= zmr+24FrIedr$NLFgu6#dm+M_m4VImkEahZ%z|tA(a-jDcEmJjT$bKfFwcRZG-hLg- z1=*|i5pSI<)uyYI@ zgjvpG>rbpjTdWk%-D=$jUsoVDo0FsZ(rrJrKJhx+i?9t6;E#Vng5*#9HjxbeCiHsJ z8#EUUqi%Ev%7I{47g;RNDTP0GhJ&tpp@hMUMsn69iG_Ax!$EE+S2SDRN%qv-$eTk zFh7%vYvhq^tt~Ik&xrh-pHVDG@bGTXh=_ELVHpm6TgA@)HuOC)u|{b_SM}s%lP)py z%H;6G)CB2kGGbz~zsLK>dwa4KQs068eihYM{C^ZM+35>n$l7DqKRDtdQHYob+w$B- zDzk*#c&FHMsPZR$OwYs^%Y3zyq%$MsyiaZOr%P2q6q9yTwVm2&zGWo zd$1{{dh@`>_hSFB*wV|4iU zoXs5MS&yV`xU(-UICzY?mGdoBs`o7|TArx?X(<&8_w`xdN5S2KMgVPD$;>vRV1Nds z51c(s~3`|Xp^`|+p z9<=dTXrlco7GD>;#xRE^!?Wp7BNR#17_(6QDu@n1Y-ka6SR*#j$)+~=q{B-DU*7X) zbe0K+-b<%WI-l(;VCC(hQ{D5MHT^+ngirqSgW&HN!|MBa+)f<%)_%gbL6S=b7g8he z5KIf4P~v{7A-uP6d{Gb#izNIQ>R@|<1=6f-g!TA&T&Bs}WvLwbv%y{bbBA%{JDdR= zNgWvmTn_8A;kDD@Ob%pOFn9F%5_73Ml2HeQZ|owrX23|LoJ*cztL7|n!sk6L-_}KR zO}|lm#G89~;LXdUlv^ffgYvyT=GqXWGgxd3^lOBy^Ee{<@{PHp)2@Esib|r5gGiVE<@)^m9xyJx=)SM$MgxPB+OCV>-N7rr9P(%?LGbeAuw=t zY6{z~4w3j-qMb4iK5K zad1d6v$6u5Jn;rWFda-48#}S52O?u<0O%Wn9$a47-@KXr{hQbm%OaWp0&4axBt|HW zAx7A152g-gK}uK+4-Z$9cp?z$rS_GQ9G{%LzPhTastW(OxV-FWZVvxfDU+k9xHuv_ z95A|-k&~mnetv$Ics@%6xP;VQk56ka0ajK!oPlStDA*K|ylkwj54%CnHu|Pr{&znL zk_;7FTT9FKpFhY*NMb&ZbYf!USwLVw-ulg;xvmWR4%+fP5`1$$0JUyTG=(+at@%x#>l(4z-Pqm$!xzd-QMHq+ zPX2F=_v1*eAz{E@N>Yi^GcW+QyAt7h$mSKm%3x(h?^SVhWCJ09bn?@dC4_(mx|9f^pPAEPwa*f~OH7j6y=M zKjceI_Yt~(_&`My3DErj4z;wjBuALWFjO8z%p&R+P6D-RPZJg9S?1KPyI}4KU<3s; zjHjjcNLSV6wY7h4Z_{~1wi+J?y_~!R0Hblxq)04;rR{BOc0~ZuN{0`=a3XaNb+gM_ z1U?+^mEYQfsg@T0Ps9N8s80aB6-N>f^cb)ahAFus==T=)07)L``T!8~gt8|jBuK@r zE-ZvlFr`6j!4F9A1e;XEeF?#cK~D!}Z~bt@9Df2D5>+}^%~szl7LU1nJX?w|$EZS_ z1SIH|*s{yNomvSuy3fDQ&iB^&7Y0$5)3t5aR?q8}ejTlS>r zl|v2Fz}bn(wjB}H@)21|?~Kj)7y(yKGlT|XQFCV3p zI+c0BgdhT5SJ*t!pM-?|Q!1$=#IZeB2O@7NttOu+PHMKO+TZqM6plw*s>2fv`c(p0 z=m4dKif+gV`6G_=ph4aJS&j(k-=(;E!T+S%HNb$^mPvReDL@iebrj7?E^8D&*hGg{ zHS=>hc9_wuZ6C5%!y6)Q7bQ~HG0irUCGWtOFUp4Kni~j9>eD@`;1~{pv~f z@cD@gp0{3YRsJ~G7+XoY#(0JE0|~JGBboo*48|5@G&!m;Qu)gH*FlF;?{8R94vkx% zza#sl)$gEu>j1O;2z?#9MK*Jf4TI(@DIAB5W?B#18#N6Sh-6$i4Nm{ukeZFl$mV*^0VO z#OQ6wWzsi`PJH}zG>*dt9 zFYsxJ$kQQ8*r8Qprk^f+96N|~lInxry^(AAFlhqnj2{^O!hl(@r zdAFyNYYrofbyCpU5N$e7jSQyPaEF;y^1ZG~vaFl?Wa=dRxajyzX*J)pQh*}Fqxpw+ zBWlqMC}W(WV1xuep<2(8PwEBUqj@&!e9@y}6tsx(se&&*BTHpITN2}QDZe?Zsx_SI z8om0l2MK03H+cn@Sn^A{pebDV%fXxBlkj&lC$UV<&VT7f5s0M!yLb4KM~?Exll`!< zurqEgBgReB?jM+DQZ7}@1%1Qw5xkGTH|L$ki~_?d^20t+NqNNa^+Yrj?6q)-#IuoY zTLw9P7JjP+?;%mVenp(i&}ADgj!=qKQ*FN{!nR$lu4Ny246n^#aXw6Wf!rmI_lWx- zFmq$BDFu#gCHLmZw&c$K+DO~U97Fq#Io1Tk1yX+{afJ@a`BxLyQA zvWci-AoV?o`PFZ9LO3fXQN?sK7Li;tZlO<5Hu>)`@rgCzlUAXAgK4T{uoOm0`;xu? zU0b7Z=!h7WDyd{X`pK@U{z=A7ay~pPx%quJmmj&T+pntD_XQ>S^PFF@+)?6^tSLVo zMJfqKLbB&9xBn{UGVwg=iO|UHG9x9tmXzpw^$RRMaQ1`>`;7WONz!8S4-ELUDmE`% zAlB<_^Zt@-g#Q}1c{+G-1@{D+zL!?=_O?)d(*u>R40!iTk-GlvFP9W?=lGF*+v>`o9Q{4U#tDfRyWNS2I2B&D<3*4n9vtrurmxDc75g# z*38Scp)-`d!z)J{X9_RAuI|rQj@=`!7~$5^a+n!r2LJ%TA_-H>;BWj24fPR7KP{ij{nj`B&wxp{G+{7P2}(ziw_u zDe&db!L%!+&?Z1!+lu$^2?Qo91O$-#@IF-{@q0tzfXONVt^vjsy2k&k|7J`0(GK`> zch?F)K|+8(6x6OZmiYV+c#sJMpQCUlUrexYv+ui4WWK?sfPnt`Sgf9p63pekzQmWL zj*=cQqFHI~QI7qclhN_4q-I%3CJN@~FO1OS0mH6pRNTK-9vY)wtM>QU&r<1q4dv_^ zk_*HijFLucw>a8Ta6PYA^|g(zGDgW|35HfQ8^v*;82u{IPa=!eJtn}IDyPprbu`n>A zq-lUTdwzZoadB}eDR{rt?d|u+$1${#NJ`gMRs#I}mxqQTrD=dSp>B6I7IKC|@oZhyUq2D*-_j<@0IeKTNqvfJQGMkSSY$ zgoH#-PY=NaWSLxCT-DXp07Ob^@jM{hmLe3yM}rQ%v!N98O-oNl@{9-z6AgU)Ju%@F z7--sx9T^3{?_pE~TQAtvh5tpmAwH=MO;ta^y;TN({}-0oQNfB$(ThP|!H){plZ9E< zsZ`jT0vUz<(qnbI*7I~<)5YAHf9;i{{K%D7Y;lnBF_(o)5yopyym>Q`wJhCh-aPUC zG(Br_>Y9?sw*`50kKe*l_*Ud-a7@^nf)5G|xzyX;Llr!r*pmSC7gpBRfzNllIC6oH zTa>c6LB0-1U5a0N`^Gk#@Zr(}263%)7fg zoZII!$`{OlmclkQ$l2-=_ZCU%6Dl;%E&VAFWM2`t}z+4+P~b z6q*J;7BN>17M@4wY|y%=u-9FrFATHJ0?yqo&nglsY8wzAC99yQ9S-@DZm ze%o7kR(8GE9M+0{4XnHWMl-+0YIKsFbSlR*VnbRwScQ6 z5borG9sr=wiHna1rjK%R)=Y^%VAOy8`nA5k9)bfdg4&d&im)aK@9m*p0CYqc+;t$sJvk&!6ridQ!`loS-Qi$Mq> zor2DA;mD8Mj1nPm_XC+`l3V#bot>SvCDVq(zEAg8a}|1kPb?$|m`Wp_7j!UR1zZ=9 zQm(JRvwh=;OXB}(UIbYBB-fM4%itOlMqlZV|1_V2yD)Y<9uSahllCC$R~FCy-(! zs|L0?4v3mVl8K9lX9>um`iK*3qH_Kj0!Wq20zn4QA5t;t8yQIeibkwJKu;Le3PkbH z&`{tM#-X8hHth~1FAoQSJ|`ssoj`abKyFA)tfQ^1t*7?_I6Wguzb-BB?xuud5r2>9 z=8@|l!EMq04a3J$To1Os523O{nz0IjR2EY2)NDbf=u)!9d z%Ma@XN*+LT1Xset!>l$f)AyUPWgiM3Lg&IHVV+u7e zInYaXT?KKzOzTM3@|WP2ZV;Kc}U)1)ijp+PA4h?qe?+*^&OE7pQjMyb*|LzDdL;m|}7+A*Mq zR4j&G@Dm7f)T`4bFg8c@M>ZUAZB8(+*DJ<QZxc%dI09CSbKZ~}9ufK3Ltr>jxn0B*)WT`4kF%Qp=lq%H{mcxWRL zDi*%-xL1&9+VQcjqr+HVU%q7aWxwWmf4<6S`2Bf}S$E*`;~h|BVC#{Pxc`yJ&BH^z zs=<_&$!P`!0NU%@jjcopQv(A9W#z}Yn!rZD?xQgT`8vSX7R(E%XKPP@_<8d3e9{x5 z%z(cSUlNiDqX0tN>FUf39$RW^s+%b{kl-YvuI9l31`ieu#5qgJOneM+6tudD8jE}f z>SnzM#usz4sfB*JkMISztYKNmsievC@L$3I+=)!r`Y80!})0iJVTI%!S8XKI@7btZuRH&P%>qZY(Nk+{3J7u8|K%g+xy ziwwXU<>yb3c_{!*YHG0WH0AyMML{s2f~RR&qQm(C3M{wt34ygV*8b5^z@|hG2W3aC zwWcQMdcg*8ng$Mtm6a8V#|>CMMSQT<*6_-hLQ$xhM$)&MvHHO8&I@7}C0 z({j$tVV2OyzqhgqDFSRe<7FM3oWfgBlkeNto}7VVXVp^kcbO!lzyAhWxo(zKS4Xs9 z zTaz1&^ZM-yDt`Pqb{V!9H#V5I;g6vQ;U}(Fl%~}!=2wC%9b7##ixIr)4kQk=oI7@J zm80ss-02c@vQ6t5xRK*TkK}a{*$mIwZPSZYoBFR*X{{rZqs8p%hsS?rq!E~Zb{*PJ z5Xi5YER^`QycYhEwPyxLvJuV?Q(HW4xrR)of)NLzON|UklfE3rQyKoo_jgJj$T+bh zR%5Iw8gLZ)@HWXkD9p>ggwx?b()U=vEl8^JIHs+l9ADvkNP>rF9~>0LtY5MIx04Ov z!cQA!?HXn*I!dBK+moF6GKTs?l$OW`4}f|U`Cz4Z!GtPpZCKr%Y{i*jJ6ECkdiSzL z#}e(Yw-Eh-Kq}jk*-tAj4Rg*N^X471R{h7_AUklT`jKqTnZ3xi>EeD`P@%l3O(a+Q z37(^OyOJrYVSSfk9$krr&5T{9+4xDoJ-J# ztd8?$2KOZXdzK_k`Vry`xR%7~-r}h7e@KqRRg;W1m}I;2-{Zs0a*Y)D81mfne$+Z>e zf1p+3DNvE{Vg^cnz@;((>Kxs;F510VKV$Ded=of08z--M0ywl3l5f;I>c5_e z4G??n|LdMG5=_8r-%UTY5?Q&cv8&@Elqtgx9Ki`q^YVu*mhOJ7D8;Ogu{P%;ajHe7 zi>Ff;``SYSBVltj5JYt3K;Vt%6J$egj-lg4Xzb6nV}@F99P;hgNnYwJX-6|88OI|F zVwTGtYS5R<<$noRfl2a~KGy;Yb&ap%qFM4gG_7DkFA*dfirAr_oWK2xnNIxyoFfpfDN36Gr1dg%g2=D&T)0W5Rs)28s-MgTr- z)J6F6WpU~FAAQ6GX=GD;_KZE@)Ko>dS6~oMiYsJ4*V4yMVZoOiWGgVh+pmH+$#*}; zyAPL>&mJQG!IsLYuyfS8HJ^kCV;a?9LcsbLqX*e~pd@@6Yevdklx;BlE_iweAmIZx zk;C(%2t1%^eA)`2+CC>;c$i}H=F0C--E5&0<0u&GYw>ayr*ES$wt?=1yRz(K@ppHcG4I>zs5^wJJy2{+(&{ARcyk;H6@Gyx1- zlG?b#g3**!n(e}&J&7Bic}Lk5@4eZ53m5*>yO4(q69{$~6vBWRu)7Jyi~smq{DX2e z0Isplm8@9v75q;je!kg-xn=;G=Pg^h*gc)=_fov*tXT!jcwb0uKzr9 z-!JbMJF~O1d-l>f=f}^ttvPvN=J*fk{I{Y7386(E$;$RDZGu!)JeDfB8I^@Neh#8M zViKu^&p++P0;n`-e87 zj5)&OHA13IJ2NAhYXwB;mw%;JYPKHB{ENB@w~k%=IM`eGX{6i7#wWPsF>tJ6>jdb; z6#o26%})YeA+6t69qXJL9uQn8;v`8SCZcuavmm0W&G6iKW->=o;GR08)!N^Fo@M%E z*x_Cb>b-6CwZeu2NaH`UXFEU1)InUgqLYXR)c%mrm`jW2Jun)}(W^4jtxUVJQ09!t zRDo-WWl_`X5b{~Mwpjt^Q#dHi+uOcN4E#K=()A~qYH`yKf>5^4kI({Mx(;3516>cXm=_OcWZ*?X37?(>;wE%|zj-;8 zc?kNLDhmrk`~5p!g8pCdb?=bXf?fj8l=w3lZIO_4tB1fRDDH5(M8ZQQr5^~LF9?qF z5C9Y#(te~42xA!L2KD+|Sy<_7fOG%LS z@(@@`{>NbjF<~Mh*8WxPpVgs%aniZJ+?Ns>WApmjiQ3>kSG}0*CctoL$rO6y z9Ff%0B8rkev9&uRoAK`Qm1-JHnW%*07nsMw-?THdRM}XvHQcIeAN9_{&(aV;Kd|Ab z>9J*O$zI|l-a67=T~!Fik~$2G%FNu0lA|LU4L;9}OkX$IWeDwU=5N?}gU^BAl+Amq z;*&yCrrf((1mv^+1x4X8aS_KF|vq$5o7_h9O&GEJy} zboN7QQ1Dl=*@NJ!sQ=qX9BgeV8A@l&g3@w!oN~;tMLh&v`%OaFI-mDPWs(BpWgI9- zlV!&`Khwxoa5&jL``tt#4EMg;&iTL5V2#X>#&nz++gRIL5<6UINXMq*=hv>Yp zYWr9a^Fj&qy$4f@tJBKs6sT}WGz-z5v~9uLejTS#f|IE`y&pD1qwIV3k)iMR|j%u{ZEYWJ?M`?)+9;(=m>d z`AQ25$pV2LUBFfO_?iucE-HYxL}|`p%T~=>1}c3_=heQSCzbf_N33u6GrI|d2(w8~+*v+`Xkp{ev{Paajw|rSw61SO-myjqU`2TJX~R^d$j2M>A`UkZn<_W ztPl3=(Srh7p^WVOeBr7{WPqP>j2=qkGN9n|_EknNas2dn*~uFX@-PehXJ=QP5VH6i z|IFIq-qu}vez}`tLCtpRq)FGrm51iwNo|@YncYY9G)#+;-oX=G5b{|0^s+8avWiaI zT~1NO$n08KY5Kg9lCjl+v%r?`c3=JV#BjykfR-XgjoZxp($B2@nLptRxjngk97Gc9 zRf7{}*Q`*7!TX?6JPes{6+3&)M@27>Vq#nX=bO za+5Un^qil4{WG7;fEJMs^JRUlOe~oV4qeKXDE;J~TCGrhS@n*dqHBHb?wUWojcY~X zI>v%tUY?OaJL~u|OaVihQ-liQTt{DQP{Rao-2yGa&lLhYv1NQ%qT=eV-tdU;g?syO z26WB*W_68KqTDy;YsLuJ!x;Z5`84zTb($FX`r6pYQBDu*nW2lCFmro_1Vz5*YeV>1 zc$ftCY)1^VMV=Mh*<`8LcGPvW*9_pobGzbCB`=wLPSF-detO_#SJp?;=k03Y5}4T{ zj+4**u{tJ_Z4}|$PVx}|2cAD~EvlQmJaivXc_}q`CXHyRuCE>40xBhuQM1{wEA2)} zCXCNmn5#a!{}h^EXAMC^-B@1MURw_60=*Z?d3d_TK>1PPQC>g)T^`xzMjjS}`pd4m zXxiiV>qDU0$d&lNb4HV{R3E{RS~5dOO54xSPae!((=CbV1jW(G@o&r49{~1&) z-RPnU2=FR5cRJT}BU?lCH|3(6W)k?@V2+kM5rO-fz(tV56NK;2cvGLvhX$q2l;=TQU zza>hSfb>!D*`1hz5#rw^ad9r(Gp_wA$kW%=3<$}JAhSb<_&MmQ{C6pgIUs(e+xgA~SNt3ZC(SOI|4tmsb@M|NHiimF@N$8kFMXsh9|Gj^2s2Uz zA#x2aiqYH0a1EpxkV-AV{+I!R6*SJ2?jOOIcrcf6nN1-6I=WxHDWk%|ox&7SPZmwAa3L?v0zxc|clPxN z$f(1TQV*9`4~{OfY~_7(_K<+p^$8!DC8nqI4HT|#F4L_lO9i>OZIuNp*X8~JdDzkl z%Rk(VzaSa_yW%~}cSTeWjgoWQaf2zEOK`yH@7WymBN)z_mB6I4yu>T+jOd=ccd+Bq zMMptP$!lXXQ?v-rr9wkWk!Ln5`G6WmLga@xij+u7W@=oik0R=>4h$GNFdUUZ-b0)h z$Y=EVCamI+;rR%B^6^Fx`A!?sx40bN#ZV0R%FbqH@dJ2Ux62Nzpm3&lR0w9z4Pbq3 z>}aT|?fZAdwT-oz0IX;@3bJyQXSFbp>tns!r`y{jxL-?CWUZ{6oLtgT5Ln&pOnqTk z{vb_QfP(aSKcP}!U|xIX*oBt&{wPs1NAEB!0a(+y(x@SMt29CFE1+j?hgT4zT=V{q z)eiFPbR9~MB>dF(@}c2@AQtqsh`Z9`QzxgI8?=a0+bVKGtSTLZ8n=5r?Toj!Y#pc_ zt0dKq%*1)uBIH+nB`(GVSL7ukzA--%-=4W{V2z-e&F~5J*{iqsT_lZl#z$6sr z?3!Cp#la+YyfK&{O}^p1+HW{fT+&FrL6(6478TMB zt{%(pru9-=9KZdD`*z7bMpf~rh?DMozi#3suJa*F70613H4%wg{F|5{eKL_FjFQf! zl&;QKEGa^5mKN0k6Um2tS15W_0$fJJSjR;v%xPBuH=6yfCNn_2y{q5)VO&gikpTaA`M8{2Y^ z=9VaV*^g_ZkiGFcQLpXWonIxdq?hMzT81eU#EVP2Ap>UWfdz%}+BMj_*d ze_;jcZ=GLP7hPiLw(ZqF3D394^%d~(*y8>c7$sZr`o$i@hwNDf!AZmYD5XI}{g*)} zsgS!$COlkEEh^fXZ?OfZik|8GV%nqvut5X93dZbgNOP zn`=0RgyZeO&Yp#lvNZay9cCU4N7-l!SBYr3_=Z^vf z*!x5N3PJFRj^)Yl>i9LbVSy#iP{lTfJ!xf#3vqM@8H6GPC`5HF0JbD+1l?wDu^j#W zwTE^NOl9YS`9A|awI6a`daBZf z?&h(XgL}aWuZ_^Pps-DvkZP@fCWkVewP}?2%q|Mz=<0GNz z=!zEG7^phN|Dt|E*P2$PNWmvNaBLYN;r-@}mV#~CR{;!0K+t&o-o z-k6Y&QH?aPEtvF>;p*Owl0pSR-kDYj8oamR^V2G4FmQs!I|3qsd-=z2R~q34auGZI zYPJU{`SW;*$%s)4s=!I78%I(z5w=pWV0}Fr=U)cM;))18S5;FTCp?>9ubcvT)w^8I zEE2(R*+M?rm!+*$byte2s)`ymN^%}@Mgj$0XG^0$4o#Cfyp!Tmbv9Pl!FP;QRC#|o zxtJzCJWMz^_w~Ob9$tN-CExQR6D2rNW zsVHCiPbqO8*bVKv|OeHPQu7C9}Dq88!)?bt! z7oybL0n-#hkieEo17z6@azsz6c(}P=73GH_3gbxs8%rjcV1N zV*fmUODTA@bbdd=CVXX3z0?=z6NVA6MAH%QZM5Vp6JE_w$*t^WZ*e$)pXp$03J^S`jD@&H8sF z#RJ!5pqbo~>SXjl-csjb=-M+m5zPI`=4AkHEuo}x`R7zRLBhQnDFuR(k`b$_X#-c4 z&sRfQI)-mdc#X#q)S8g=$%BZOjoHikR~~IGlSo$lZC}be%TMyCbvv|q+A;SmROf{s zcU>3rX6{8LUT{CNP^?z9+Wj)O)|p@B<`!J!_?+eY=BW4v&gfDy*qNet=^lK!p1H0M z3L2#Mxo=H&(cl>v9q_QXo|)aQTSCEY^aBDc()f_{xSF0ofbg-kNT+XzlK4Pyg0<&0 zy)`*iH>_%DEGql$UsEOX;Oal>&$OpkR<%`Y3$tFtf9Gq9>Skfn6^=aK?(p=~1)gUP zU`g699#jtiBsCAWeDXr`6knn(vtpp(#TUQE7Qw;C85%3Ps?>%|a=eHjoyNbWplA|N zh0l)4&Oy7$4mfz0abQ%!@6V!6vSW3qK4{w+528Uoq--pbXnMH$IMx>CK2_M#|I18> z%^*D8YOih-ucu{y>h686` z_D+|Pl})Jr-pr~%2Fc!QaeKv)O7zEFNTy4R8dkQ-eqk%jDzP=&O}i%?Y-Dq7D@ZWX zih6SuZpsaoMQF+`lmj6LGwj<_{r*7D#6)!MUC8JXEC9Wr({D*joo!0VY-qWEPgU9p ze45mitvrpqdQEhO>o?8D77to4U?cEZ}abr=~Vo6LR?_DX?Mh(f9+eGt4{g z(IHZ1YHm@VtSBKlvm!BO=UVe<4JUbL)HMlCPVkEY)-`@98Lp5x=)WZeFMVZMoYr)U z7bZ%SG7CSC)#kH{a~@DML<&?nW5h`p01^>qUN0Ge1BMJ*-U;nNpkqUWq_n$T7ZEj{r7u>^m z#v7jb*mkK*Hg2z4^s{r2B8m&<29k4=yGVrR0nvSd>WBe_z)GXz4+ zIX!$%JgtL$4Ky!0P zigdm<%$k~A#B(bTR3m*+DoR=YdrgOs!yib8dGanug?jmrnGeT^EAGj^o8VUS^z&{& zkpl_S#o1qf$C>N%wX{3?FblTl-Xo>u6pcS6NEli4;)2&dbDMMqL)Vb0Ql}V)5Ba*n zsuw{M=B15kYN`kp<#2DV6!Qc>d@x5mi*U7iOD_QV$TV;G~cW8%>ua9GNmTK+(zOt&!im|M8Sz`bG z-c=6|FHxD3{c#(?((dANv+e)}DLq6u#pl>6=SLQJ$k-{#jN#n2l4M6l8{;}ziVrf^ z7wRxfYz_C4y{)Uqi%4mU7-7-Mx(RB=Y!~jo)Mp0_7~{fJ*`39Ma4u&M{}p1faK64oxV(vJi&uW3qpwu$u+*L z$||;lb83$U`VN$Z7tO3=`S zV89mQzQrrt5g1>G;(D6!ikZm=pJY1@B)r3ycY6NkaN$3!!=?kK;&vSMwH>Fy(Q|7S=Jd zZWDlIQANJNsflze7ux3P!FAiGu z-p-GSVu84DkQywOPz>vvNNDV`K?*_n(#6OPNOQ+40i|Cfu2wi5&{LhI<=sRYfqi{G zJ{1$Lx;idFSqqqdgS}YfNGv)UbTOJFV3(tW-AJvO5ZXTe&EGO<84hyUK1cL#%lml5vAUHi9MA_ZoGKr+fU*V znv@LnTHf3?p5>AyO4q3z@5;U{H*~d(Jw)de{M_DJW>dA%i~bHZh!Ao~_Nd0!00(}$ zC3ty*JlvFZ?TVK3iK54YEu*^V+8v&qTI-evWIyW#S0(olz?2pqUp`5Nv~vfc{NVT_ zhDb^DV{jOfKE35=OaJaD`P=bpYgtr5NlnSe9h`O?dGBNdchl38LL|@Q>h2=CkrUmr zXhq93or`hWnL-y3+D3?y#=C5ZZlrc}GwF^>D2n;v`@I>NgdXs`citpb=jW-DuL>$o zB}3i|&RX$?|B?}`$uvKecXD+1ovUT1+>Kjr0++!RG`IElcBO{_su+lkCp?|as~rK2 z#T3F5H6ARWDiL%8p9L!?T5t(SKG)t zPU4O>RrIVBC-jt3FHm|(2pCWzp+jwnl zEtC|M?ru$VJj?YwE}H9LkpC{&hP)(pGJbM^Pb0Nr}If;v3CWz3oOY;7xkF@5V0;;ax$<^L>8icgLfo6G$)Z^7y4N9LiAj@kD$ zFqTV_R5_JZ0f$Tzv^Hl2in?@Qvm*0M!uF-A8ycRr@pfGv$P%S((hvxdl~qXMaxNHz zQNELJ`OVx03n%>X*EWS;w*FQllZdm(2VDU?3VyXMne{?RkVEf0Ty=7Z0A^U*Og zz(oSE+eyltiMWCtE;pt+T9foHj~1Sey&b#Jm857|hRbDPd?ywr?u03=&VYJGsm2A6+<){K23Iu?}P6B3#)xsml`;`vMCmf!X)Q zfyg9Y0>y3GAH6PS?NyCWMl>s2R2vO}4f+_V+}u18A*Y3mBD97~kH~L;s!`?<=PHJP z{8sW-A<_K_s(APQu59*%c(*m(I}GHgf~jBL%w6O!%DkqXk>bT z@X#jthI;nz+=+psqvH?9k0D=BR45rGTK->{4c}WwV{?1s*w;tjZ{HksXXgBe(jT&f z*iH}6`?&Yn%PT7_Uz=-y?khHReUfKaa&{6(;tAatUch1=qPA4yj+11B?V!vh(GLzr zuAyZ9qp|Ez4&ra7+02M(Dx!!q=kw~|0WuhslJC(UunOM7U+Ea91P=+ReEp|N+(d{O z2Jw5*oZaqk;{ZuXQnGT_M(%sGSfXRgbS;6jbj`s*ajoMMV6S4pwsbP0a&fM&%4=w{ zt1hT9us5%6AuwdBsAzGp|HZ$$prWL*wmui(-QrYT)t1}YS(6LVS_!^j2Xq(nxU)MmRi^Lp^!}y3kqLh_3tyfsO1}FI`O9P zGjVZIduK?ssq^D9wf`<4pfx(mBpByjU&qhh;A!Mk)=}V)NwtgMURGu$Q2rs}#$RF@Ip`bht?DbV4 zi~U$M98nbnnmuUxZ+(pDkFi4+7E(KL2|se@v+%?rXY^{QS2})*vGTd_*YNHis)%Cf z%wo5NL0duO6iX&hTd*?jLhA74DFa2bUvkm+LV9~ipp;96hRY3=vo0YI_F!EK;SeK~ z0##JEOcJ;-74<}TcWW9jDy>Y}t1aAl{EH>$UCo zh8B)Bm6d@ucmYMe z__6Q&cf)VC_6U({)M3g%QWy~#YxCouDuWi(=Zx2HZj$%>Z)Gt9Un|$=fA_avr-tQ* zOq}~{vw8kO%8oN`SJyg-+~_&S$Z;#b5u8eV%H3Ty=$W2&x9jN2wsV$74e~hL+H30M zC&N5UR#Yd9SNE&#zfFSdE~a2_HIHLsI(uGCDIrK(XQ_-<@SPcH?9^5JODo*pqhB@4& zi0Q#|2&$@r-}p1JjEKB$;XS<@w2`2S>3{u8;v=r>c@O&9FG3B`M=0Rcc@wmE)HAco zdQgRh2Wl(6eJI`tqx0hk$oM2C6hdj1E(oHD6AzI?xs>ams)lbbW09=OI-mtYwAT+`L_G zS)9%f9^R>qnf17A>|KJ?_s`2*lw5Ys%`#+WQ(z5!^DSY)&&L<$3A)<0*2e3zBG{*v zzctnz3U82%P1#vf@s%n3S*M?d;>d;F<;mo?TSSa|i~Y-4)x8|VON`^CZ1Y72Od0S< z{+fB_xY16>H3t_D%>uJ(=VkT9a>8OGc~*(b~VL z)&ur2z1Ucq(teTTq-ocz*!!zHW=T=Ya=)nBLN{0jE?Z08&{mR@hl9(_p6Jl(ZO%&* zYX{5q8BKacVwE^D-7^@ogL&ukC^6s;&2!Th76v7v;Ci|%VJT$Huav-> zRDLWbS4c&_8DcuIIl8_iKQPb_R0c5SPc-g_Uxz1ggEpcPJv8w}P3~MFvArUX@+Tk; z6-5`$dE~c532yHWpL_}*gN4Ca6F9zHxS66Qw|CHv4~RGICjs zq*1|D^CWxFhdh7w@A0cZBN)D1rlg6$4+ar-D`EIyrxsk>K#6v!@W#Hh%G7^kZvOm& zxb4i}1>Gs@`cHIWfqbxv>a_IqL@M8&T(v+r;g*g&$a3YBS>M&QQWfla4xv-4fJV_y_g&MewOBJ3Il0`cY_@ zN(qk+>MelS0^G_k+LIzn3t4zn!a#$k>=+=MRFv5S3C<1mXwH@UC$dW!(HmZG76wy+ zyc`f#xqo|n3uUB7=psQ@)hV63sHt^Y!y6`F>cWz#>Uyq~&ID^pN<2MnZgzC@toXf4 zUf8>Ixfas@&kR#KyT7iIT@BoG0rWN6Xwwp8oYsBs!uGIVg6O-Y;FBK>v$xc%`%&)# zCb{gp^qBW(C3~BhTLg{sh~9G@^!0}<`A6KYZQ|pn8R$>Cb7}W)Oi6yRP4YYN??OIX z3fsdUQ~}6AAlVPffY*bZn;uUV|IS2LCJ+ol%)W#GawtEvj?m8%n+?&JRE(>hK!uKM zlOL$VBGV5BHK-ylj|*0uX<-;!{#2n&&tgVuT@3{#RaMymEptQtIX>q6dOcSH@He6t zGWeoZw0sbV@_TBScqPOE9(%BvbgvG*+Gn_SMiGil-P&u0&S%$Z+yr+K<$*r@AkIP? zvqV~UuNK6emgb4f`_!)?6K~tOZ#0F~?)GLOG{@Qel7|90pF9-W=w)en8V}Hayw~a{ zj^ml4o-erJ@a0q!aeK%x)jyj|jD2pf2@z@gW~07UUQWt=frz!- z2$3Vsrlu}v;J$GFkJiUBMvtSGM*FH?w&3WeEbzw#bO$Mm!8jBEaUkF8Ih;u!x z;R}Y3-So`HQxjy%`(o4m96$wlfh z;&}BT7quRGxoW}Q z>5`ur6y;2dYg#f(N)*pF4Q;hU*ZM-lTU&9tqxXYh3FdqV;)L&GNYl_8$ch&B`eAXJ z6omf0nZL*GzfDcdy~R~zzLCZc?y%b*2P+GEYMC7aNwE|-MjW;7m-)UiO568|Jq%UA0NdAohs@Z%Idy)deTD0-$cml);_~}MNPt)E_jx5kbOUBmqi{j&q}vp z3YE3e#jkRU_KqVvcxg9vcFjM+IvL7H@!xJN3HkLvw@-H`TRwb}junrEP0KVj{Zm%x zC_bx7Mrf)DB?nRW(0|`&sTD#M<8v87Jz3ZJd){;lzkA?@dge3-fsl!K855uu>08|NM!cls@+=^HF&MV*a_ zE>l)F+beF@6u-3Q9HrKC)w-+6)KSz#D?MrQ519!>R=1-zf^B~9*t%QY@re=C7dx!s zU)LxLX;Bx#dXH_lCV{_IUee^e->)~!n2D0gTjp%uH~!HiFONUe;e80ky+$NkopTXw zNNYZRn6RE;SG3OC_-1uHp8Rp4&92gIhh49%XHkPI2GeJxc6u+P7R&%RAcwQbCL-A4 zZ`*W9kC3sC0o1vY#7Tk~{fYhLlN?f{Mwo@cE&I;Qt9?0gFG)+%oD#J1h^(@V(MKFa#g={rTH)okM=R_Hu~Afm)$yOEhq z@>IzE{Xy^5g=8>^s_L)%)h3X$0KqREs%Z z-k$!R!QGVIe#AA8?I6`Vaq|hTXa5bm(32{2cJVhvn;Au$^7@yK3PxAPRJplvHu2YG z-sRIC>B05b5#`qP%}u*Bg}6oA9u{HMWFuU6vRst2TYD7i5g#}_-{??hAy{`aU$xQG z&qpQBZ?xg?_!)Y?=8{xh?K@CvQRNh;C|F;lSTpy<^q=ghAD6H0gxKu>==Zv9{<%t-Ubr58YN7Cu*3an<+c(yKxyHs9BD$3aDCch$ z*M>dR6@jumY?_J|i$;zx;G4_8cYe(4%*3m2(!GvL(0c+UGA2q1Ro~E7M^p^dl#5`dg$Gt@WvI;Vb47_s)TbGJvJFPWanZPHhlNn z>RLvxr|Z2m-)_KBtY!Maur3aayKJ3a{NBXC5O8F%>7OtwofPl^ZL4DeS4B9|^Ck zZnU7Ph~zdFnH;LQ^PJI6waT$e+2EYgNGq{3$Haf--L?2;fMj80GC#Z2Gsk4?5Hqd$ zM489FF|t}~=9%d<@ABht#p9R&%do?TCk|xOMMRfXh}9w*rdbwid#@r-P6A&F=SdPx z^&x-Se%pzT$uRyWmfio)*BbXg&6?X9w|zG`AA30DhvCE>_=bm8HR-Y(+}}fh+HeH3+~PI80yjnUPY&YtVP{x` zab?{M=}3EPh?2!638g@B@uv>INRH`U)l3o(!Ov_{7E9&RDPG8m_JOJ_MlsSgBGCb- zAW{VhHeWeOaq8iRol0S)H<(s0e@Ez7b%nw3a|T}hN8;d?`687>9OyrtfqC&?-ACS^ zdF4YkKiW-mC?*$&7P}WS>OB@UGpzNE4a-BaGcs!%I5{}D!Y6DNHRvpaB8@mu$B8R= z?jL;b-ixqd>`=%Yzkj8(gX;x#>)GAk3)`v|+-E2yO%r&>j23Cal>C1sqGi znMN;}e7_=Rcwebl2q*SHvSC76cj5;zbEo(0)wl~DlF^1h4R0zSlxBLufubQ#pSLnwI{mtL>`=AABHp%P{*0e-yvYvnkk}Wq$ch$! z+ADzONUj_qmPy_OwaMUgrr2D!MVA9PMJ=SYc5;ie$|@Ugf5dLUqS%kjW~r!M*DH-|j&PTd>66=VLv>m6vvDKaRAlw4bUugnmvSoSx=OiH|2ev4Bp~ zN{o1&AXHrnG&xzGMei(d3f9NBg~gfCfn||gXQ$4X96Lh7U4jJ7C6zeC^V1UxD**S* z%D1=|=T==1=Bw%8XCzi1Rn}FM_ub;(6*k{-$#b3*iap>10bOWvbljP*GKtr#(#sRSd3g`+Ot1;_K?#`)|U;&C0~Z zXkY|vWtcgP1Al`Rh@@%8W4aP4MAe44(?NOD=-LQNi?;*G;+P)1urL%qN_5X#vGp|9 z4?4gr2<$yMc^4IPc9N=-Kc_s@@2~635 z5;#Bc-wK|m*2ODr#)no0Oe-Pu|7>TO`_3wl8jw4zlZv?eZi|f;8 z6d%5ui0G}rnCQ9sJKog@$mdq$U zXQz~cU0q|^Jk|Vp?=mOec?J8QiUj6>qrD z%ly!WVE546Gb%c!o#NXsYD8FCbWKx(V(#s>dTt?=jizAzoTNfcE3@>H&dNMB|19px z){cwzo_C-`NR*t{woe0ANX$3FmQn{1tn6um1v_Ph2m?lkoa!Z5#!I}&bL_%Wc>e;K z`d5e)+c8K&PyR=%LdeK5n&H6#gZI-TLpB^@oRk>QGow4#;8Nm%@hNVLmYX#2ZOxSy zRzfo_3o}^8LWZ zJOBQn^O>02Vp+_?san0Q`;lX~-m#eZfxdVQ@U+h}y{>1mPIc`l*M99n7mGS`I!@#* z(^q^-AQX)_=t2%OM-Fv5K$B$5x0!FLv&<@y+q*1zSWIs3>KfqRS$ZMDdvyqr7v_`M zLX3HE41>sW)%a;=QsvL|tTOCuGsq^e9;Tn?7fbFN4(~nIoh6iYsZH3E#>M}U{8XkF ziY0RUPP3bu4}HCWIpp^!UAu)uZT1;G0j(>R6tcRdO0ux$V~zKktbqC6w)z)hjgsL7 zqG(UQSC%(2OaN2SuP-Xsh5_+^tbb}UEF+c}zigccm5vR3X?TVWT1JPTU>$sUV1UB+ z_eb#N%|#rryI5`Qe^4Gcr={eROH)s~I(IPl#Y9OPv0aC%Fc^ zwqSXhPn@Ek`j9!s*y9J;Jq?2iOjC3Q{?9jACK7)(ND($bI=4g182mMk$4z*GTvxc9 z5OqyU?4Ey44@2Afw8C~KJe&^N6Exa`z!Wyhj<;E#F%+s7hBDE>&#I4?JU21Ww;b|N z65c%qXfed)w{n;JRRtth3}*igv&Qb3RZT@2Bvjf%>UkM_==5%iu>8P>>3~P2KUdN} z!hnN1{3F^lWy^!Kt{+Q%j6f8v0XhNW3WjWKou==Q!AOE~eH-gOmhre7 zY+4h%F0kD<^pHpraNyBR`ih?@J3O%A%@CMHh2fPb^eD_2<#^)sE)OR@={64hEx!1q z7p7kwdS1~#{a13#u-%Ls?Rjz}!@<$de|N6vu}7|Y83LIB0qmK}_xDb4XlEAcr((3# ztQLy?9L^)Hf7M529g03#6e~e`OQ00vJ*&VdQh;N{Ci#2XoRd~*eRy~8Q)JfX;OU#J zU(-sK+N=vJD=+_HDn0;oEh`rn&Q>%u>fqq3#}>fB`FQL4;Mx7z4s`#)`xVSDEC3|} zF~153dScl#D001<#S2GR8-J{8DHrCcTi@CWJ<_y0d zlDl3DM9E`mp#t4OH2qX9yu?7KTw_7Op5E(#UU_8&B|}eazkaR36G~oDq`_@Fox$xl zj%Kh0tjW(Q&Urb&^JJyuJW|2fN=r**mVX-f&slh0P z)`E!b5eN805I?|YwY8rm0YDqdoV|;S&($^zZyxUU%J`U5G~LM@(jm(8WpGFBb#k3)J$`(x0DmhXHWP zcGoZO;Atgb0<6cgds4!RPA@Ew;p6-75ES3u9x3T>xOLuS0V@0+R%@bf=k4U&B&%%OV>_D=zj#5vsh@V)3Cv)S+1tFnM6vdGGgkxQ2V zx`R-)w6cIY^?kp|mJk<*tcyhv69iQj7l%qxe|ZALqPtc7Nt&aoaT!5lL68ucU5^87 zASZuoA)$_+KOrT7z#&pml%4NQI$-2(yx%tgM3w-5fW-y?XTk8d2;ElzALRV}}ZiTJLR6ucu|VClC%$yuJi3Qd@29^?y?afL0|YCQcC_^84>>yq#@`8QMq1 z6^a=S!P~Mqe^!R#C!3Lc$95zTS0Ly+^ib$M48xzA9UeyT=FFi>DJ-P*heh=wjKamo zhsOpn0<>g_@81Cp^DMkrq+)1WJbjqMC%^Z}4+zMgA}~1t0gS%@UK)hBKSeigug{Ie+MGjbb!xR9gmXJaU*$I&j0EKae4P z09MQYL`_u_mxu@{j3NSnsdQr#o@{P{aNYqvGDi+wb2s|?j>x-FF@-TirI;c6WkT*8 zm|6KnYvXyo%J0p}-irbx1Pk+Jc*<^5^{Z~^>!9DO1U=&GIIu(zx67E*TEh<^>A>kA zcHdoHNl8kA5W61Mz0hN{(_&};XGIiODCq%XuZmxip`f4uz%Z&yCI|?7cfTE?4gYCY zUJ3v9>S}iUq@N$5f9RT(L4@q~<;p550a=@GJ?f;={#zW6S>WjZmZ|?B#H5j~0U7{- zN7RfSofkg+y~yvG4qxo6r~TABKs$u!?dj>+Y=+S2#(@36K16^e`e{f3QiiDvz=FF4 zfQ-<30B#Hh9YL4<9~?W}j+=mhm;DLIa*Cdu92+uSURL&(<;P0bJ5m2vPf-sr7+v(< z?&IEWYxT0B$_FKvE`9v|;Q>zlD+<6JM)!mq{Od35GSU5g%eIqBRLl7!9@iCC+_2=fTrhsh*6+`-=w2VVml70Ka`WWOM`b%$< zsvF5rpT*r69ZHw3AH?e~5sMTKlLNYlZKy`{jhg|{SF;QuWs#tVOBZ}01mTu{v3&t? zQjk|L{^}tYDu;v>tLgqsk7AfZSWV$C%a^$ictenqa zt^EH-)>lVG6}4Xz12{Acoe}~P(#_CagQRqeba$74bcxi^EhPfdok};-Al(d7D&OUO z-}U?FTZ_d42IgMwJ@-8O>}Q|71B#jHIA<}JB66PQC8FXzhnD-dWkMHH*`tajt;ekT z+!#~bf-G_H(Sq#avd=vQfNM0kYv?;E#dD^aqAcrJbuDFtJA*D;!h#1~dn046%)%+$GMYi>`FphX@W$cF z?GQ%I6g|Q#$sDrA>Z`~pEnyEs1V~Fjz?_L6sHmmSp?w_Ze+m7557@S$Z4<6~!tamX ze8Q)|;;-y&%yqn|Cs?*U71FYlMnI^&G1@bzJB18+yU}ijX-t!9mhwsutmFU#*Uz36 z?-w`1S6p8u+-i8|G?JTtH96^T8Yh*9{hH*MhVYjB?_dm!2#~~U)rsdupLuH-Ron|T z`qsc_@01ne=ixP4hV0XI9^EIN@5*P(90?W(}sw4$S<`yYds>|5nfR(YQ-zb<9}I9*8=rvmlBPIZoHG*aTqs}+c8 zY8io<>O0OE7QCqgR;@GDY0UU}Dd$tFRdi^w3TFB6mF$^T!Huc6d}4Ol-Ug~c*X`xA zFT-R)HH`L>RO0Hq9syvvRv#R5L;&eixqm4Qll&pyQCUsiqnP*3GIsq?$9Ff5m!B?+ zlHll)zn$Z}rYT~>jM|`$RVo92CyI9vB5<$6a#GpE1QJyVt7bdRWE)??eVoifI`|uR zVN5IuI~jMouCb~<_rHefRnEHJ`z%+|C>K%O zm9)ai%^Qu=r^=Wm59%dt`diU>MQ2<4% z4FzfqO0!zo?NhQj6xeUUM)b!XfYTP{m~`LTqAzd9y75DQfH?`jvK4+EQsFaUvWMPu z%gNcZ(LoOaD-+N`YGQQanq{vHM8&kTU&chGN~yH#`V=?Si@O%+8mr~u?|*Qvn4O%V zOPDQh{uPQ5SV$!o@xKe>h2z&78ug5rbB;gZN34emLVEyGo>G4@LcTcmnEs@xK&kqLPWLvVS9NTST`i2jyhA2^zD)W+ z%N$2cXkV9L{m)6T#*NVx5=shL>rRi4V#7K|C!yDiL{%D9Xw*g_?>R|R%@C8uD;tLE|=!AfcW*DqKqvrCw@(~XJ* zj0!uK=sHW(PhQidS0$!Zo*~MQo2p(leaI_`bi&}6t2()(55Ot&R|tAmn!EJ)_LQBnz2xYY=VJSO6Ax)VP4>5EyRa_0P#D2|jZ?TT(IrV(M4{c=wI2glG3GkVZ^lB6ohUV4ZlU4o^$g0;ALRKA<9UiqGH7c zud3S&R?f^N$9edn~Irc!{dOm6D~WoYH;`p?CEr%>kTE+ z0Rxb8$4gL`Q$(`+u|iW*D##eMBumYH`6bC~Bdq1>0!sRp*? zUJmU7*K;!}mTJTq#Wy|9ItY?g&It)zy1kWAd_^5uAgKfiajf|t?UZvO;viO z#=FC(G;!vwRU=aS)vFFYa{bIdH6dd3gp2W^kY7tfZ^CIi`4KB+j%8m#$da5oWW(}koyt`B zXVGpTR0RhmgUT(f6))%>!?qs-R-ZwU6PPGu?d`=v72^`7-zqb)NsWUP%}O-K7IR!! ze0de9!gs>zKv`-8%UU>g!}NqjeJ6>k_>HPNjmw{^>Qk(zRvyq+YVDWIyrF+=O#4~De6m`!H;EMocP=%~gfpA!CcjVK zWVBH%0k-@0tNsD~ssa%TY6*O=>i=-~c7LhNqFmkRL`T0|mzV#A*u}tr&z7C3T`~HB zPs>K^4Bw4`Hgv@$3d$OTEV71o;aEbEJyu!ZBs39qJ4KIUC=-@JSyLv<&`-Q~l<-q; zC8iS>TCgt00mh=Pw0>;>AHUsuZIDKjjwDE>J$FJ7RINKU8nN-~1Kw4S9OzKPUwbQH zAii>Zez8LD>S6}$+9wxff7VPKs#4RJK z)qnlU$sh_qNWguH^<>}-&#TD3gpPSeuhsb2Gf2NFPpBp+=#(saY4UxHw0X7Cu2hBW z)$Al+ck>HC+_`yw#i!#MVUy^>Y5J~)ubkSWN{ABQZ*-2W*AoTRW&78mo{L27FMnL| zI&MaGol43#1Of&+e;qDPA`ktR`|HsgNlm`xsB$TdpiElUdoOT(=C z;XcB9Djl;=b9(jE)o%|=25&VBSmvN|6>Fo)fMR0ZQtdQZ0d+<`TF}=j=IO`FXF=z&?+AlBNo=FZQ8Av&9l3KivifU_Z zeNNslnMh1Z`uNcGC>qt5+=Mb60+1a&OV37L7^97t5o_X-^-G>f0jr`tG5{!O<-jqh zEBRk$rN7JyXAXQNU;803QM#GBrkt{XxyV%R7i7z=`PMwhulYl1tB-W*2|7QjaacXh z_&jo#QFToL?2WU=37&fT*EP_N_l$Wv@56!O+N#enfU3a77?)lZoGECpjc=6WBiH4HW-#Ua<#4QR3Sl~bT9-CQO zqE;SmZ=*uU02Q$E0_w3jA42_AK_26JHuldErTfhi+voA^!^#x)(`2L`5BZz{6 zqPGH#)!EXrp{@?81Gy#N5FniBNWZQwFB`yMwE(k35_}PBDoGI-7%0>j5{&sX?8Icn z>IrcQK?UvR5FX%x5d(Fmh_4; zgMdl8z)5?A?b9%Q^_dX1_;OG)Yh5GvYZXJhiKPBx&kFj~9W8%tT>pW<0V<89GXez~ zkBZ3}#E(b*z=;Etc!hsL^ZBDe8LZW&XzIp(2K{sDI?8#NpCb>cy{f_tS)EAv3QT_? zkzfp*@knB)J-4kDBGipBb;O^rxaro+<(gwZqnh)Ugpoyr3Cc1O0yHn?b#mQ9&7IfP%rH1oQ@5H7MM1f7DBRW6 zRnt$}vOt+D;_uV4mkYTmaXc<@q(-rGla7FZh}&D!>M5 zfZx74OOD=iC|}Ro+CN%=P&IouiCT1pRH*SHE(0J7~O`X^n+G~>WA(vb#TTwM(=2UfZx);J9 zE$h~17s5e9&kOnLH{E#N3JMFomGU!H31bTVlwMsic~V4Kus2|V6TLpC-|-tuj&$Du z0m2bmJP8WaC!d7XXra!lSk~l22bTR~5fP|lKAR^ejusZ0K;Q(jky^atQw9d=Hfg{Ef^2B32 zkrTX`KWKp{t&rE<_}^-fsLAe7l95?xXlRnKm65opo28|+(%@!Df#t-Pp)ePY;H&I) z$)6IBf86sWzGVW$nhObXA|=V@EXo*07o|Fql$6w@Nd8_p241&bB$rTjNH6WH`0-%^4n>_n05sk!Ac_mv)2go@DjtdxdM3=ph19aa=f3j30UKCB z8ppr~(LthEVWGn2P143HiEpw#TiYtWanfekCtN1{>X36$a$%tRF=9@4Zj=6+S>W~q zyP6EO1z>FZw(JA2%ZFE2bdZ>ovc}R(aad(?`D1%q%G=nOLo`w zJl7h`M#^zsADC5PZ86^s;;PPXQA}ZPY zh4(m`u(Iv}nQ73ePkx{@e_H4$Bic=$4l<%P0d%-*8N#aFgtY_uq1#Khf>VoP^S8>i zVp;1<)O)^=r$PACwdhbmfMiO~h?G2}B*&-Muu&5=)kVk8nVt&m6K(7_v>&r%XaT%C zcF`UbT*Um=`9I7I!1NV+e}Hcdt^aBev?ucqm6A!w_Q*76xDlLxqVLzJ{ZOcz1O%Ct zidE#YKACZmId5z$*^ou`nY#&L|9)ZN_Ra9;&mrG6&{NM!a^lypU@ZK&051W=a~0P! zH6j{t1uzO;DR6t>hp%nZjKWrF?hb_cg?%fK@-6&2iO~@|F$p_Ur>Cc`aKRn`buA|+ z@$}N%69G-LdhI34dyS**Lk6#Y8$20^leNf{;Z)s+=*9pe-xzAJehznsUF;zjx!mQ6aR6)nGCxAPIT+l`-Z5wrM^5WD*5l2I$rhqi3Y#z=#{687cLS!5 zR*BMRW{`6B%OhUjY_5pW^77f+pXp`oO$-F~$&6phWeqaIqU zbQP&&xg1B~DXS#I2B}3Xribaw&I~fFWPe?JBE9Vr~R$yBL*q{Rh7(^ z#A{BUOo#~UV7h2_pHf4ra2*Mi6jb!cd84GpSUjO@k_ioD(%M#C&i&Q0UeiNY#sb~E z9olpOnuj5%tm*fE&w@>#i@{%jaBs7+C>Yrr0dQzD0jD!xT-o1edDy{VeJe9nM@a)YBj1c(5q)cHNr%IoY;9XwTEJ1*=^}0V=g**^AmDgO zK!^9|{5(k$ni}dmX$vl(0fzL-11nSY{TS5u5_IY3?GFsU{g?>rNrWsTEbp;{de>|GP^tDHUW{8O z?t?fc$O!i}w;zF1k9G(UC-%FPyga<9`zJ(nd+TF{87hes*UQPcxVTu?)O31y2n3iS z9o{`Wgg2voLpA{d0VK&*R3(1^@Ftip2y)v1q%{anVsHVL{~xom?gfLd1Vh5{#BcLI zf5zUb{`?te;UbMCUFJRB8HGq3BGuQW#5hXo6Qj4cFCK*V+Q@0w>3neBd zwnCW!fYd7YmL!_H){{-2hK1e<)%i?Q2n5fV)dbWx%wKWP3S{iC{BjHsHr zN`;AsS`u?1A3ywV?!qBEIX*NpFp#DP?)2t4`VD5LIQ2e~!Yy9#t&EFAD7=TRr(2gk zSx8V21J#@?jx&igp8|l8lK3vHz?0E!{qWEQT-We$)5qO~jbI!+JXHQ}{fB=yU3kSv zaVTMQ+|v7|BP7f79g7%;q1086ge?Yti5d4Dt zNEFml{hk*C6!I`>GCVguje@MBGY9lR-(a;B?}b-&Wx3u+Aa~CP6%S#ig{x{ zq~cso4UULw@t0*@B;E&O2vGeAK^?|IkK(3k&Lu>xL*Wj6#ubP59tF*e2oG!)0^SE{ z^cLWPLXrA`Y*I-^A&VsH4`{N}2Oj5T-JwAD$q~>T^h}^k0G(nQNz@vu5Mluw%R3Jir*pD@f@35ZEQ?&GihLIil7x`EA+bt1!Cv-xB$qkjq77n zZ;uj&Gm%BeRJZPaKpfoL(z&?nx4<&=k#0j$Ck?LniV^93#HOA=2$>y$^_P~Ux?@fa z;!xZ#ER>SiB()B}tfcA{t9YxZNp1VXHg!;CM)997bquIG7=$ZrS;DP|bUXaEA^Fn` zlNvVq7_y5D5>VJbt>*U7d7}XcQfeSUrWtrH_D+^?nuz}U(g_HDLab^U>R{;lo zm)C;PdH+E=%%yB9PJT69x8ZFoD*SbQC6{aO?JFjC?x5qO5YkS3Sm&EyD%c=tEzl9- z#VLCF^&r3LbtOM0_CL)&mjm}A0BN}h$dFpU08$`J%xQPxqP=WeGAOsPzT5PbBDWuk zQa|2e!xA=n`1fBl8T8z^Q4IJ`(aboPb&PovQT;aRhpwD3Emp+|%XLWQ==McEUAZ3m z^MCESih4bq9$1%5ZGYY)C}RhtJ*hQ!Gykia01oFA4|n0}di?hwOaI!?@ZtO%Kl3|k zCgh!;p9nWM0ZC{vkP|%|#j>)x3iR^oCg6bDzX(p5T{u`KhCJm z>`lbz~OAr37>N$b!Nqxq<;KF zP`16Qhx$qLeMdeH$^Fv+ZpLeNF+E%9a*#lq7-!KK&=i=S&UN562tkKP+bT z+K7Q^<$xO$|PO#Kr^#S&oWmPl`_Rx7L=^gXm>7)1JXw z=$*u$^Sd$dK4DY{Z-y$Ku{1(G^$VJ zr>8J4LK!fCHi92-f&sgyjO^@(5#~G~oElJ;{M!}m8kv}Q{KXjz{>8xG?y8jpw^)a0 zq-SO-(I@AhOb*7yVQ+}@jR6xUAYB4<3{uwC*4o-c+Cjm=>kA8{8k96NxPPynlp~5m zq~`^5E~TM5K-B@JdpI0!Z*LD2C|?f`zH?F(U0vOxq9P!f21sSxa7KZeb_Of~lcZrp z3J^<1$B-r=An^N1!2%orpaUjVGxRxB^Rf?U$w_%7BQ!(`=x??zm_WOAm?`M^!djIkI)!v&(L01uQ8bL8L!z$9 zFutwZ9*mPg0+6T>5D)-?N5DX+y9H1iZM2!K zE%-AC^K)(Ow#&E0#WxbBT?q-eF1bjcr@(7@V`FNd(+?<$B2!Z#E?)lrlsTd-TrXdO zFX_|U_1h?*;bCFj8M0a1dwUqT{I@BScrr3Flf)q{K*$@ARqfJoeSLl7b@Q3MI=>`( z2nULeSOKcZj<1i;^B0nR$o)^knI4JAD~ynDm6fC8F-LXALPn~cf1 zJ3(2HyE`wCF)hIHQ{`!C#8I?&9$uz?d&_e2mxkD{YxG^{`zYwz5TtpjI%T(rcdk-E z?{hM|IQ=+M1#=!8RA@|7a$*q+`!Jowp>^ZY{op65?5aoQQEqSm@r>^8Fi9UE^n{|k zUO?$GD%(AZZf<7y!C&e7b0e4P{MQl%n)z}K?rj*Knr4Cgik736N`O+amw%?8Z`#Kq zVxUdwU#&bgN~2JtapTti;J1Z)zg|cRaY}`A6&|0RVXTE_gQK8v+<9WYm)SQ#GFdsQ zs)``LFiIfZ9325dwF0UZ5-Ad7{chZw3>#fY1IVM31f9c?l#<-Myht=I8}j}-I6LF* zqb6TmT#U-V%E9C_AH8rOQ#8)86^D9A4&&7qSko)ZXd~a=bHYFoc8D+T*5TZWr zX<$IXv+@ry1KaFJD#KT7Xlx`VBuq(4Lh8VvMuCg+kxzo3qYDDq79^&;NPoMLR9aDS z@I-PI9OXBMZU7u0`g`<^=AbkGbv723;gOM^ecyx*&(1x+j;vT>DO82eqcdOW2nUa5 z?cj$X@i}nw01kge{GQ#t#FQ^~f80DpaD^1#a|iFLSF;tup9l}J_%6deHB%b9gT;8T?RWe5_Go?|9L1KYiY^EdlLfKi zhY%bAQCZ(CLnMT5LtjRhp`$B^<0C&qnGGpmn*>>O+eRWuy6agW;kwAt(WHcG4enj_ zXvx_5Y(K5K+^MNU+c5e;&!ow2(bSMQ30bj|0ocymUTBEzb*LPEFM;H&T7ylM5 zbW-{Jq%a_U(*XxVA;A5;t^)jR@cZ2&B&sCAF}*fcy&2_1vcssEK9zmj#Gj6OY8OMc z8!=VJ&M>`o8t6caNhV($h>@*8mGN|Liw(e*_pVr6j4r!{h#LXyQ5{6hR8`!TpE4U0 zP9Nt6Hc($^u)(pZotQZ$AXHrvQc`a(FZvv`)KV!`FCdJtW7jABKMfW`1(>OQdpiGG zf0Bk)e)3k;_I?;I-}A5OwnS*QKSeiIKZEIDo?#ppxxWtMoQNs4!pfM(uLx=wRVm$| zU;Fe(-bvC$q8UT${Vo1VYFXb-c~VvC;SN# z(Bbm&<83E4&Vm^j+R^yE;VV)a4AtZ7*BJNo!%~57(?iRlK_aEQ5ho@NJ3%#82Y2$6 ze0P|gd)3RCEbU={l%>8o0Uj5WUM(<}tIl2g36=HdNu{Xq7MJ}-k8ahWN%NspB0yPV zI!aP09qBANXq6x;xXc~158t-2YH2=WTszZEUSo-B^fzWjh^NQvy8iB4+eRcMFIRn; zuf*i8^XgJC+BHwa>_792Q3;oRhmY6QvDJ<*i5Z~6$P7&+^4Gfht>kv}e)6gcyi+@9 zS}39N9C8)`7qotw9IF8Y)0Vn|Sh2!n!u8qCu*)0Th+V_=bJFmk-DM9<>bR5|zpQ^A zr}*|Fb;WvNS?#HtX^!akupUu>afO8E_}OEJu<+tgM-V7kny4Vq>mfyZ;J*EsgVB_1 z_@@s3|AQx7ex3gR-!~y}6@n*dq$B~bBQ*dI2ZR_OH#bCyOL&?A_^)2OWyeM6f#yu% zQwJpg4vVS5-`wFAA-Mlipto2tNl13DDL&Su<8*l+?u%3>T8~P(jl3_3{eqmP0WRK* z4Yo$(F4vhRTT(nIJT|b!wyV}w+&R!u^s^OX4LvU8E8!yq56h1ZKDRBFrhi=(6y#RT zXF?J4M_DhI^yA!64!Dnj4(m63yW_v$6aIyvAi9IqBB_?0&hZ1Z(DR~M_|DL}-00Jq zcKyd-wk`Ah01O;}Fj<^R4jCbzfgS;Q*Z$`WJ)1~gb>{DvvYp7F&Las45f0$a%>`xciPd036+HOaIDy{0J~u5h_~VdQJ0Q{Rfvn8^9cK{3OV0rW&Hr1(t*f zK2iVqgK9u<*X*o-(xZNo91>Fi;r+431dw)u?_Hn16aa1jAcr^iBL2TGM8o03U#~}< zhvqt(q@dTKhmbj zDy+6Au)ixa#d_?uhxKsN6N1;3!Ez`}QSvrg&bsWcWQvE6n%?=j3FXYCrw>G;y;zvu zn*O);&yx&OlqHpO*%C{S9EB%cLS<8p_Og`AT$7>)S6F6qOzZBu$3GGk$!##2+XM|e z5m+IkO$9?s1zmGZocQ+(#%6RTfd}A2DX1jnRpHh|v{I6yfOz#^*Pk9}`FGzSoDC2J z$U|LCy;BNhl2*@{0M*Hf=dRCxt9A%G_a2VT1gssXPrF~)NK)-Sr&!z^f9?C{ySO*V zL=IBHSHdsU@&bRx8dEVvU)2^&qkot-!{M(68?Ni@Oz2I$RC#>^IJ(E5T}`&V1l|bP zxnTA}L{nFky$9_9iY<|9@TWw!+anXjigadKTJ};+z$Xk2q*=2Fylhc~Krp9LU*OZd zVg~;5WlWiG%kw4H@Zj;9U=SkC5s~x)h3PJRa_0r1IYP`@ka&mznVD%te`AeB4T4 zE)1o{ePk5p_A}8UgTly;jf?y*r`?lZnPJLuP3s8&n-ldv7*)S1ywX=*0#U$(0?W^B z9qu}_Q6Ks+ja?3gDaI$Y;rQt{=xDh}GAtwEd9{MeU47=~uy&g8|D1ewA zZ}+d5gfv~F&8dFm)^Qd!>PwB5G-axScMi11dsrZ5Y;EvO39$&Rj-WoynXCD;_)#~? zWg=9>wO8oDgXH`+)YyRxTKh5%&aC=eB;~4gnnWdJSwCHk@C?=1v0~%R@-~Y(cJ39?dcLQDWPoXDuKnA8 z7R{d^$NOyXW+$%_-KPkc2{djLCn_>7694ACl>$tcjI<)cSX48aJ>3i_l z$5mmpL#8@p(AUzyvmJGj4#@dLMATqp2`iM)Y}i1%rZStzZfV*yMZ|{|{Z(dYYzW+3 z(~n~ABk`NeY>Y?=T59rVc;`F~O;wI3PV9Q-%{$!pAQS&PJ8d4mK=W?50(>Oo-(LyGvey z$=GsSA!nNE!m>DqUL1wy6Yqz4;aSH-V=JxzrVfMK6kWJ=4*vQ-+M z`OUB9s?i0}9Eu3kZ-#c#ao^pcy|A9+&rI&zd^wX^thH2I*x1+@3pf?W!^_!6nShc{ z{Sq098Un|IK(|I$a1b%#<|OwY2j$-|HVx9{QGv^YBbIUhyml@{;&xNlwU82KrwO=_mFocXXhPsZy(| zja`R-fqwpR{Tce>8gb1~6-XCb5?k>Kmp0|E;`;F9`~XYc{w}hgGXlgA|NCg0zwtuW z6Q>$+$>fcJMJw?*aZTNprOe;xk&}B&`^jhSt=P3smRO*>VA}59?kgmgr@OK1Z=z7g zTf_uu@%LL6rQB+~5TWoH;wnp?4?GW`_*6noA?=CbVW-DmTkwSljlLl z^F6h)u012%voOm)N`~kNjhiP^TYC{zLmOrLA8JyxjL^eeIqW z3eQJP&}c#((3%_BxKfuty~l%yr7$+X&!Hh-j1uuf%ZA3e2rwOrkKg!ZoshgBZxIzH z7l{yQ`9_9tNYmAN_5sLPvls7taUQo1mP{tY@IKTlo9LW6fn0Ed!Jv zs?nX~Gz6Th3?Ej(BCVSPCIy*^@Lxg)hFP*7{q`Z?f)eq~NSb-Cdv({-@>XNh8`X)2 z=^qHb)DbbK#JCRoPG+ywtB=Kiy!s>$v@h^*jd}%05pJHlpOKm<-YR|Ri0r6$Pb#qq zGko*DsHCI5G0IvyIXk}0(IU4wy(7k^I6gABUL`5rW)xUd2PQrfg;*Nrk)C#L&hL5+ zHmwN^mrR_qGylX_kYtW1!ZPM?h-ar#%OmlZQ1=Qs)=m6jY4(oA$iLzvf4)xt}^ry&vRzcyw?? zxo;?eprvF+J~M%$a{iO+-43T7^g~DPG4F$~@xU{v#(+attb z$B4ru-M<>QJ(}DF9vC(cmJ}aM6z1k2&AHMarwKZG_#I2Bf%fkp1 zLPmqCB|Z{PL%#Nj3qQ`_X7oTT5ba-_=5KN;6>&V`6=lQ}rfrbxUajrJN=yzM3r{T-JBPZfnH4UyGp`rv{=-A>M#yiDQS^j}ax z?*P7_%{ioV*hIT&#Nx>m1a}}jJU6D|z!($Kc=!=PGMPFENf^Fy6z7K4a=Yzaz8T|y zviBT)>gZ^kx>H-EE#}5l0w0VJMr-7PZAy&=ByfxNbUgbQZkoP;WY})%!PAVkZsoNz zKW6>R-W7M%YpnN(GAy4dDa+Xy*EB9{hn9+oCZ1m;i{t1Ny{|N~bZ28`9?EJ8eIqe+ zynH&I7!ftWC#1<;e><+WMZ1}Aow;m z?suAq+}t^%xwfBgu>*iq6W}?gc#4<_%mQv*2_f)a%HqA9#kz*{(9A}e{KPhR#R&w4 z(H!E!NqW@1c>GmyeMsq7F2As@3Ef|{7J*Z9N!T?8`W#wJ>-~G&goJuqv;$bj@oE_K zm?P(Jo^DB`A5@Ks_IPkRer6^$J}z!qL}Zr#0#-!$;Y$&9-cGTckFXyIukv<)+N;~ z{0Fh{(cN99XOp|@KK%~GceZDGc%J{=bw~>SCXA2E4*rG!LSlR@=O?-k4pXk-ewD=y z@sRVwlv8EmpIja9oyIMzZfxlyy15t-Mr+a-MGAQ|v_dR!jwkTXMb3NkLq zz`XZ|W__=xre?=GKFw6{*k3(avABNf<8JBT`@x>g*RJ2{3o2UB3I}GUuJICa@Vq=c z6Y*}mJ$|dEFc}yu)Bm9zDBaT`Dm%z(Nnw)DKBQb06%lRod;ied=8s;=%q(h{O_80| zCL#jR=xxhc+1Z9s=zc%j?wOefm$N9%SNlP><+Wv1-bs7{D8A-~`vxz2*y-4D8D1R5 za7%5Qn+43zD7<`eQndp{l{p%Sbeh<+4)}fga26=Svu5tF*-_Vdp|RI+dXOF;f8BXl z90l8Y5II_Zj6v3tV&1PVV5Y~sDSZ7WJ#eCP^vz@1bokhTX>g@ZGUYGozlB{5>Q|wE z6=9j4l7qho+dC`%(!|G)dRC-G!OJ?vg)vQ8gh{vn%r2+~L*rKhoFbYcsNlMf;q4v;N@Y^LdqyE49y( zGVuOx8aKRe?>bHPPOj_*f#Y$L=%SwPTOR^17x|7^z|0z(f+fl2Ild>-kI)7ZJfcT7 z`HTHZ=J8xAs=DrF8(8=eBUdQ$>5kmwH@Szh4Jjczk{eEpAhq4hCHw?BxZP3W!PA=U-G*j@rCWNEB|~ z^fx&uT%+C>>vV}!_-+$;vxV8oylr+d^mw<_>+u-X^)J0M`2g6pIWFc)SbLe=I%?x3 zULWp=Mq2@hFvVT`@52W4ZuwBJbBf?N8r;yxeMEC{ed@kZ!IgC)GO%_?)117*Eylj` z|B%p+k-o7ngpC{ug5ZZF6ZN0VZB0z~7(DA{jRrj`UdBcc;}boUCaz2{ifWVPlx=Fs z+*ZY}guXauOY-1ZbahtwCm%3kD%-Bx1J9U4Il&HDBZtDyejKU38@s4UAUlq^h=;SV zn5AebaRiY;O@CHTUnO{gq24VXohc%49+B5FlFa!SbNI3reylTX@|xA~)^$%ChMO5t zUb}=BTtW&v9&#_5S5B#pol7(g!VF4B^HCGqE~No(K^k)s62Kx`?(@|OvVyems+3tV zlX_wXCD;+}cbe-BhB{wcxm@>d;?X_)=mMU}xWQ5@4>2`6u%g3nnKT5e3tR)N@kUrn zQQ200iSX4T)n}31UttIvOdW{+3;qX{RAVD{JC6JY53Y2!4Jz*~>!)tuPHEYGi1KPt z^uWfYwO&t?73s^beJ3&^gr!pz4{=997q^;zfV*J>Ss5H5ucSI**ajXX#uRMwuHjt~ zCz_aXZ8v>M3EljL|Ll(MH(g{)@C#~e_OFHIjBH41LC!14mV4TRZIg8FoXw&XIwg9S zrmM_F)8AjBM=^<{*#AfXcEv+dGT#H;o%Q&;y)B7_{r zs<~I-rjV?9qs}C6#Lu6Lm%q?|qJ@Y{6geSVvURv6wABJ)CYYkSpBtJ(DxSEJl`BY^ zE?Z6|K5%P`x~{!}_VCPlcVB-&v|dc`@YISj!+7;g?%@XI=HadYS2J`)-*~A@JB7mJ z^~alGQLF0^-@1mw&3DwvpI)!7aO~CJkW4}hl*Nw*zuU$f_}cA^Tg+I7br}8avp=HH z(;W_?Q7=#u<`ZD%W8xO&=V25{AKg52=D7VP98tDABb>9R1a_r^pA@%nnd*@~MjKP` zPxk#QC|jR7x0wQuVAs@jv`#MFnX65Z#dgpV5$56V-tfJA)XYm`5TU1TcN*xJa^GtL zcEu(w7de+Up?xRBl>ZhU>)1WNEqh}FL~tvOrA*Lw6t~8uA|X8@lw_r}HRlwY#3aAH zd>Xr#Gc#G`*DW7*QQLu3iLOu6HIeminQzJmFZ)9ftDN`6I*A_JRI0`li7yLAzIYE)8tiG`p41BlfjB zB($akxJS+aqCLa^^cmDSp3Eg6G%<7Pf~W_Q?`~`J`xV$TG&E6P(1bRDYX_UjR$^WmTR z_bLwbsZ&*IKKfB&kFU7=EsDYe^v;Eq7_5*0l{Wd7cIcR?t(PFlH+emGpOt5{*-bGQ zc)``*H!lBDokOdB01sBsx5K$#>J_KXJL4@neqo^)m`K$WW9nzmR!baN!6F2xM!Qs| zNH~k7HMB!(=^drapCq4u%FdM|P__js;>pN`utl9=K6BK$=_7Ib;uLVd>5a#QLQr^CH?*fdi zz2YLP8_JqtzDF!}ki7$rb7(EU=obxHxWfy4RWT@ZThruiKYHuE1Q-ipN0AwLHgx9b z_H6>{U>G%W0HbZalklb3S>x^6%zwON$~C@SWTY48@BjYti(P&Z<8DF5#KxbM2Z=v( zyUXpJH70fjA7U#09*&RVJ?fK)an_l2!3W<^A zLx_VXL`0Sg9L1cm$PJD)%AEu)nD@a!>MMb2gy}P&s$gF2R`&jd8nD&OKr^D zzB1lSKJ*!xzlM&emN;l&To|wV$KaYZ;q|Lo&xsTpnu*w~_YZBe{9|}a$AH4^Iu}@` ze{Boy-oj$x6Upt{?xwZSqMFzOk5p1ZzA71<6MdFv(&n3ijk*!w@?zyHZ6 z;^}Fb+Pl-8=e&oXV?2fYD`^~R$yYZ4y+}*>e0otc#Tq_ALREiD@A6??YRb2_VoVs_ zH2Q-CZ1Oc#!R_GlOQ$1G#Sf)>hPKU;u#qcxZEwnrjR^;)TuPB56$5U&GE?fV=a1im z(mFbTTL$m-jwOtA-}nY9r{Hl9#OXTvdXA00I?<_BZY4T6)T4eCpHVDq5^>JGod98Y zncTP)qH1waxgZ^g`9}9f5mu4kW@5j$L(ddb9Ej%sJdW;dh1f;RO(kgHKNa@L9p#F~ zv&Y2a1_2Tu)kT^~=Wm*bygKJ*CjuycX5dv^kB&C^o0q=;jr{{sDcif)5sBT%m8W9) z#N`1nPvP?H$0wp0T<;7HA^G=!t;T;}sqtOdrvV7WllgO+3_;Q|6n77(W;n9X~^N32p zHV7i6g@erC5kVrxOR{igERdUVna}qCn0D@K=@LC@^Ugg_;GCO0hY3bwCLjnao=g_$ zmn|g2JKL3}@0`h@>($Akzx$_^0C|^V_4KcfyMI~m4Ie-#S$JN&lf{_4L*8YH&}Qvu zWVq2faFzkM2g8{tvB*GJ_au+N5WpY)Bz;;L0snf_;O`ay@;uRsDbk2y7941cG_adI z;=MPw-{_}5qAMgSO9w5!;~2BWPiHm)gH2+}thGEi8TwQ8Y}|1wSRexYzxMU)-!1Q~ zZV5ZA~OYot9xM@YG@M8Sd?8|4Mp~X+pz5mi4^Tfqo^}_tQ z&$adMg)WwY>2^W~tj4xHlH%ksH|f34TeQ@!5ru&DU|wDtW+TUoG-(7#YO6wKjXg5h zG)rv9*ueZnvCSiHv^)G>ePHF=czZu6x!lV8vx<#gC?D`IWfzv&@2~6m!yPuRX*YD@ zJWej?t#X8Sj01>VBNW2hrjN_MOEDS;P$#*oQ_t?EX?&Qzick77<^C?ieVAC07OL|Q1Xd3WSmr~3bfzeVAA>qAnMWl^FP5a zH?Q6wWM&Yh>S{zrC_IRUhv#7@B&e7gqAWKydarF5s*Wnb@H4#z9fr6N@NdVJzpf*f z%L$cV`<>Pea7ukxE%zs+I``j@&#nCQIV~QZgq?n20tyzYD8fKkfz!ec&NH$Ka{LKY zRVOUnj4T9|Cn`ps35vGYTud(Z6WP*p_v>Vo|HQhbq9muFA_IJKPV5Evf`!C*lqqN_ zkI!h)>I#)LjO?qbGElU~sZZZFx)1^$&GGAB7Ge~=ibh{X?#CPs`V*ZK0F8y0)X*1} zd;X*!;10j?ncwMx56J%w12Ay;uaa`GO?YNxBmu#~)Rcv_9o5F38YKS1-F<;=qp)Qj#unPe|jG}CLv#?CB!d9<{{$PA{8T#bcb=D+~EG!hx~wY;UmeXrElu0 zNg`QCMez4zTQSCeW%i|OikC9UaiiQN>bKuBDQh-7oL?+mhDx+gjYW>BE)K@=k{OzBbuv9R2zv%)GI)_R1rR~ z&DEPXN~M&UY@nbZZ_@VHc%5eLuq`acV`Qkas&8oV_Nu(A3c1#1d2Qy%O!fG%jodE` z$UxucTXwZnUxrRY7+3vI<;y#EH0u{7_irpBgI*@*rhO=lexN7H_7LXhAI5*&iN2WNrczPL+phu{tYg1audxLfex!QI{6 zU4!$R=l$xd+P}7HtEPKrdb;oXoa>aAS8zNu&JNDsf?}c@8t2RgWCb=S$L{vFj*h05 z5M;k#XU)L379^=T_={{V_4U0=a5_xYS09oZcNcJ3C-TkbuMkqu}YVc9o_<&T9Yyxz=WWsH&t8_dP_JeI;@{; zF8%E<^hIOIs|%$z++-u^n~S#7FBHohdCckCzjJ9rxfUgk9#aCpoJQK})i4mm8G{x6 zTf?2FZ}PQ|E#l_)eMHG$KqRI~s*lYrAv8FO#r%_C*bI_pS8ye>JchfwdyqsAHrEZK z!mY>CJzNlt%C3_}6{jOE^0l%^09J$>`k@?&5KAX#rMK!A%!<)lYfMxO^m)O_DN@2S zcJ>-gm{9uA+m?KqL)FMDtJ9?$qJ>@5&~@oQim?)0i||_cWwC$Z=}h4V6$&NQt^{)K z;v*=rZO2@&PM%{92iG*-=$L6Ja&3Nk|KSR)z0TuM7o2i3zh3y}nw+=uQcyyIQgpwE zOA_^hf|8ecS1HXwF&nM4du3oG3cRKG0BXTlWvpNye`OWpfp@gd!iuMbHBWmhCl`o& zNy%mpC-r8b(7)~@>A?)oH!k0|yuR0JF~9v2GxpMA4wuomr`NHX#t=dU9gg}s3YJ$x zn?u0xSo^f$RB@WACQmduG<9OAiGU&@OT(dG+LE^~N*G^CVlrVchQ%qH54Q3CA3j^Mx!+xr16D&Al=9zUxrJKkB*)arb@+Jp+t_3433=<`u2XCGBLMR zk`lSQDU0(JzZ||ROe@cTyV~`lcdjHFC_i${3a@uD0z4ODB~?UkzG5*pebV5jj4)DtL71CHPOL%9~xcASc8fW~a7 zoE+zz5`*oLGwY=MC{qpR?D*h#H@+s$zB%@Mz4+5|gX_O6X)t@Lci}J{C$Ae1z^8B4 zTm-h11uTp?H7lWFk{xO{TYK<8|LMPZp^MQZn(Nw{y4qu=*C)}l-tkRurtoZlwEei0 z_lMc?LZC^GL~|{*)C9#``lV@06Oc~yOY4tjWRx=u$N1g#O!D)*h$r9k(S_~Ul`c+j zPpM>Dp5ZU4YkWRAH#ZVyv^a6%>f*eM?)l|Txicd#uP_?xdBN9bY)nZ?^Kw!nL*YXK z#=yX%Gugw@0&3kli*t3({X(u*r}#Ybn;PjQ7oorwP&R93t{E!^!vuh(foGq*%vgXnTL52>>yRhZ$L|7JC zBaL;|a40vw>_E$g*IA{4`kafSLNBQ-?b4SR>bcOjv9ZnV?b)DZ(NQ0 zE~%n_tN1ReI`k?is*iXO?L9tt$tDWh-q6m~kzZKQAiyHT!b?@}XVO|-TAuxdh4;bZ z{9<8{u?j|#+#~H+jEb_TZ2*c#YG1-6>j72QPh4LUTGG~lLerL(g`U~DuRWF`awg*< zakYMKOhI^UeMBiyes*F@8iezwM^&BPD}BN`6^?Eq(MczbR;(UEY%J66$)mcs?ggF zpwpitC#X2U2ONuD=`VzBYacr~6XBr^zq)nA8lf^0N|#9KOoS=tdw1 zNWf@}5_jMt*~I38j2bdkp0cJSme2HDEbK&yK5ClFtJ$gzY!~GXx5yz-f!LVY$!sG; zhNERG8HWey&plGF1@0XdZief1-Y-e)^Am>Oj1Xt5msnc9I1!@u8LG>8o7h}k z3FbAvn!3o(CKPRQ5QbDWGE5Rjt@JkUN=H{QMna2%hRAU=Xv-Po+z-;(*Vgk(_od8h z+87(2(5?FZtMRbHj5H-wr^Ta6Zg*fA|2+SN2yr1Qy&>RSfVV4_(mtc zcjA|5)*g?qF`K{J_zSbnG1Kd6Vp}A@L0_32_-%Fiexu`PxQ3XdXewo25H5U`vpKp_ z82mbEuM)^~1q+;x$ zE^HLm5@xt_9S|n%sAmn?snDjCSR2V`5@e$X`U|9Ygn) zP`qwdzN8-oBP7K*)RqzME%j_hTXlqfMTeMLm*<#o{rwnvASWSdn*;3>Wzi@Sym}WT zb85@T>WpL*-aped5z?@&^Tese7KblyvsBsVB?Rl~+27u}p^o`qRi$#vi-b6-^~0rm zJPS6`y!t+4q})nICIx1VSM;wYLHk_jHZ0(ck*tR$%^uMB=pci|A-==B3ZYg$ zkn>J(aMUc|=yE3o#OFH7Szvzd_jkBot`NhnQqi2=sUh9{Wu(yKU>u^nQ(j~fNmL|RJzrd{YBooON z_&!t9eYKgdID&rhvpl0l9J;3?L?q3h!d!<@jGGlU1^kN{=koqop8&~IFb_YQxc^oA z+v=xSTb|EMiBU!9TB($H zk~ivw2g`q`#DF6iXN!e5@(q#IaP7YsIk2bMX$I@!vT)rsy*=SAmtuPU#5U}yPgWmK z3ZdC72LDm%h%(+Sel-$H%Xq>5;V~3eAr=x?nd+nKok;ert)f;9$37!1&1N5~jcd*9 z_>*kj>C0pP((ts8HeA9@ory-)!Sl}F$l#K;TQ=MGEnTgQXliBkvmSb)WeYpGSDNF` zl_iz&=E)d7BF`(j6#Abfcpx|OEOC#{r}1o_xj|7YV3Z_r`UAMmLDmnjMr2v1-Z&Jm zI6qK@G*+|2&hsgdOyq$E?pJ<>sz)s| zd83)_$SE`CEF4_uy}+Y`^sunHvWcTYlRJHhiU-T*K$iF#7%Hj`Yq+heMHG}B-m5O= zC;%p=0l_uj!?hrK?OeMfi5kQ-z*r5g)X~>Y(bLSW^(Y&b{aP72ygf2DUS(%jWqan} zzS0DL^+;lBYZ^9&RnxQuJ2-6p!&h5R%jg0w1hIubga$hF$9)HV3k9BGIHFeZWb9qW zlxxFW;r^ami5ztT^%{9r{m)wwk0=N7$RhlZxQ zj`q&(9+@-Yll)=#ag!HdH^=Ul1OvNG*plbna;R&Tdk;z&Z?HScy0@L~AwrIwTR(V^ z+fymZjwe*e9N=lbv2y`wExrhEM0^pd)65}du-c8ZbR?1x! z#6+jW86^Gf*~9lT4AYslgjpiLbR_GaAMU^TuEWxp0*8I~Y}Z=qf}g~UW5zIkciAiAeezYeb>i3H2mSaZsS?uv zny3mqmx;fiRo>v<^_fxDXbgp>siy35x4o89KA+Nj}>M( zap#FB9e+GPqYN$KPJ!B2pa0i+`8;64mPB1tSd^%(I4F%7rcgwx@gmY<>zUkpACkY5 zAkp%HfHV=Ot=!@W-IcY{iqyx%HdbwstA*9r%wmO;H6?8xd(VnA?TVdYiRQ@ky+)iz z*vD0X7fQ6p9MsU<&@c`sLSk!c&s1SA%|ojV_|bv&XbM7g?S%|PZs2=&?(Owm^>LN& z{%B$VIMdklfV$&~hr#;TYosg#RhV$Z$<1g2kZ@9`dkkz4Dbg~we>^BDHSVZxaT~xi zpj*ZokMa}CQQp8SoU)vMBkD!Y#CSqgR(m+0+q%+3hqL9*>UVI6a}PNC`^+WzLp6@1 zq#_U0CJx!xPtM@ypr7}VcGV}mw`Nb;X1E3lyn>vbu}9%IVv&O;Bq!$#P3RaH58kg1 zQ7pAO|3Jp?iP{3#9Z`bK)HU`b-nWq)e)?f5pRkD@Y@5KpGw9kMYr|zQfQt;}NpVp) zmv`O&Wui8CXgz@ZdW6L-2F~8OvVk1!ml}daRoA+sZZ$SWh)+bG7AGO*)5Qp!+H%~Vnd}8-Apt{zPIHCc62%#Lxk4{tgO*cB1?I~G4a;sqII`c zLWDl7d73ZHPKEI@Z-(f0>!ZJitG)^WkRc*gA|fg6t6iE48jqb4m_M^v@UiW^f_*rR3in}jO|HzIFzgG@ms4| z3xl}@cl2NJegZeb2iywU1-}Bt!iK$d;Yu=2)0+Z*RHJ$uU=P2-ndxGpn-}(E|JEtL{Y1?Fg%M(8Sft zXMP>}{H};!ME}^Pg7?olw zQ3-!vHN`-_paDokzp}Y~Ku5R4OIz0_!9Yi5w6tKhJ6v7V{NVHWm5VgAbv9a3^vL^x=@uYPdy0Ut=@ z%f^jCZjKy;F_ZIoeWggkut~kDFl{R1`XO8o8JT{s5K`L+QWEb>6ukkhfZRe1!1~?l z7WL~nHmXTh>XK-4Ej1i2M4q zt%Re>_r+uW=vjIC&a2N>|Bc%&9qLv{m`?+Cud5a~!qsAQdQkg}Z@wjpNw-lTaO-q? z;d!vxA@R-ggnTZ8hT7n(!eHAQ1>1ufd1m#4d; z-qghw75YN%+cJM1zsew_HpInDri}d zJ2k{@&9wl)c?C3RRlP&@8c3CI_lhf_feH6K*(?OA)V~16)9@sP0HzZn4jo0@M}YDE z=^3gWlq>+m$x3^MW6U!MTK3?4(9~UXA$h`G4{s|c%jP)bos8Rus7@%|ZW&s{S4HSa z%f4OrGZ&m17dHQapy{nC%&lTY*zNU9&H3+qTy8e3$*bO*UYL2U_RkF-!;Q0J(UwpS z$lSUf3YKiHBi+EIe!7V~@qF@PazQIn-&YfyDYZVYo>d`U1#PPiVTbnVgZu*HpKlVw zyZ2QNQN`cj+(f|>f|Ae5EH(~TFl|R9^>X_ZFW!6NvxJ}AmHyMJjZUc0rXA6_dEkwR z6*eR;9>%d|;PC1uHyu?4(}cV|b~xh)Xq;;e=f7hblb_;+RhCSB$Wy#L!1QpvGEv$` zx=T-Q-uI0OP}hBQp%ydO`-g4Igu3Z`!{qF%zAWolGv(yq>Tr9(WJlQLlifVHm;caG zcc*}NWFg>vKhZthQEtC9D&rQ|xu~Chia6fHw_I(mkdx4&@?izHj>MK8BA&pPt z@jl}adb;~hfg+#ppqef*j2S$t231=t*0K6yI2pTKa_Ffimno0z`Pd02XwoBPDKj%=dfe#UKVn3Hmn z1zr!seLw818*>YBc>dJ43G#AC8eZecJpzS+t2?p;>D#YLgsEB?si|k_U!33qc6WPA z9>g1jrSga?ZO;`H#%)xzisfbD`}fhJR~qM}4W$bLZyyTUrftx@vdEz6u3m1q5>~)A zww~hH5p6Jtd}%Dcz!nbGaqs90(BHos|4S0MXR#ANGAmc@p=)PYjR(~={B<` zDSUAMLdqeav+~kDlxG6JD9^gu+J$CYCnqHlWX)fZ)6>#%MrBv<3eMyPQV5I>gnJyF zlO|27B-m|kJe*WRn!sBo=J=fx^i-RvmG$Eu24jEtKtWxi^ie}w?3#=SAuZq>R*!() z2fO~C&dPo&%lG6Z9pta3!@y22Fmw2G5Z{azx7b<%2RD^crE_` zIwmvS(RX*rmA(X!`Ps$(4U~atEW#&e>WHmFJm9 z=A;@FYYo@Cr6sRL*vYA96H%w(kt6hw{-cAl{SQIgc`rJV9CiW!oum9WQuD$x>w}>F z)j(R>{s1yYFpH6H`29cyQ_hzumW)0u7||GG1sw9E4F1|HnL`GQ5CC6J=bNT{L!Giy z0&Y5aya9^&oQs?2W1YLbyhlq2gkLMMUY*#ZM30y+73l8RAKX*NDE>hNWSDOoI5M=M zuLXPE!4L;S__mFXAMjoENe>G}{&2)?L8HX)ah}nm_^0)ViPDJ=FDCyk2}X!}oYOQ@ z5GTFHX)$t%8_cG-j1|n5O=3k4b_S!GV;G2{gfu*VXoZFWT5*r>bI480okDF?9IUk^ z-K(neU2}uO!>bDmGsFGsLnGNH&YVNjV&L_am5&-z{Dj-4o48jCijWjN^eD_z#^}SN zV_qR=rFl*ra!ujp#$nT)fl>O!q~ zUc~amSFw*V&oYyN(SEm`!5WPg`c+#)x&plDt=eLT0ORU1CYn0rxFQqNT|i%FR2B#x zE9_hhd>Mt&pvn53xCvGFdEfnW6JAcm)l4EJf>{4g>2t9X*mB`YiDAC44l=T4dcZt>A7Fc!4%| zic3yY*?)Cml?4}e)*QTa$>u+qb~a(_UP6jnmQ-*J;%-jDABB5ul|Q(K*B zLnB0a5@oKU7AkeNVd|20`<^+al7w^D+K2U)UfQSrUT@lm&j$8@7hRttq1$&$s@&?> z2R!SVUB;M`n=Y#3lWjYpooQrsUEErIJfgKxdFZv4S1AXEN=Xrv*E&WnYZ8&A2@<5@ z%{^@7U5%LgvT3~!6!r2tmT-SQS(5nEW-8$^JpuO+FsQZW?MdHK={_H-kVjS(+d)U3 zFxaowF;RK$#a?_|qLsurDA?A*m8mqfWmrInPn;QNpkP{~D?gLBg{i-j)S3N2GJkip;qhvqcxI`&l$fBUsDzPE&;u%d5>qeVC zoWIoY2|X(zHQu9^!YzA$?e1vDy(6bd+}878`lNI;Xc8>=H7)ZT=LxD6!*T4n4Jm5R1uZ=8dY1zB;yXS9 zz3y&O%Y|E)nu{ZS-*^GES=1!#+t7+;U?OA+O`wFMFs*lIb zI`MW=iwKUFMOQBrn!Z_D*JFP(?DxCVdXZ=( z9`0HxspwUTlobDzoV-||inL>1&XjzQOo=c}U#k9?QwC+sGtIZ2dBij$fO`KeezzbO z^ttjtR86~23s#iMnZ*0e2qg%YHw_bF@{r2w{J1~TVjH@%k_zyrj68=z0P24gAY?li z*C^bN3hgu-9z%g|qeo-NcT0fQhy)YYyu+K2LLjX=H^`&`5CcqXpqN1iKvLq(6bYpb zvzNG@V8Jyo02)9*T1zAF9Sr~|P@@zunt*f^ZT))0+q^B$y74Kf0X^!C+wT_oJs5VxPI?%x=u>ik8jT!omPaCWw7y zeUZBh^Fv8u+t?YjB&fH-hcBsles-FPc~kXa|1h)F+S%AM5P)s8T2uOJLqjI7>jBvd zQ>9{^$l2s{JMAM(CK z<6~(Z2hjWIh}9;Zx7E=_FE!cybmADIOC~Ws59lrHenR7$cBh*J+W9xJrnY3hNz_Eu zi+`7CuMR%rg7jm(B!AQCvb3_?LNlME{d#1lpq*Qhs^l!;R9lq)6h$x-EEk1R>a4``&vNTUXihp!WDBSg% zmDSy~#yC!j0v5k?(HmSFf`g*B}VvI5JUGb^nPkwr1R&Jwxb_l-rp^z9AYEP~Ti)k(e7Pp^z^ zoV*h~46Jp{h;AnF7~J>x*ev+TGGSY^p)c4|EVsGY)(>3v?w!4f ziHU`Yvhw`9hge2hTYGy0WJTUXq+Eu6?zb^4N%u)N#*aWtmF9B5r+v9+iHVCj$KK4v z&x?$ixw1X4(bnD3-kj;y!%;$sILJ3vUAfc53*)M07ll5w0 zo~*>kJ4sF^JZhA|K0oUgfVctYR^nAmVDzy#kN7Z|s?^Tp2>KV7h`b6&t`#lcXi`>g zhz_}DXXobFhzO|A>NM~V4+&D9&~9DCfhaNZuyoXe~;^6MCWlw~D2?Q)-3S-Rp5Xt@=%?tTa2R_@p{K`UhrdCluYyX^z z`HKN5F!)VTBY|Y>d*WBUd-ADSes$#aX>C0{oG|7imWM;6ea%Hg=M8sZXHO-9Fyvth zOI|67nJOD$dWXo1+;OlBJl*c6#D;2t&mUDNeScwj^eJM-3fR-4g_3zaKgsC&XMZ6R z)6p63qWY253+bci9isT}@6VJUC(I?pu61|pa-DjYtunYk$5uQ&Q&NT8?c4i#WdI(b zN$#B|=7&Ny@CrE;7rtdtypIM`?)fOZ_9|jXz(&qs2ZD!*rmwDA)G=T+0%omqW*!?S z$7}k!*V}~9+Xvso`y_5g70mY(66C1~-(N@* zAg(Q_I_xkZCGuN#5xO7~#dTcN;P(B>HNtr)AYDcgRAdwaecOI&RYM@X8(^?Vp!=@7 z*H-gRr-)s@)Fl{37e-ZW9NWqXH^Q$V#tKHiw+eIU(&AsLw#qLkqKqh*XSDV91}*`f zHv1Y~EC2VmSregQ!Pa4%^*;jo9=L@tAO`{o3JN_5v4GSHNl8)O$(brzin-3g-o-uv zI^NXphnyhkv{b0&7})*bpUv+gd4u)#ZzALOUm$-n9`BAA`Kvx^$aWjMDCmq@4rDr(Y4s+2qTLc7jVQ}Nd!XIJCy$u`a)JH@mOR%QS zDFO|{JwBFS95ZIc7WMYMX!oj~&1D}mPDv*pf|>7HNa?2-iJ5e^1ua6m}IW(eYAxAj5MKdpAmETt)z8?dteyI^{8~i-T6b)I`^+!89 z!1cTzusMKihqiEd9P)~%S=d=6|LRp)kdH*?=5EBeby1t2xxI5nM~#j|znz_*b-6>0 zM7ybL{1@BTpO&s8`Pj0|@8!wA{D>e4lW0q<7u(qM4wEYq92${HDPPCM&B^r@p!`OG zV+#ulm(vKXt*s;_`lXGH<={swlTmcpf{Hfl2jyr0g0P;{7{J$Jbb&N6kdp!a#Q)S5?J=Ud6Fy z5Yvs-otrEAEbvTj5Zf#hC1=}8vd9~Zt7_Jts>%O{U+b~2mB@Ce(er?CW0#YY3n2dD zVq)f7ey^|j0@Z1+sufvZSm~dg99b%>VxI1#n3(T3Pw=Q{+Fk!bhXXQwL`AXTQYuo9*)5tTx^0vUPeQA>EwIcZHCx z!-IoH*vU_UG)L<@Gb7W()Fo8giSgClI`j92_+i?dvgf+Sr`5e#=xs{{81M&l9#aP^ zgzL&-37O%EvR6rd)j-fA_+Jm8Hiv_OhhTk`Z2M0Fjz}m1j==B(HF>7o^_=BE46-{Q z1=io)^t7eaX?A~f)UnQEhfvs`;FWHb|l(ddwcY zD&t-%9atEnul*%|F`a%q2~Enw2W1`-pHZPy9*w=yTSJb znb#$7D@1E%Z(rPYttYPyLNnj6r29G|Y2I#6kEZ_c~sTN-WZ-E6W2= zlORyQ@*SL3dUX|^vl-{KDMen-J=ZEFe@xi+OdV5B-Pa3dL33_QoNXBDW5`cEv?Pdf zHA7s%1$|3EY=u9v^>Kfc%R%S*1x+S>Gc(InzY<_&uZnABo#z!;)=wb0${kyp%C&YL z8jXax`8xF_b`L_+V*Q-Qew9m%DZ8{!i)>-$w4W^j!Nc#6(QzC)i-Wqc%yc4bp*)NWfVgRO`D}&Q*k^?PcKCSvdS|!)accg`J=#sf zNJC@mlcl8-yK_n?l}0o|Z=Fqg)+Z^5hUzO&^Lut)Sxu-$Zav-Ws@1}?u6w+nhU;bb z?oq_qNDwj(Mn%)t(Yv{kCO9hj?fB#N`r4i-gW^{8>Hd-0G}*w(&O>b3hD?VRmTMKF z3H#~qCpCsdfcASzY^H88gkNoTPU^Dzw! zg}b))H+u)RKfqOO8x({@R!wy%AQ*BPuueQqv9)H5N+Js>1ltf(S;Rfxcqc$Ln-9Yj z$7dFA5;qb$aeXKhv?jtnd@Px-V@kX{0F71s4zf9L-9VV z&;tLg4-xs*WQZ!$M{{FKt&|)^KO-%K){9s6u28Md``^oZG@OA$5S!IV@yz=Kk-+qf z;TY(Vbdk3%BPHjSRf7%JNEHeg9DWA?Mt6O7ZEkYO!q{|bW~IDR=72Plb|}&l54vq_ zo~)xjuO27*)qzni<_D7R+O(?G-o1s*vyEpZBTFW)HiQ${no8E+kJZea!?;TMDaA`b z^%)4A9M-1!{BUN%`*8J#hz|{2`vZIw+7ZQZviEW&x0|?pXc`O4V|bEo(;h{b5uJFh~qF?#gK!YOT)#_E@M8e^1O0C2@aoc&o#M$ zBYAOH@jfR&;g#9^zG{lxj#(55z}%|(5+Z0y96htHRyoP##Soh;Ew*n$-Mt!r;#Px0 z5&Fc)H$4njuUW@q_mfs#Jo;ju5z`&fh)7~$?%tk@_;5TfgQ?B-3aO*lz_QSg?NHCp zduCi`{+x#~dZaY*5|1vIJl56>6ryd>XC%1|&Fw)xhGzMv+biKKaJkTT*d%~qC-%7q z#P0W}7Qx(x%9j9JtxP9-pIJvsAoIFz6jT5Cgp9roQ-;mc=)5Uw#^dG}+q4@8#P1v% z{Y+RUgL3^d{PjMA}8n>AO*mpCadGvcA5&pswXem zE~6Y_@V=nJ#pQ=xA~}4=^feX{2GVMqge@kj^`2%*`v<1f?% zA>%Yrw~!xzNJZY_I(Q z$=il0=AU=+@Xl3di^=6ZaT0G~VX}gqplr*Gh0uI<|2trV{ldXO(g!C?_!JUDvIvq% zA+>C%u6FW1z)x2l`24}Tmb|Qg?o<3wiCZ*u0rW4yv*i#;?zy`sNJzT%z%-wQlKEM3 zsS6it;Emg3a|H6}|I;8e{Y^yR0i5vpRk;%Y+JOAUWFsPksQ}55>1S2Pcrl}D&Hu{I zc7afVxZjkWOl=Oo7*YuXMg=F7*w&04nunl>ZM0r{R=PreWR3tLn*=61YMhe$^RPN@MZ*KyaVD_T%oG22uT81=s|?$s`jl#>Vdr)<4H+ zXQmfl$yzBQGLa#MeoCwQK79?SpUOodAJ zjT-ByfF4Lnk`h+o=?ZL@hx5m8yZgK%Dl%3%km*ZwJ6FEj4h%CF6PE5o+@Ae+AA%2< z3TfOU{L*Xta6hE#emdiQIOj-C;BTmrK%eGscwLX!ZH1ohyms$2RQNG2X0yA~H(5Ur z6Z)n6##?t&WUu?zMp@%~>Uzu5+x%m&-6d;qPw;$sm}I5Vv+4QtW*3$=-}>no$>jVF zv>sd$UfoTa&yvA=(ZLK_7yK_MR?|k}ibKeywK91rFneYwAh8HT@KIG~-PzfJVL+xV zsE%V*=YqE0sD^=m&-8fgXop1*wZ!Yw!NJk#mdSCJ>Z2yu+%7BZPvsR#3sC0;YD4fq z1OrRoXwj%sAN4=St!??PyP9OhqWtz^%wB89V7*;)tD9i{Q%t?fn0oqj$0FwccA z&u}uTcf@Tp_DAsNB$h1@J^WFFcIWazfW*M@RJkWG)}&qbJ}Bzymk3Xs2tm8z)$sn~ zf)>?&a;sDXs)7fvwEnlk0aYpcccAqpud{!A9sB7DU_5m{USIzqp{1g0t^@DSlG!?S z3WnFOg1+qzN$V0z<`+S4iNciz+YOOtQ}_bI!J^AWWyPbZ=?RPiG(r=0Z+tnWjJSzq4fPvPuQ4%cPYs9wK zsXmwL&1Rxxz58j;i#~T6ZNw{aBP zrFe2~|EMcPZLqUgH~NXB;O>OD23}%Tht(0tJ-UWZt*z@FNHd~zA^wfG^1EFW0er7N zMxD?*e6&huu)kk#H>M1q33yE|z4{ycp&m?x(fv09#-%_t-J*rc6PdDwo&HKB3@$zo z_dy&fd~4Xj23T@cLW8+(^&Ke-_X2F3{c)w;;!#!s%ObapFN@P?v(@QwSi~I@Kgp=hx->OE=lQ~n z{Sud*50znOsY8E`?{@7_1%^}d>sfD&##6NQHnojLf#VZoQTC0-e74!_CBor=?|f!J4mtuoQFnX0}qQOm!JLh*8h$d{~ZZ=PMpFqpw`is*3dlpgHZ zpUEQg{f#w{B8F9n}YeHXnZqXjSSn1 zyfKyTAac6Uax}GNuY2oK@4a-z=0?sSjyupo8YdU4UV&~w-k+|#2PZ-1m%hpCo9x?U zK-1-K{Y5qD`z1pa`KHF5ic}HSdg6ccX?8fct9W}8wnJQae-?WX+TLMg^!;GxyZt7f zaDnZ%;G{z}CwF7rk2<%BiH4;jdrRNK?Gux#if_7Wx>G%i%xK(84?WShbE!JZybCG& zobtk{(|WvGE`c>VykOz~Ph0?~m-@RhRL_>QUQXJDf((J2b~%GyErbN;KCB&lK{N|I zDaS6OHn~&7EW$hNFOe~Mty(v5H_!SRDcHsL%M%4RaM-@za@S+9_=6!vmk10P=@Lm! z95(_YsITJAP_i;+sV~Mf;YqJDrvbSN6(aO>MS#$hw_NnSXx9)KA-a;Hj%l-jRfO>%RYMe|)<2(I&uK%8st^Ft@{w#QY@WUPkth0H*ZX(i`1VCg zsIX4ehsvMkuc>zg*DKt+rU0e6QP;}hvvmHZ|e3CNXu z)H=0wiHX1DXHs!#`?njoM{izNf9C-VM$Jd3!Pq+tDvCv+I3Bl-EaBH$xJw{i?72T) z3hz_|5A&HW{tNVZRO~VoPwm8`IR(n9{bu^whn|U{y|^#NSw#Uv)HGzPv%-X=39}a? ziM__ZZb&+O;C~D9&3v?}ogv z$AzW%{lxwF zF{i-iatGh---z?Sx@P~}V!1J1$+&N!*<$FJn8+Vuf5CnDs1=&w^zmCLrDLJvgme5BfC5B8abrT~gqwHy*w-T5F(|lm?2q z2rHP+0Qu3lTBx>ua@a3%di|v|2FLBxLuubd=Z2ba$UQCj5>D;sZF=v98Det==2<6w z^XQv?gYuZ9@t^tnJ^S@x`2KrTIY&$oYUh(1x30PwHV4a@bd02F;tV=ZLsM|ZKbRsz zyeRy0?;W&;<9LDbdF{8aGbj4QGSR||<&9`2@5d-hm=1n*A9k8-wD~a5dy-;ty zWgPcqZ8_UpSD26j(brb)u@>$#NBf(i#(vOs|C{;N#+wX*D_zR(Ki4|TP8;|H+%5-)zp;PtU>7u6vUm3YmPaV z<@)auEjp4oJx!+lj}z%Sz8}WD=;y?Znlu^p z^$2Y|Hyo*5eN5GuljwHXtHr_zaZBVL5x`4!|8m9F9=%~f`X^zFPI9fA5Z-oXC1(M> z-VH(`9j%WHMD|g)U)r1=7bs&G#cmN(0#M{%A0aD`Eo9~Fl+uInxODyVie9c zr;esZp{ORvqSOB|_Etf0MO)WskN|;T!JR;W0Kp+>1Hs)TI0SchcXxNEacdkJ3GNQT zoyOhu_BmgD|GicJ%iUG$p{v^V+H;PnYfN*UyP9yg7DuMccva^y^s1pz9^8^eBX72X zt?5>>wG2%i9Gw$wqD)<1c1Gw~wKJVHyH-yAPDWe&-#OaJ+4T4%m~vfP!@BJ9g3I}~8DvGTuR>0>bWMLt|Fj4FK zW2nTS{oTzZu^!f_EL%uBuJP(z{>UeDm&4x<$1{EPD&LYq78n_;q{P&B)ujgp7xqvp zW)4*k6NigaXot5mZcNtLR%t8tItuUkJkj1vRs}}`I-K=Io9ZsDBw3rO!P>m^Nkdmp zi}Xj-ZR*(4mNR8Ihl$h0IrFGTaWWx97Y`H3PwN_a4U?xd9{tzHk;gib$b*&f0|ZOK z&y=a8HJkul3@IG8(S#*u4VT&7TD#u2C%c8P(pv8(52Y++j)+VTRqu7LJ1;4p4aZ3k zgfzOHJKam*+6!+1ppKpaNG|ET6fN$5@H2M!2*_7jA~MJ^d^eTf z$?Ua8QCjHl3Ei35?-9*cxf0#qJ!-qLx-IxkXGyB-(hj)Nms);t>pAI}+l#myZJb5h zi=?k8c*hm5qA54-T&sa%K{7`jV?2$jociag!qG9Cm>&|H6L|99IL3XQjNR;X^5cem z<9X5q=nlQ>OLGO1b@>yy%u&bh$NH83_oo&wnTJ8b{B` zj!vwRwf^f`U*KhYU7Z zK6CX01ha|`u2!SV*)%2qHjZ|(Q#BZEZ7qe3=X&q;i;l8<^UDVxwe9zeT2j<=DF&EnUjHT$kiCJl^9GGWIa5L>63Fk>h$6~V-rMm6#8E#qkI z!{60}n$8oXJtBoE*D*eiC*kJD=QCnbq%}#XmDny!US7`lU&&TI@9fMtnhoEy@IpIV zIGvlF_c;v_eb~$oTqdRVHY0uwB#vf}Mm227Ujykv)y^BnUL{w%r`igR4=vo^XI#G^ ze$h(xu{Y*wGoPj~{8#M2SZ#HJNU%c{SWyg)+-T==Dzw~#;Du_Fjc3!5E{#`+d|<;v{KWb*+u;2TZ!F#gcriUny|?DybQM`Vf8Gx+%T0d6N<;*w9xN9CeSLvWl!$ED5>sDO+4pu-YQ#=jYxxHeS7Gxd-XhKIg=EY8@>oTiWX-OM9v{97mki z8BT)JGLnr(iQs2iN& z5^f}SE(~s~Upb3kq6j~T%DwHKh>_?2QW;VFYocR$y73fbx^q?ty$is7|1+28o7}cS zkMeZH@6HxRwlVLfA8J2P_E3)N*XxqI!pV@#bcjeY-%k&Ej!YApdLF?7lU?)w*(H9c z-xLo_E^`%>P_PSY4E|;B{fd{XRV^(_irW^ACEe*V0LKgyMe51;~K3Wx;+&Uv0&Gz>kj%!YHy-sR6c0eAUwJx+=~0&18RE&aWbIELb=; zxbQmOU5(mEOypbtl-^^Cr&=53ogd&qo{ zbx)0rgxPmlPyKp_qyf%zKzCOtO)S#_iHi!Ex%z($G-hVrra9l-ZETdfO`e`}vD0{E z$7A0&a~svDlx$~n=TF!@JB_g8mmE2vlJtnDE|%JVgG|RlQ!jp@h)H}l({}J)_Gd=@xKHDc`=5p`n?U z+pg?-e)JK`QCb+KeGm%;24S@+zBr|xz3XOX&{@3(w`<@;Qls@3~SPUKXH(vW2Ol*NT0 zR)SYUM(F9ouqNu1usxN8J&qH)sa6%F15!zsr)`XMz()6fL`H2};Y}G+Q{Tkr)z(%{ z|L!Gr&R-ykEXqnZJ3WijTtof)&rQFqc+Pg~&{&hZlhebSM%KFehK5Gh4i5;7kP4fL zSD2QNSY2kPi<+XU{QbU6d4`NCk*)sNf1L4ac$dY_iJYWjBE8NQ*;5v&xLJ5Xs55Uk-nro(8ol!?J`k1@SV~n&rFDwkIQnYiJz_2&QOr6 zo%}`Yipa;#$p{3b)S_>$@4Whz5>xFi?WyG>C#TEL5j_yx(yz-jGCE;qW@Bwz3C_&c z(N**o;A{qi+QF@tzw9;SQ$1`v@4I&f>(yV~Tc9w^G3YiJQw3&zE)|_J3OsLv=$$JU z$||epse5&}U{He~L~dOslkc1c7i6r1kl?HRc#eD(10AkUcPDObcSeeB)bZxUXgL;o znfSm3fG6HwRV*ZC76@fDbAQz}*xxftiFbsK8F)XurqQXAA6)A@A#eq;ck2o?mkueA zhjpb95)u>Z+dAyo3`Ykk8-x?s2Iku7+1C92vCbErU1R_P3dyYTm48%X`#Z5!bM<*( z7J7D&x4aH_1gD*0t-NC=`x!H1EXQ{9wZk!%?B!u0O>ZgbunO1}&%CR_b*Rd9m?LoM zn^2mo@B}0>L|c-7cYN8@(<8m~V7}~1QqI>ztGS6E&ygdxw(as8VuMK0jmV;oTM}tP zF)Y(PCj#9$RvOwDz$_)-WnlrC4{xmp0$I;P{98iQ8{-Z+n+FKV3%?8vkDEuRD8F#}Ot!%7?dk zL=vBsmjwtUmUXyto77f z$;!zSc`^RRkXjTy4g;0H0OI@i`hk>z2(W{yTRA>^iFYvqvlY1FaA0cH2CL`liJ0}< ziPx}~h^6b>bE5U`^T!kSDgKNl5D>@<;3zAplWkp@U)RpeNJvV^2x+}}%f2ZXDOp)$ zoM&(1qnnVHk?Ba)TV7iuIk0dCwmb#PtS?Ve(=^NHK~-E00_1vt*E(`6_Y|{Qs=S_t z7}_NJeP2|kd2IXKRVx8A>E>qfmQ=V^c6~{l@^*1k*@*dm@(6-8yblMG$XNHJU+Di_ z^l&{Xx2>A*ujz2a`vWJkR*co~@KdB6cdnjR1h zSUpKgW6kco7@+2rUFBaJe6ydsP+n4MsP|cCq?DT?w=hx-Yfp4!@I5FYlOCX3$3j%HG&g5z(mh{4B zfjxGCHdC8(ueVihEz63BplkajYiUqo2trInf%3h!e|M_pd zCuQtsjq^h5>qA(||MqDCi$3EyO09hBlJxBzhiW5b^f=jT;MfY}n)KW@I@O6B87zyt z&)1-uQ!*3FIw)Tsj~3yeIIo6SjPRsMg(Z>2xt=ph7vEb^W`*Tl3vhXc%FfHCv%0Qz zTP?wJcRqie+CP7g-c)|Nf*+_BS>sQA^7xbg4g|@*x4%0%Iy*X9zRKE<8JMn~m{@%M zoE;-ivrhQdR+6jB)57b@Y@+VnnOv;8JU_Qu^7e0*-voEUTK@YTHZlY(#1vLMGxrdd zV~WxXXk?s->CA@!)kWq-HPBp|@Mh{$)p6w!-9C!yp?%_M{EiJhDDEioFyBsJA^oRwH$;#SSe?iR^I zaNA@JOSYWNqo zHEW&kwUytgw^)(t%CEKx%L!$iWN#Z$WuudE(0O@y$kyc99B*jpD@v=&Vf+{P%Drw% z+ge+T>#9pytH6bgt@)j0jdh)Mb!7$rX)P!&=;){`D=utRJ4dl`m$i1EeqC`l{xFqM zE*?u)5$7xh&GSZIo|Zd~53J`2CJ4;HF(r(S8O0YMZA&nNF~?)bz`+=FskZM|B5 zq`VLJ8#J~GV!f_jp(A=4}dQnTxU=89`-#J-*_0ImmK=Q%_ z-@59i@LamtR%PqfvxkJ1YI(d({cs7)-!c#@X?2Lv!j;0ZX=k6WIewYyRd0Iu39s#K?Y zL#i``n!>Hsj?xn$Y+4m4VKtQoa4pVs#dtu7TbP$AX?<8Dn z$9Iy@dq;1Oi~OBtucj{*piz8@P_r{Sv$4KHw!`=3UH4^kyeT;K??3hB*^?zTy`G&< zUzmV+`)j<;JTvnnKLE|&==UnY@?0j9VM(jyh@7V{e~F}Rd9wLd)|b2gq~WZ#8QB<; zkz_uUHnC9my~-Sc$9BJ`=9LDFD#9pAlE`vsH`x#OI(S-2kLAed_(&R$uN||HDjpix zEQBwfuXn|pS?xF3aE+{0dGocv|_DVKR5u)sOa>$y;?L)zUVX(Ajk{ z2`7v1aOdzWCs}#sqV(U&?D(~jzK*h|nuXQT+SS0wi}Lg^L+n|wp2Vqzt-U?E3>f2! z3qK3@9s6KkV_o^s?Aoc7la-N-!((=2U8>Ekvuh6OrL+AtHyMH2;wmAL%gnKnovw>! zUvXAbh`2uuKnKuKajbO>9f&lGvV2S*AeVdk?{LC976kM%EOfWkv-t{wd`+u`to*jV z6Tupf+`aMCSNr}%z!2?a_Gyt+cLJW!9aLR2qiZ^u z{qlDMkW)HqXwnH65Mo(VHp&LJCx4z|6v| zC(tbsDLU{y6hS8M{iCw!i~icbCzk}_?hb{wUjwrn>JzmVpU^kVDmJ3YUckFs>)bb6 zCRFzYff)ewLC;(OaKV^K{O2+Q=uebf<7GLwZYr&AD?AJ3+yTl5>iZ_{Tb{1ID$sVX z`uKJ+P1g*{zWSvkzS#2GB+uypU|4?Q({ zgrph?bS~-97+i*MA;6Jq@&mEZv<{+XjhrS4ELI5(L$YBEYNg zr36?9Hh`-X*|yC2`t09{ji&}{9hSNQSSq}G-VGAff|GwT)-}Hi{S1A;-2&8oOQC6I z@`(eyHJeku^BNy?87_P<=tq6Csk};F&uc!6uG+c@If`2jIr@J3uV*8Y=;gJgM?ix3 zB~iL}qx13x^fH{GxSHMdR27aSv@|gLQBo6`hqjD)|9`zPFP?< z?BR2>=#E8$Ov7S0(D>sgv*GV2tf*rH_qs5SF2EzN>sT#Nou zbA1^}{7>W4$&vZ3^15EdJp3Zg6Yb5Z(D#^4)sla4+e&oG!~u#JN5VK@jmSle?4t`= zyjK&CSQB||-Ma@+LSNtD-_Zp1cSWXxz*!U!WY*Q=PK0k&wqv1yh^5YikeCNN3*d#) zss%4OnwW@Ld(7C~-`<^h-vwc)Qf#;d7IXgjGtOf356^D2le;uLMn-QuCr+D@?BHA- zn%7@~PN~XN^(EQD^^v4FSK)_Q=6dC+(Cq6IH?nwi&hVf%a*(A~?m%P3AW73r1ANU} zeOX;Sm<1A^UDnk>N70WcsUX-q^*1p5_GF8pJH1vZw^sF+H?KaN>&XT`9gpemjbl_JW!#gRL!XabwasS$Iue`5nxqI&@+8 z{XECxU0(!Z{>4?(wVGy@ZrrXbNZ^WO@BiJOln^J5GEaI5(DYQ6aMkoIY!mxRjOEOW zl*#`UZ0Be5taqhQ~PhYit{rM)l1^jkajJUikKP9ym2@}YN1?_ z_OL04LE03M8oEM$V;y3p+NI0<MxThd>I+HMzODQBhGVDk|9Jt;D<)k;J{Blm@VHa5cJMx@0L%^b=VLDA6?;pBwaS zi-ML`WPr-n5H64m3oFo3Pgl33*A;8K(73+7UPwr&t*vd!sT|o5ZfRnC90waaDJ3N) zI{LIOK>}%fV#34I)6~SIy0WsgJQP*s6M=54!^h-4#w(Hhe}Z3lCP;%HxRk?10v5;f znz6DCpj=t6&-W|5%kiK;!v1l=!NKL_YtA#!ld zEOVfY1zp0G8aLsQJk?9FWCCw5*OTwtOmDCUa3UXMR@ z4sL`3PK0_8C7Bf^2FJ^Etk3Sr$!Fvq#=nXf*#f#>i*Uk4oT$FGDez!KIh?Jw)_9*< z9v&VJ;chum#p7@(sjDxpt`g4+a%H1?*WWO{N~xPTIn50Ze_}v5>#08a?f~}-0UrM4 zG57sZ;B7~Mkcen!4nqP@Bo`C>OFfp6m>$989Aq*S4Tg{>5~m_~x3a z@}vT>#0^B?-CbTDoq~LR0Xo=C*uLSQJ}wANJm}=)MDP7+k%WXq1&f|2z4{Y{Asl8L zyb@{AUrd-~O?VQtX;DEqIJmBtJ*M|b=&y^4igF>}$Vf{+hx$Gsvj5HIbyaY$lkj?8 zIQ4x3`tmp*VM`Du`zz4zMp+$J9tdH^sAut-%}-36(Fi<#I#aU4-g26r%mMTcJudpb zs;~O!W9MVOot?j-ff1&}iH(A}v>XTMn=ni1KDIl_c;GGl!COK6`hTeb=m2YRE%@=H zr{{Cm+i_Q?>p5w4Ukj=7vVx4fJd~CE^)UDC@b-9-Nw4!|?c8T^VL^=?;{(zgbO*V4 zcnDRHXQU)0rxzC9wj-JTS^bP1g>&)C`htb!`!t)YsiE-|BfjhX^&HN_4|@ndc>8bc zSP!o6W2!F!0f7coa_8peR#s3p&CJaoAD~>jPY0B6aDln6C#K&~l7|1()uO66J2{=4 zpVw4WJf}iG*Y)mT^ecmkSydpmz$UtVqlfv|32R0s$ODdHv}mX_vlJAUEh6ZGoU zFGuQKu=0+rt7PvFgLy}mi`Du3=%jofTnf2@cCg=0Cf~+3HpnEQ+QLPQcC~fs_8Fmf zauVI{vlWl$-H(amM0x%mcmLwI#rG$@$Hzx@?-?Nys3yHV#J=N4hbtp|%jWma&`l9W z8$u>1_)%-9tE+2lOy#1;qQI1tnHjm_C-9gk@HpYx894ji&*XDiW$TSn#m>S4vwL-O zBSM_@{CEwqKl8m2_YGPV5*D`Kc0FJJsF1^D4~rTM>K-l-nS(c~EG`aynf|rOc4KH~ zchTJSYMoUQ6El&{W}1+g*mLRE`uOO60j-T7Nr`aO5@BQC1d_dcD2AhlnQgY+7@(ze z#P&y%3X@OE%vAnGG$K@9RUIQ)g=&!wBbaj)A@t9n;RFxaBnF3w6Yo2=WlFmZ0xk(x#{STPiI$G zqdE&GjeY-X8!(^vK4U%2!9y2@C9yZGjUP3c&xL`rGlvW9l?rmL^U)k_+z3^%&qFWS zOs*74u+S7f$A zYQ~|zK5}7%4jUDyl?wdZ%iMUOmOz<;3;PA=NitWTdFy&Ve}}94%6f!w*WZeVjXiY} zK2WrUKy$XY7tGf)%g@g*IGo98TQEI^My@W%z>Lj8lu7u$iT?J10X;yy@ezuY3b;pp zC4$O8An+ZkgYNF`+!4a$%dKEA$-mG6ctY5|_*1Aoc;B~uLqPqLXX`f$bG|JG`^kPm zf(Rc!>_w5&C}u#ssq{+*3QeTW9B$s{A>kY|89hC{3wA-Q_B^{eT%9P35AeS4_r7FH z0m(4;5-}kRw6wn#CuQ!b$oc}?ChMM)b+g5<>=rbbPOX*NkK7%)Uwg7 zgD8hQjwFRZ7(i{$=65FiT;*x0}sI|f8U10r>^O|)mwldBHU^B}j^-=!8rV#s zvq|K4zQi-Aszf8@#`o(9U2O&t79=kpAud)^6?>s zz-GbbeW=19Kt@ADhzj6GL_qi;BS^qZ_8VAVe+9)o7iZ_Hva-jEUi3N^ZtidjJ01** zJhLerIn?AHNtoJN=~{mSBOT7Mms-2z8o2BV>|GWE(3qe=E97TEs z@-uirO)ie7O3bhnk=y|Oc;uFlrhZ!TI9=h_Jtp5z5u*C`_ADQk|Ne!Qjc)o&3m2w( z6TTp*Tu5m4eGXZaocju>6{t(C9!+sU@qli6qt$h*)$-}rI3}uS-{4@NHs+8%^As%C z_}rXI7WM;vdR{OKvtTZ{PZWTi)&oN@Jj)&%?rKorjRkEB_ah{7xggvQTj#DHPmi4c zYVa)gWjObPR(pFJio7+0~mFO)-~8JR@WK z>wK1e61mfXy6`TT`IEiO`SP;Rg<41La~!5iKQcT#Jw4syOd@f!6h7Ha*5UxC(G8O) zA9o;5=6!Pr%-zn2Hk%6!bl_%uhYo#f3Ce}yaoWefAHrd2yLHJ!%FF5cdTh+h%&e?_ zL?|#^`3q4{P#i$(cMT26u)knoP(Od}M)k{qdSPj4X?}iwot^yHK}TOFD=U9=f0ru4 z+EyjUSOt6HRR)4Sq{Ar1GaLn~o0^(pp#T0xNeLH^8J3aD>xx!GZg`>W=m>)PaIC*} zQScbk($lxTAAM2~3$`zDqV@6d8A4Qr^`*o@!V!E`oL^qn^uwD#xp9HQB(YEq-B5^v zma?+)ZWL;s7Zic%!XG3!xVZ4Ku|-k?=#o=Y1F`E+6~t`xsr|4+dw((INwG|`xVX4T z1O$<*vvZ6Hg?HDiuj^_NX|=IjX2iw$JxHMOIlDNBk^iaxU0Gkx%5L}{WLEs{fxH3_9ZrgfSCBd_^&OKr^uYb6LEDI8wckryj!$p zzO|x3Tjo!B!><2Y8Io__)trjDmPNYF2-VgoUW>B->(z$ee41X=&%n29EYZUZP><_@ zIy?d|7rm>i+IfLTadclva&eO*S%XsOV1rP3K8YaOl(;kU5Q3{B;0%Oua@UKSRfUFP zmdcBZMQwMSrC-J|G?~6BlB%GqL`0Nh|82&VJueptoh?uv?^hr(K}s{WbNNx%~1BGFL6avh$p;9rP;0@u|RZi2t4P9F$s1q(J7mIrAG=Rt0j zm@xk~(QPg0s2ZtqRaK=6j%d?P`;V~BSL8Q&+ELs{HbkPu@M|?tM>_w>a$At=DDl!U zpvP%hFP+b-be#zy!=E^$1x9GuDzU=6P(<0((>~lj+CUgg4xPbeJk~+_sSy`^6DD6g zp4}711$maQxyl7^cUQJgDn5Bz1VC39M-smtg*LEQisbKnM%aPQm;d0gQ``-=;t-eR zI9u%&$L>*tW@&dLLe&#j6Nq+$H)%yXZ^c=>nL*vPG)&PuS|h7uF{y%AxdIhgyL8Tc z*oePn?1#MR9S&O#VD51E4+8IXRF&I(^&!W`EJ@pBDY*Y+Wbw46O3Oa`u|?aoTI$)p z+U8N!WLVY2Fy;(ofy|L&*%*37uxCE@cXX^=YiwGIL=f^P*~Jk7#4XWw563v}&PKW5U68m@02c{AXMqKY*xd-Ga$n`n{Y?V9fINm3y)Z~bd#faN!#qWCv zn!qd@Ga0G4lXRUW>X_qA9Q$nX3(2l$*buodE3+x4`u$zriZxuKlZz3MgT9I}6I@YH zmQL&8L$TwK;?6fo2Oh(QAXAPPY|uAh*uam*Rr6iCvt_*Xl1#-7<<^q5Wdb>o3H zJB^<&1zH~Zv(rKYAH}PysJg!CFtG*n8YA?mAVDh_{4qoboMP8C&0?Y48lILF^orQ*<- zbGyqs`cKCGhv<`}lkFhO0V;K2~ZHx!P2qYJ!q^vR$376E!#)Yi$SWNKIHnM+s2o zmxWu~?v;O|+Z@O){wV^GHA@L)|Cphbn)Zw<;k-~Vz5PDz3svU-S59nBmCdzTX{4RX ztB=+qjDg}H8>$09TNSTHm8>^SnF!)dneBuC-asqCctLeZa~XsKLf?2?eP}EOnw_XS z`*z%j!;I^nCad{+@8r1so1m_;;CSq;y^VY52-h+GZAK|^!Kqd5l*7b?{dn13O^u?0 zR^GKl49J`5PM?B2+*zug*z-eb_LzPly=<;pVqp|q!ug_r=(U<$oS9t8sa*|PDCI~R z{4OzHF+QJN;Y%jqj@N7f7@q~}56|u^^>uaZVQ`t0$$55)c~*;gN-mLPCKYN=ig9%) z06!zra9A)cSWM>ATQ;T=mBu}a^AO})VWGS=sw^nM9XR@Cy2e5`x>cbpaevg0e$Xvh>TQ&ca1p#0nz zOr6!3_?_=l6{RT<;{PnIx{P!A!%(@im}(=A>EdRqDVZ4xy}Y&u8W|T1^ds-gv{`6IgvYUuFmo6fNRA}sdP>h#TCV$*WI>%^e> zsUyAjcC~()7;k^(Gl7=fHLGR5qGzKfkUe7@2Wg_Ojy^$SV!-PiL(aE<YFKFGMQv zZcI2k$FnV2{WbyILR_+`js0xSoj(a6Ky6vhn|F?Mhrm8J5G{^{y|?C&)5at^rx*@l z1m*sbpEIukrx|HT=6Wf=1sl0o@>~~v+*rtVJ!Bu8i909wYdty(-W;9^_9)~ zD2?IQ6fx!=iR&3Fq8K-J!`-oHJsVv;Hdh}<3(TbZ6tSrlI4*@2j$?istfwh=#-(?5 zp!oMAhMYfKCv(7ob-(@5K`W9#+Icy#II2!*0E}XVtB!&3w+uW!7QKys36EFsuTbjg zTW&|!3<%x1yc(*u<6fFQX=QU|68Z#JAAu8g$85Jk)^6IAZ>`_uq&v^B*ZFax?pDSU zEInR>qpsjnI%(gnC`_B=+V4}UW4UvOak4(|-l!e?NIA^9-6UAP964t*t#Ho4KD^sI z+}F`xIY6l-agP>_+8gLaRDdRwM9w3jsru7`UY+Nn6mG2sg!99krtM=Ccm$}{P{QQW z=%c{XytXoketyzuNUaHBoHt9&HYT!vK=bLC2ps{gHWBwXEuX2cL~CNTMxns0j$S`N-MvD+iUe~fcUTnO^?B?CqvQz-u*)b1 zSXquw1TKd#<8qd<-tkM>hU5H}0+bDJyO)D=I~UMPS}`Sw{wFi-+E#a7%O=lfMz!id zxUOWDW?6 z?*aOJQVWJ~GFVHXTa}dwb#r-@gCBFs0$T0b`HmBTqjg)V5H_-s`c;NU8B)E_LC&VF zjgA7&ny5mx=s?bVd5VI2(f-lqPSOOdA46t4BY`XHKr=0COpT$4#WGA?I0&SB1=V$Qi? zR6-HMbT5PtF=#r|&c1`{h+DYaFTUd}CK_T5QBXUw6Xt0E@8Ve6`O!o>{%~36sP?j2 zZ{X!+p8WE*8pB~EZnFXgl)<7YxrV|xjE>(rs0(98h``^8tEt#JQ)7A>ZEbKT(Y0d+ zHB78THy3eceYq)9JbCo-i}6Z%K^dXOy!{+Fh4oXm3)`-lm*7n}XZ(qD@Qrk^(fbe8 z1v}vVk7>+LY{lANQ)!J@Tb+C>ofB2VG zCvNJKAj35`D}QqGIM4Tb-Fas)XkEJ#Q-C&PEgk9}7CYQxq5#-xPHBWnWEWeS&DG_q57|c%4$c^#+z4}n^{!n=T$N(vc;zi zvykpElnM~1rQr;zsBT$Q$4gU;Aaxmf@3m$P3Y8_iAiB_hZ)|!Rn9MCe6{6!JTSJ$) zq%-8ER?Mb4B;f?f$hanoD2v_9U7bd4ge%O}GYm~C6##WAO%>j;|JB!#XY8ee`mW`1G8e(4lRd7s?KWIjhP02SsA02p+39`#P#I%2z;k!0y z0>6a>TccRMJu0vM_N|6dx4VOFe??>Kiyvj#MSO6aE#R_I<2%>C({Ghq;!Y`p*%(eI zBl$}^{)h4OJ=bYtIzuSeY`0PDGy_{LjcsEx*};$Z-HQ3%1=%t$iB4snu$=?N&a@!T zemMKNHGXs58canc1TI1?%TcxFGy~8ZH0&M8Ep8sYsb=-o*H0A|%3EY{TA&&qBk){h z!L@oD^UOi^JxvsfywwKGMh)at74@bw>5aATw%;_nyRxgBZ*aR-CGXKVn2#Ed84p=d zAJ;LnLNYx9&>uSEv;2`m9^A8DuY0CV3u+$|UyoXDOXNjJsIQELatXg>@YkpX^84pJ z3+CD>xo?8^>4W&u|3`7QW@t|5J*rG`cy?~^D4Vps7YQ4HWJgiS$D0=AZQmIe4x&<6 zLn56*BMA~?ozw^$aviv|&IO5IVwdhI={e*l*g$aDWkZl+LU%no_HXVBI<{L< zJT_|5qbOV!k2AI$RZFHtOZnvE8;GI0Yi$~fy0rbIQnZUF?zIi_u|4+$3b+iQ(L`Wc z6!0q%V~w^K9UtJ{2KX5D$#@XZS&_Nfx7U6#0!pJa=DBWMc8qmGK*nElZ-b+XYW03w zd0O#Kx(N?~wVVLV#Mtj~w_aIXmvvP&{w|K56>q=AVa)*)5MrJF)GNDwfHABLcxr@c z(6!A!v#R#kQ-HTP;IE!m&8gCd|J{h)^Z=*04q=2K6Rc1^>#5hwspr~~QIo?D|<9MJ4_3 zpyuhqkNs?T@KvTqp(?M6o8=V=$V2iC(ImQ19*g>4HsC?RG+zp$h&(!?pl>oPe+|)0 zztZsXPbb(|_D{8sC)uCCLV|yzaj*MIOoP=KPQ`TH2Bm;HbGEIH;qSU&bR>_(+!~nW z+{r~Z)Z^=~W5f8}ezA<=EWKUE$6)=)0_0ZY=VRhL>#gum@8udm@Pd>6rGmss8Io)t zV{QHS{&K%0+cdQ8f)Q8?Buv_Et6F~EEi97%Jy&#lQ(awwBXGy(*``TDA5g`F!Nqei z5$XU-;x0DuG9@AB%Tmal^OQ{GjpY+Y#@QEWSv1Mnu%8S(UW?kqCqn+r@PPSib&l<% z4 zMc(2R4$#gcI`3(0hUg&e!E;}`@%9N^0md|N4}HCHg7Ief#hwc_qTWW#FvV5c$A@vJeHg;X2U z{ZB>Ta=00^n@NBI9}@6@9}^1Ln2BFZm=qMc!G6s;5R9pg{WLiixOnOJ)nd+~qr}v> z&(sdSWd8-Ul~w&`K#L#wk&cYT8=0t)hw*TU-~wy1me+<^N9K|LEh}F$`&O*#kTp9} zmsnWXM}r5%5ll6OrOh>%V=<#!wool;@Z46QR@M4vK$VGf zG%3|l^jwX3@L!TEZ(?ha_Ft>EQd7%5bfkSKy2?6lvBG8txCS()-48Umtmbx0=A&FX8Nb3(LHFP6j~$i z@9+N-4&Sa+#?HYp-`i{W=Z{dn!Uyb&2)hoO1!)4wv>f`hC=Ela?<;BiBXu5cJe>_ttKaM{rZRJ=DSbViy|I4^Ms$_Wp zA=v~N*Nct3_Ab9ZI(LXgWHtb;DMM4b|EWa&C;$HxsrN#`%j*dp5@jPOfs<&1T=)Cs zWQk2AFIMRn(@$(Lm;)!M`WG!dJ$u zeswjgx!LviZ+soer>O<5auq1cu7M!p%+|k@osH{zO4vgr43evX|4H8j^TPl}o#)8X zbQL_}pG3bQOU)IOMF~qcE-S~Dc8Pg=VO&!!e0#E*V&oZQox#b9{u8@!I0gP7rd>8| zBRkE;wka-BM?=`4e%zond!t?Th?cV&VYP3ExuXV;C?5Ei+uAklkfv2ecs-DJEQH>} zCdJE@%;u0`e+Mz@$;sr73jF4^rlMCZn43#H>Y+VyFtNbUR)84h?j^st7-f1g#?(4Y z{Qb`jgoV)N_-^+wr4RH`+rJF2xgzQ5b^-2MafT*@1>;4-Kc<;OfIVq8xzKYtnVuQ4 z(K1H(-9$xa0q&#bziW$nXRSmH1S@}E^5)jKX|F_ry*|U^>$2c6p#fT&oO}j>^KxBZ zmK}}!GgT(W(V+KDY7lFxb5ZT6B(PRYQS|je!q%)xd z{4|h@3QxnTshcS*a+{PI)G_v864S9x5y5Xg_6URRZ6Po|k6ORE^6WTJzHa+el>4j_ zgNh;P>Us~%^+6`b2p4Gy3gj0S5^B+A49kaJU@$b@UN|>erW#wGl9JM$5r!Vn>U_Mg zGZ;%lL(|*a`+mjrezn@_sG|d=vhR&01z6bF$jQqOLbhkPF5qCj(u1d3o*GnK;kS*4iZktZQw5{px|%TTqEHnwG5Yp!FPRZ^Q=*i7+V& zh6rJsp|1LR2NM$n|G>aNiAbdH6;KsuYx8h-Z!IqVxJ1!WUXI)jJu)s4K-kpO1e+1> zE-Cq`JgCx+MZJv z``Z8j-6HsGXnefiJ01jb)Ym6xc5-pSz3odAX`Hr)HVT9VS`-qN{v2s@IVF5*=;$Ce z&X)>{C4v@WH1gDjh-=JXg7PNt2W)3Y|LbV?%+d^*)Th~xXYLq{gX(uzeqUZ%m`+CW z4xTa0YFMkpqSvTcLbA5at{>AEZ*Y^!ru}49iR5w{twmO*TP0`DbFzQXZRirW=qq={eT#aY}Pf z;L2D_3CHE*lNF|%wf%WtrRvVA7%hzMYZCJ3&-=T&^F$Rhx}^&?;A%XqfpDb#Z&`+^ zMTa^O`iKt>a!(FQ1sZEqQS*U1ll(`GlO|Prnx`E|P1zhwl(M!hX_p5Hx=zf4i>X++ zW3AccoGSSsmBO{GZdS~T(^L1aZ&~`ja@!g%&^X^A@D7?%)IwmRjl$XFOkYHD%LVw+=-d$j}q;J7_eYk77wF>g7Ua+uU#SMc{Az?kQlLDRcA9WS7? z6Q99wx35;7(%}O{4E9*^YNsu`_Jp98fv>*qC+e`w^ zuDiw>|7$yNmm_3ikjytLAptf9UfAnlE41Zb;3*#fpz#Bj;{N6)k4xk~-AB;o7nDA3 z-?tYg-$&^Ix42Sd0G{`0M)W%IBt# zEIBzD+ROF$@IcNmg)0+!JMr z!`NHE#MMP@qqr1zC{8I*C|(=}x8m;Z?nMXJ;!s=$DPE+wLn-c7+;yP1Tj_u3`+v!I zlY5gpNgE)X$#Blzd#&}zT5sOG5#^>=%Ke%_8Y^K8`iSdld#vQv%&1#GoWS9w_;Lofk>9gVJAt6$Op;-FIJ! zBp>*=#p=%N^6PBc2ayOrz4vVme?W_sl>HW?eUoFZsfBahkWwVgf2-tzj(*>iaup@# zDouF#30;6Q)gZfyM^_f?W?H7%#-qn05DwlZ6WGVKtI388kK$jRSLL8hE8# zU*(T~guhN3csyZu+gfBOpo;a;buUsun|HNvof{**3Hj}_t)ZUFsuKqmuzLlb*5rU< z(#zEy%sKNTB&M8~opz$HnPzHV)HesK;T)A{WUVh1E9|3IOgmoBiCBaWvjz!GWG{gY zp+Wc11H6)U?J~9O?$*q~o`gc|zZH8LQl%xJ9HN@LbE1Wr;nN|NwWMrE9)9HpIZD+N zM@va$ngELpt@X`i`Da0pg9UkMzbJ19yUM5x@6fx}F@3*irVZnQ6p&`j5>rrMeiY9GQ~@yf%aP$sLJ57Nqv(DxnlK1g*Vj>frU}Tz zh~_Y%h|+LJhlhuO0>FBM!8bRxu<$rp;X|;sv7xpy_t@+S!=qQE!fc)!AIIdaZEbx; z1}lV)i5YAlf@&N`|3*n9dt_t;5G$=e-!w5XGKvTbKQ2xvv&0n_75&*3etv@?1+d&W z%_Lqy!OG$iFq*+xiDVvkb4{Iyin@Aw;uwk8qknDz=?51VS1HUAY$Vc?4=IZ`Sf#{E zc>?^|Q2SA0W^)|&Pq3k(k&(1nLD!26tfjORy44pA)mMI;p2khbZNe52U%}0@oBWD` zunUjyBf!ngZQ=Q0zRUm5gU1Tr#vTGQy1JyDo}OMI$&YWwqV5UhZ#C>7GQm3xuf-8p zgA8u~ZG!v?r}2U@jJc)d76>+RN+6PxojphlP}e!FG@p+F6X4%q*qncU!XY8M2hy{W zW>gzHI{}YFbulqG?MoM7#7SPYm9;##1IHo=x@Z(}M)%e!_|(_)bXBqv+V2hjFME%W zfrP{PE2Gd0M5W;Ne*du3=Ia{GnLZD0h8&=d=WeQ7aX3lWV#MC%Tk$4a@ZXz|b;ACg zBj`90khkIlO=PC|DpcR_U;oa%`P5#ZH@bu`6hNuCM$mDg-XUVw`JK6%L5@`*eZ>3~ z4GkYx#^{QdrbFY2OqF9gAH-p}%Nt;F#7~1s<1KznH21c8X8xSnAIRQSw}P(5TJqpS ztLl}t>>7qolewZn>%&>?Vh$Ch(DXZC`TBbll6O~obyiLFxs%s?=kkO2=|diS5s3@R z6aoF?k_QK6)X@dmxwyhcae{4W>FMA692y$B zx^fRhu|{J1AS@hkyu?LBM5GRHg+KuoJX-+x`$aJz)H9&HofdND6>~wBf-sf4{Xkkm zR(Pd~4Cv{y>a^eI5$jTn1%HAGoW|0DdleJ~eJ{e;j6DYEnMPo+6R~+{0SR6+r|4hP z&^&Q+GP23pNcenj6@=G>L4(jly$21``)n9G*#{0<%0#OSJZms|QvkqMCqS{P= zijLkZgp0Z9UR+$_%<}yFOifKah+Pt{TlRY2<3G&-9r*B)HGA9K$hal_5~K3Ynu>vX)7&sQtitJKG6zG;%+U2IA(U+K|6bE+%o4cur>kQO^EifUyJq1$h0B`23C*^O*RYFj)bNM=k2>0~{U8~N zf{4ri;lYp69i>G6Uo;g2_sDTA1rD~#?`?A&#uHca*p3O$9<=}TORt*$8^~^uujZ*% zeN=7;=r88THll(No$ z_}~hEP5U2CTs^K|4e~tLJdnfsdGoVGjZw^1cY3aGHonG@P`p0izoIu0v~Ko4T2M+D zuo&qDE5Q~eW10` zzhhzQ>Yi3?;fbVWg(BVN0eul3{2Kc~kgWoGITyZFbhT)s0KF9HSi8fTJ}CcFq?93l zWA9q4bw4n5J78cC|M;k-HH39;oiIt%OqrgMld{!Q^nu%YrmY^r2aQ?XP z#J8Cn^1b#Ae~kHM%B&OgXc9+#Fx*^<1E1PnrGWALIm=dCML@4}K@pte2kBOngd8H= z6P^G!(YxTl&ByW+lW1ow(4Io|ijVV6G9c{5e%Z|iq+Vz&vbn`5di9~qtyjAym#W|o zYd)1eq!kvvv`Eta)V9BpghuXFsWmUg9JOjOETrFm3@->BqeRUj8QzihCDbFmboiEf zyh-XI;%ghl?_JvxLF&3Wl4m7eg{>r;o2}MKUaBq)e&vq1wr0CX(OJg-jVA}Y@v^9H z*GP3_;!(;Y6ts>9e4bChGP`nx1)IN``eI+MEJ*zRumRiSQet&QoJV@L53jLS)P90h z%gLDbNo;l;$K$dL{Z};a`&;7A4+gY_M7z-nq_qTxc>O{KKe;>AWe9rM57gHZKOtz% z_NjhCSk2YT@;oiZ{meg!W`8}3H6w(y<4TUk>`je^qsC*_g9Y|Pl#OTb^4Ha5RusC6Io z=ubnQKXEG&3X0Epd9*6C@R1+Y`8l??Xmf@MK4qe2fz%8IZe@hkM*-?UvZJat>;Ypj z^Fn`?Q`lZDZGorF{T*KU?x)gJ2bn#KiCW2={*MpdV-c{r^%8$_FN%sW!mRbirMGyF z!`=i442IQ)A*obHT(G7WI@~^gn#9>Uo-|>|X^p57JlvFcj9tg9p4^-)5zE)s)wQ*@ zhMu0TKfEQ70OXGh%*=?rRG6PMmSXZ_3YUtSsC|ff=x__Z0YwL3BlxcU4P8CDu8iE1 z+MVrnK47eAY4HXM|9fN#zO+9!GRW$YGFetXQTR1AkS0M~<-+Q{VA^ z*gf6HQBS-k7FLj#7x;v{LP83ZVd~Ol$IK-5;S4^{S^cvK4m_|94^1Cg+4Op%-e%7Iy0ar%F?u-}kVG zz(*l3fsJ8Ll&dJ3hldCM=S#?6z|C=Tyxeqv#&(7&_>gnzw}0z@dJ8xfoTnr|w9}B0 zPCh*Nh=~OQDpQu5g+2|+>MIrd?N=DoAZ7Sa6H7}%eEbhQJkrQCuMKf9Naw2zX6ELQ zG-;^grZYr%KN{VChgE$M9q;e&tAK+!ACLiP!iE%)-jUws_s1^oP zW^cO*D&pUYmxNW0=CHJOlRMaYSRDTC3{Ef4%tSZ(LNP;Zzc*eA0;a zb(;r&>s?O{@|(9IpG#=B=R?UKjJO`P`m5qW>hhNL&M_N3qMBr7FoNJxYN@?_g! zer;`SU<6ZPeob`dwlbg%cPw>g0kV&{>MukFI4rI6lH^hoUAUM5EGLaAWB3j-glmwB zqbb?No>x&~yo}^sjE8K>TbPo6dkD#0s*~*-?Zq1l%xCHBE;FV6``Ve|&sSWDx-b%eDXVpOCUSv(U8s(0%vUg|L&gI3$NU?$9 zR^!>QazT87n!K#7I+$vYijcNS@K)*uU_66}#PZ(m?OE0n-%*S`QvN-sgxb}|6c)Y- z#QhK+2k(*JhmB_tMQbf$4rgIy6#)2ox{YBnOxW_$U~f0-0Jlu=X(E|U{x+K>fIT~7 zDFfEV&dxZu&`GXAD+dRRTPzX1m7zd16>Mc!XJ>2z5xVAEkw%~n6;UFS)Qm*pkV?UZ zCH}k_q=NiK!i86&dhCr`i+R(+|~EAAet3c_VHI!HoCh-^JBJH1dda`aU? zfOP6oGJvNgVKx9vj$`Tpn6X#nL4svsN{O=fkq zlcOU`)z#YCnz0%Tf-zA{ByjRTi;4gjxrXF50Lv!9dy1g)zG{Sd8>prHLHkfz_+jeB zuC~#GOz9W+O@yF((&*2j)(iRsr&5}d^6TkIa2ylm0-)tWr5IrF5{NR4NlTP?o=skr zd_u8o#wq>WQOP|yebhb^M6JH%FE<`{7llY{RfPuM50 zf#EOA3obssxsy|T`0?rK05bv=up=lY8y?Z2e)b z>2q{6yCBp};u$&sAaw@^Ht027e;>QBFff?kvA|lG5_y}l<^BFKya24G-9R?iz{)wrCYY7Y&+nr?30#DgybcRy7_Z}&4SG+^vLZ-<@LFU4$urZ}^ z2_5@R$oe~&nVgBmDCDlOfuV*=w~osAWJivIdfRW@W%^`StxO;=xq+?Sh zPD1E-C}A9pga(-yG<24lk^bXwq`FH2BNNJ$2&B0Q@SOF-P`i^w#)WIy&)m;s0H{B# zA8dnO#n+|qnpoN^?u!9#MiC%hyIVjF_%XQ?NEvR%a|Ft#WT45Bzze#HUllf+avFGW znS)aU;|!y}up$f+Ga{Q^+9!Mvj1wCP#5`Dz>WJ6wUGd%NKxr{?cNj~4sqO$-X4^ac zV-#>FmY5MxR2c&KK49vXxN`hlJW*yf;p6LbGXewX7BlHGK~^FVju!1stkl6>nv9sq z{TD&!e{bZCb(~c%KQJ=*~%htgmAm**&wNVUYQPpNkK=e8^ z+6C-l!VKKpNS2ZT;QJvbTJ+~nPa6SozK-^%)*1*6yc6($rJpvO`Ys?{z+Tv7(+9EFQ65WR(>KXb~^7>LmzW4dx#2GLp?Q^qKk=1GbGadf>bl~^% zAeXRQ2xMY(H0JYXez!e&U@|2@+Rn~?SxU)*i-?VFXaGF*Rn$E|ilU;TqM(2w1})^s zI0AZhd7i8s93L0`UEqfc6Egu|a9i6$AYyQGa3p+WNplKQ?p1LprA?I4)YMF%Zfv3e z%tfj|6%<#fe5&xUvaYn|S)lac`S8#dKz9MS+lQ8pt{9*ggk*TA>Pb$$lc&!mX>dB) zuCY5R=^n6sD9d_HzcaqR$jHqd9~%0xAhJKbIo!-@Us_+1Fji9y_dS+^P=SesfmIL~VYBHPUe+vw#o#_ahY-PU?a@kcn3HVqOHYjubsL7s+95 za`J4%=$QkEo2wDylEMYmQ`gMQ%+^95-n7PalK$X6A)BX^*t7)nGe9hCFxB^CxM=b01giccm^C0gg$r~Z+NcWwJI^- zniAzi??j@T2%=+Q3Hv`0zX?JTrOg+|rt}bre?w*lL(Pl!+RY}Pj^Wnn?~RkwdS@(u zVQw?|!}Dzy(dmOwnWkS{b3u1d7$Cb15^B)TMhauSN6o}LWG)w|kTL0kGP!QMh zZw1}xcz254@8bG*m~(!fR{r(~B?p}+pBa1HDw0ZdJY)zkyr-$JxXG(NOCfd=OYipC z=3EfpydyGH$M-D_hFwyV)B~g?onQC&d(rrZ4wx;zF^MLOTiIzw|5{pY8U4;ke!cbO znK4wcKwiKo-;F)+G9zf?giFYzVs0t*mD-eUL;od7(4L@ynd2Dz>MoswMtJ#3B-aEW z!V0*qFoGr9-rgP?9sNhqe)$qe3%c6~d4cFNV}G-!jR*n0{73|J95S+%nHfA{Vw8t( z)zyE8l>BkY$qh6#2#AP~=iW0j7X`u424%;_#JpJb7bYjMwPCcq&o*EOaqmO8fwJ)E z_&5icM_^+U72GY=O+_oZF%fX%R`Y%skYfA=BBbx>nh?G_;HAW$U0V7~*3;9&NU2#c z{*t>8^Spig&(+;c#1K=!GjYs|;vocWP|5`T0E+O=xw$!G*0<#Id)}qN0>rZE7 zt#_jtoRk4i?9ekn-SJW(e=c@(a+2mbI6N#Und|~ihnI#3IyyR0=}?_BhCH_asNmJK z%uK*gn3A3zNs5af6#SLr-H9!mD+ebB&P;D_=#cp|$@2!XaI?>~t&~(aU<6*k-+uMx zYhxo}^-GpgTUVEeElK6ZR#24kwsB;5_|C5r0x?okn*qFy?8MINVnh-%`#hcJu@@Jv zyYEyhvWR7XBq#uW!_m$Tp5zVR2Ju2{a?fufBR_yPR_neug-3N!-P_wEb{fRsv%i^% z{=bK+ZTSzS0>aAOk2!8Ef{lq(Tv5M_dZAqH#_-2L%yF_=x-7 zVZEps3K{D!Z{4c8NfDO?)7YD2)Bc?|IlDf`Q>OhgE#o`lj6=yBIe?bpp7EF-%l+XM zaXckkae2KKX@e$dy%m!O5+&P1qE*?rekHepuY1ZK<-tz4i#-OSUr_g4$g<(6b|JPh zDb)Kf`f_iAlj(c5`YjKT@wX4Q6GGGes=d&WlG@B~)1rHTVd5jMj_~B3k)p+Qnqw;O zrHqw~&WbWBkkt^Dm+>p99||&09k3b;R?OOrnC|I+P5Q=VGofV{kIxC^e}l;g^AJc>(bWP#oDzGGp8N`RN-OQT7(zuz%k}BY0W7<@j$iEG#Xb&mx2ob_-K#+8P@H zmCxO=Q@|sjm}_%^$Mxt*0&M6Q^$8I=is{v#luf>t4T z_V@N03ox)jtDg_6Cl4Y60AFxS#pI;&%2{5aXaaD=M#e<;s+a>6b|f$3140j+o{Ew) z{U>%AI5;?G%COIydkB0~l=z`ID4o3+1ddH?qim+^g9n8`-fqvGWmvrGK=tng%u`~| zR~oz4?fCSGcR=3A*m(R_c&Gz+th{9;yK;u2vxM|`oQneoA!nx_(dB6Ljxe?TNuI8o zX*7KQWW<5RBJy>E!1VQdg?s-JzMNYRfQ=%{?H&$xa+-+d9~(m1*M5C|oPBq`nTi%92)5M&C?JOZ9(VKS<=)2k(XC13vCv$%AcK!xI zC+aQZ$Igv87!xBo`zAeB8JDdTZ2WcZ;@RHMpq0=WdnbTXM*KUcF&E;cna8Y@Hz9oR zQ$g_Oc*oZ?oZ;_HJCBbpGX)Dlih`VWhKj9*;LO|%Sflj>Cx;<7=iO9;dAXZyYtnN! z&U8HQm^v0gEKfswhUI~{0e0N4Mpi;C6Or}1Is&ew7w%}|b&G$rH-^nZl&ijnG`rnK3#zIH;Ci0+Z9Nb`}a`5NGbr z)+kzz%4pNU)Bu76O9RwmgI}wvFp2z)k*oet!2|wupvR8>lnO#AVgwAr1~Ib(v;MQo zF95tS3w#5Eqr3<7@ySD$4;c>WpW(wD z)-O%wE@X|KV`^*}%{lna2XVw&!!#tV7KLHUEP-u#%FVyCB%2p4PL!bHB` z7&muu!TI0~C>dy_b%-SwU@lD2^O)-D>R^8W3^&l?gU!`BKIjo>zvF_)(kmjS8~DB; ze-d!;8#|lsgPY*a!;? zYvpfVqaX!V%UfF7=GImk$`3DHFXr)e9%t>Vc~l@=6Iuu8FqK={B?jJtRa9&-L=@c( zA2#VrYKraZ=Sk}+)@SRu_Ix8;DjYc{7Th}ibQLJsarztcmb@{#t;aZ>FAlD?-vf*u z-9iRDOu1pC)zzWYaNFEAtn=19B{gL4@8~T3Jdty=;3pQtogDg<_PPAnJ5EUN7)Wir?F(vl+iME#D-Os!#6Sd zB>SlE7&#;fi^7lreqloUf*iK&HO;8KT`eH8QcwefOeNX%=D=ou0PMkA?kmhX- z{=Bs!#^YI-#@z2z`{8RJb3RQ7t+s35geB`+xph*=IkP0qq*ajG4Agzv;3kA>8k&=! z-jRWWQn*gVc(ZiFR%<`WePaiu0``7CDz#Un*kI-XCi1FR66Wnf(aO8M!YCb+bTRvE-y)0XkLkGNiBO1r$7bTuNKOtJM%kI1#-*s--amu58D94-P zs9N(UbL*i}YG_*5g^bvquI z94Ha9;})DV4*wHxYqRR`|8I7PFpt;M1R z2@ne7Qt!8(m}c%Mm`|_THyz?^*bTXSpk&i^VyD!f`t8-NZM*UfO94_G{=^jJgNC6y z@ydgS%$u&bz21CIJ?F-{(=iejVlnR2KGwcBz&^WgBxfqbV!D%Kp+kH=(f{4|(gUq$ zfnV^s4_{LYw(x+Cb2in=VWca$oJV^UIyyI|FlRSDs zI3rOW+Jn6UwK@IX3wsOuO{ICaJDzl{iwVQHVLl|^HsLGSd`RsG9l{i2z$`@MVKn_t zZ0&VNu%PlEbF4IWqZ+HI)aba!H#- z?d9`M!owea*E-~_()3Pt(k&Fxkc z!YoaSysZ*G zyQ75aeMGjYaC=2GEf(v6B(mF+qAOeoZI(Krw2QWT;GB z^4xh+hueQG!+l7I-#hft6p*Lx8_r}gSgZ*AROBByWU{C)=G<2LF4WEk^3Se7^@$%T zMHW98#ot znx(}Rf0AJy(gcK+3NjHhYnj=YDt#(w`Ii9WUigcq6!&CGrmex0aVE%Jp^>skfwC{0 z5syC<^J}cgQaOs(s?Qh9{0_5bTX7F{i(e}C6@BZk9oi1k-OYW{UOJ5qHHFVm*B@Bd zH-$TKsZL3eIjB?@?F{iP`W=Vc?~Y&~7Uzr|L;&a@IRWsbglt1v8Oe$)fII3=BR*SI zt^XeO;|aMq&OMq+Q_c&A(%Q^y1wdhMcp{TUfP49GDGtcs!#WMl!6X*2$N@bus~`Bk z;40}UMm~afD!@jJy+;1BsTwa3WMpKV_6voRQ_7Wuai8h;U36tX|Lf>6`m2*Cv4#Fr zLB0}g-=`wL9PkgZjFb@vuq)`D?e+*pl&OP^pu6ruL9fCqeveQE`cMb?gS!TdDbB;J zIt2cxfA9W5_T}B%N{f`kymT)<=q&gEdV?fIB0$;VerJgfBm^(7*q0uRp5hx>{3~iDOt@ZR+zmTno-w+S? z*UuPHe&V#t*u(f|{O>is;Q)|Zsl~F`hn0b<9%ReWgmn4?R5e<)$lY0dMm2i|%$po4 z42|-Tu3;0PBT&5E%IfNPLGS6ARSZv051g(d-`3L9P+wo4+_;!P39N@3(>4j$z8Gch zTAE{>g!=K%SymDXoLk3^epBv)aS?#zLb}PP3B75*#w`1IYHh)` zf5KF!+UIRCs`W7D>b0s~{;HzUvyO2nPP0#?@2j|an_h?6hNJ)LpzXP5MfXS@c(t(2 z;_kxFSfi(sw7ifJ=q|ckewL=4V(#0cwU_r%&Z#1-eR|ofe7EtJ?*yTgIX|c)f6uaL zdB68hbkdZ@Vz73c@8j6eZDrW+zNf#ItzQlSoydU0jtf0lU03MIqaC%3+%4&xD}xxjl~49mMcrNhaiq;{>myi= zQL*eCmi_z(U(u7gSlQn*^{%bTlib+`Ch+IJEug2M7zEk&Giab66X-!!C{s+VpTu3E z6#Rk=_WGXhP46|HHJyEEpjzT*qA*Gs!uQR2;K`k_vYB69z=cEuTM26_Z{kjMeX|TC z204wxiUbjm8jVNoIMm@@N5#Kv<6P<)_GB;P(YGROHX=~v3^RR*e zTdmsfTJ8%KffqENv?WnDUma`3lV?1#ZU3#DX&+Np3b4WNP;yj7p_e(Aoip^7-zC4d zyBXF_KnQ`I0PKapM?%`)(^}sG0e%l8mfSGmISH_truY3*px-UG1za~lvz`aCi%r65 zJR_UTBSp#E9u-YelYSK%cVmZtFVvUgPYC~}6jjg|Z@*1!q5#X*hn$h(Hwg_HGOjm| zuucL3ocit$DHFY!^3T&&B0yZB%tr-xhO8MqNU)6HNN*Q2S=#lEfalwn}6$6Vd{D7SDOVPHCv{({e4i|^zcNX3~CJ@p5Lg}vVF?|9K z)V`nZ)_E*GKR4q>?hn`Rd%ZUK+25e;MJ02) zPVHymzde_;y+q%aJb%7w%#OOXE;BW=*9dRwf36A)ChgXaHf_;$={@UCs^7dOC6lF_ zH-}bxS}x@)h2~~>+F^tW{{%DUE1AY#J+|E}F3#yYUlzniIOz}Pd};*=2{CK*%@>3S zwLh`!e`)fhSxW6Hde&IVfoo%MiuV4n=J`OTn{>2IIsNry5J-*I=cv5&4c3lK^xuL% zia>Dh+uVdeej%3q^O&DOX|#a7^^A0ep7+S0K#917v-aZiT)MWeFtjd)<2s^m{VqOi zdgvG2?dq_q^^AvR{8{GOsIA`J_cLEPh)_-?M$@(uX^nhvK~;mt^wr|Ba;ERva()+D^_*&COTO*G|n0 zYyc)z?NpvK@eMe@b0ZVlt{Ag(vKNCqZvDwqLWHU@>uq&B1|B5)9d(AFg3F&iKJ<$C z>>qHJz30v6W$0u`;BLf8zhHB>%huvAqh;V;7v>kH%BR&no&*8k^KObNKZT5yGm?MN ze&~OTL{Es^zjNQWgG`%RPR>u^A21IRV0b{E(JGus%DyzTw0~1K^KM?zmp?sI_bxOv z;=!BvwU7B8=-c4L*>`phj)n^~K63Zzl!?98P+ELVbprjUT27)GUj5FXpq7;FU%};b znAcmFGkFtJB}%&-i_5nR`AV@|I*)>`l<&cezS5NvTTMk1o~5!zAt28d%y#%IlH}dJ z4g0};RKN{_0rZxk6xg0S5XR&|`OSkZVb((Tj8FCR6}P6|K~Z z8I{-b*P3!S&v|2Xs}g$?Pdyskd(@-un>sC z20`^g!N%9=ZnUNjzc0>#8xg(h_D8z(Om5A%$Ej`n#}fHa%^<`qQJDZSbe^ zsDn8h&f!n8klCvc?jQnQ?blxXQ{%nb#ychfbo3}13RNfyWhe@a7;z)#sGq-kUVN{) zZFEOO*S{|j*~b1L4RS0Ty95BPnWDbrS&}42&9?b#07a9OX%-a3V3o% z_dKm)-09=Zmp;{&*Y-RWY)w!1tZ>pFyMuQ7^(Wes+}E;ye!>z=(^FQxt~pv8vzzB| zW2~@4tIn-s=f>nsR-Iq^6`kFb;t_gsd>|T9U0KiUf~L{zdsi>ci+hyk-j<9@cMJ}$-#*Y;|6KV zKy$>~#VpcS@;TpN3ill!Lk(TACNAPNr%Mu3%6vm(V=JlG7kZh7I6HZveyLi@!FCHC zr*%B5f_~_TNJzO+j{Yih;YbhTQ;tNge?lho0HMu7jw^r4-rkmRFCKAAu3OyT*+qOk zJI8DjrfVEap5|Ks>{0{6zkz?lDXxb0MorGFL}q`3R$9&t46nxtp`92crO18WLkbV4 zAj(z@*FL+x)1-I!Io%yaR`CWC z2`ROh9#4p7rlY6Ir!UZm%OCNoG$Ux=xAwi8@$s9~h_JU$SKV9Q+lSAxqe*>1_&|CZgLT*>A+o~_N<_;w=<5rQ&+NDGrkC(ytPAO{(MGdJ4SJ5+dyW$(A7jKP-&)Zt zse#tJU&)Z0?2|Y~%qM?$q$WE0HtMzKIG1=Y8ud14zluMvk#4Oqkq=fy%fLWUS6ln_ zAsPZ5=AI~tKhWGPp?GRP`lLtL$M^TvTZ3Pf)b4qV7w4`4M(Y5Hrp&NnW(AlHwDBGU zUAHUQKLy%B%q@J7@gCGU|3qK`Xu_vCVwqL6Bt)Esof^LUuF`EK$nZWW2Yun8-_Zr6 z=gsuJdwFp+a)3bFN1HFFzP^@ygAGHUX0^b{ySe%GIU*9_IH4kl&~i@-v&5jFs!d?= zHF0`I#Meg&Lx9Tr;bJzA;ww!*nG=+gmQq(;6xIUT$=tyC0=2f3XEw>yCCOSO*5l3O zgSdVkyuxfTHZ!MUW8-SPtgrXvDW*N&&BKhcpGGL-UxV#@}muQRz;jS4VIh9 zD63&O;lW@$J2hV?IZ}E&H381Q>Jz1Q-l^rAk2-^a>=tu-3KQaXrQM~HntB0|z+;jt~JOe?=!@=8V@Y@&g z+f85tAs|w-2vhM72qQ^H!JU@{M+0kqO7Z0#*y4Z^)Rv> z)fe>r9+vluGCnYHO=(wI#NmyGd}C8YL{w)~lv1{yda9@P=j6hWpw0}NjfP~|;ZT=* zfA$uCc5hf0tl%WWCq^HdLp6~w`f?W&9T_ndDn`7VZ6Y^es^|L%z@)8gT4m&3CCsQ4 zAdp)nSdQ;299T|q7=D0Wx?Va; zT4*>Jh|9^Lscu?pN&D)_0lA@?oSYqy9!d*v*hsIsrgltu+P;A)xSua8Q)PZ>Zd%<)#fyiUZu25`CAIOB zMYwuYDTM*@XDJn|FA<~X0hh{5jGYalYt!)YloR8lGDXuJS3r-pST3MR!XUWjN_Otw z87q`&IY~Y*YGX#>-%3LONTYuj@N!J3R3>YIf4d0%~~TOw#eQ-wKMuKS%GwY0Fn-goWjFgru~fMmykUcom*K zuTqiXsd1{|smTH7f|eG&n%WzKV(+bnY-G=B??pXr?L}`N?}hZNjLghMzWZXsPCwA( z;_w)2M=2(vFk}0Pt(oy}(nO<0ZLhaIVh}TP+p3A}*O_{VkXTm^E)F(Hmz#d12SUuX zv^v-7Yyk&5OM7c`dq&HNPawU*&Lx;FSb*l-ybIJcU|u-1CB%oGC{zc zPyE!8^YTwna<-TJ7dT{FSj1V$@WB+nI$+m0Y7KN^UwvU(*L3aM{OcuM0Nb7C90d9_gU1!j5Q3Bbz19S1-lJss%6DLdmKzO!0 zHy0?JY{fN$3j*!8z$Kree1~1U{b{_52@Vcg<);W5Rsq*CL(6MSz zXy585dxP9iYgUR+|H8u3{%Gu6<9PA#BMv?D7@1JjTEMJgWtYFlgD=k?Au=fEh6LRymlY%uLfarGmc!5Je}~L$W6d`jWl| z@qx|HJrW-TiM3&{vVof3Bh+NP(vC{WTD3!f&(rj&el|q{xrIc>x7PySvz~{@oOU7Wk{q7?BW|X^wN;O`i3?);cI0y188ATUC;>NH&a3 z%y)DAtD6h!3OR0l@{-FsTg;YLv-Q#@(leLta@!W?)_y%P2=~knuMAx-{hpzJ?QQMs z3^3>Ml(na&+tQHP@))nYj@i}W$==JJpX2ls#km+a9-6-zW5%m!f@Ru4AdcD9<>eXS zGj|^og^vbC^PzG|;YbkqaTYoAJ04DEaV`1t4~;KE*oCYj~E z{O#@Sr|YY0VG^U%!MCKO>PcniYn^K+ozI(Am%mFxbSrOuxzFG{%rZppkjmlSpVih| z=-G8uVda1bh=2a3*@O-nYbiN7S*^($|G;GPcxLTpi5_$xj|FoIIz57Z^G-Oh|7N#I;MY`Jl)uy3RM%3bCLyb!Caq`o zG4EKqi$kXQ)9<}L&PL0A!)NOK@odx!7k2I)_E<8!nac`_6@DA5?z^XLtbnJm%H*sD z>WL{PhNgo2jSHI}`&~DfU00<=9ZeM-&>Km5wQ<&f^B?g6S9U~BlvchK$yUjfTpxa= zuHJmGvIF1TS2rx?yJ&G#=gvQWIl%TWY$2w78dGOZImi~iHU^)K;K>9cnaYMb$gjz(urJmIxkY^ z3<$W`3W`VJ##vHIdeqW5dwmu@RYLisYaGDxj`>C(`?3y8fn0GOQ!y@n7D=1*&ai!6 zpo7r>@~+M8`TsEWmO*iK!Pam>AUFhf2n5&Q!6vx7ySuv&1P{T3>tKURa3{FCySuv+ zzVqCB>#c99rfUA2nmKcN_wK!V^;+8splBv*JFC(gkFT@;ZV^M1>I3W~m!i5DHqi`x z^UcWcGu>~0L&`hI`SXg)hsM_=Bg`@#U&lrnoTAIfs!xmw!^}H7t#OtO;`c$Eb2SuN z`^1EgsOxND(hyozB9HuUEtI7_$rh4J^ zCSc2>)G4;FQ~EyRV;!-1{f?+HGLhd+`gx2j_k2su9knP04vZ8IT(~2O3?PYI<0X)1 zb&pY%bMM~kVVK7`j7yBCZ?9X*1}ye9&ri?Zm*_-o2uDXSHgw%S&xsO{w^X;4(tA*! zeWi0lVVE?aE>OB6{&h=bSydZAqUs0G|B2ga?k{Z!dDqib&5{qR z_#BtTnK~+pYS_{-q%~!luT6Z?;;zZy-xh$w+cBLcX4NM}3nlaQCy8PzDYyh|u-lzC zK5ru%SILsA(B^N|4W(~VKiT@+$H(n6XYgPVU~ZV18Mzd;J7|d?T({l*QoX!UgZP~t z$UX4~pSLpL9nP!cl2Ll6Uqw}Xw@t^9$}ipKu?l#*v}t3Yx+MtD*$ZW~fOHhq?6cMf zy{wSv30xB`>sX(sI?3wgA@8gAblvXuRkVCpeIgs_X2j zm0c+ZasG_I%%P%`J{r-9o2yQ;StT~nRa!%0{X17)oquC_`%PI)R8Gio`O?{BT&N(? z2b1}t){?ogf~%VLXm8%7aA^6c9X6OZO!t&f4_6Ah{h_=Q*ZbofsNvT!89JzfacGdv z%CdOSy=sT=A!D%8>iqD$vV26LMeRxSk?t)ZZK80GC`gxbJq2s<8IOvIMK59Ls1mr` ztT6^RJn1P-My1j`k@IdIk1~zOS+AQVk=w1Fe+b>3ZQAVGp8u%G({Xi7bps+_|`AE9@+%cU!xd`(; z=|L58GM?6S`d2E-14LAg*;+@rX>RZU+BJZ1A6%2%09^#<$Dtu(1syr{r`ewT{NSD) zqD6FG33H8J%y3l>-i6<8ug=QO&QrZJk*(GJ@yN%@sge|=WY)v2-iSHe)y`MQSCv#W ziSE(-1SBKvsabkcU#lo_hjE09ZJqpDn>p@{ot=%9rM1oNpQjh8avaT_^IJFMrInR^ zjkkJBwPshpAPdvCd#~QjJ_AZwaApGN^(E)OS?!C(eMWIb=yP;gtEla~2JvDc&yP#{ zo$kLB8y99(y{VYmio8tS?98%D_m-eL!NCy?=Xi-YIJz>@6{IQJ*uM(IpUHMisi~-q zZ4KndD~^fuG<8S`EdP252yCCNrq46eP*WR>jo1-o>BbLP!oh(h;oyaw8?wu?}jSv`tzV!?G3lGtXV$-p7WINdiKg*iss;zgO$%AS(W%Xl{CT- ziNpI?5HNDz#RgSdwsxx5mIVvGvE2zfKPE4;<=_UlC*;U+)x(m;t*3wvDI4)i%_Lh5 zaOt?rMStYrrGd{u?l+IKI*3Gk?M`UDDaz(zGX^QDHVP>d`wSt+A(GXgi?VAWiN2_` zgPE|+WLgM_QN@fZ5st=w>zs&?XX92mM0@YNnL)m^=&UY7Rs8iN&fDI>mcys_Fv2=O zC*$ejCQ(9ZF)EobY{(*sW*2D$>v=G<76D8OUFUmBkntv@chGH0NK0~Oy#>N|CZZV6 zgk{b8Eb|?UeW7fXD!%~Vt*xIJtq-}b6;-12zKyiK=9OIhby~8RG(xsNo=U5>hV%41 z3vFAzjh|fgaAADdf07pFk+EXozLr``Y%&7Nf9ggJh5>TFY*vIOR>k-9EG=EUh+QJ( zLv0IiR!g4B(P^{TWE|=rpr5zj>jn%5`Cw6;eMdb}YBZEG&CR+@O0S!=j=hmqiLl1W z@gP+BSlDdpyz-u8QHwZHU2OO^2x=9RJELum7X~w3IiKOrd#zdF8TA+J$p|P~(!OR* z778uV5!9|N2WvW0DV{4M6*VD{M_vPZ@;bgC=t*6fL@_eJXPWCpMXON&Nq$w;Y+)J9H zWXrKEZ@Ha3<>QH2${Jx}WEvSCWiDqfXH=lOhG>|Jm6r^e4l~FA+G!$PhmXCziL;4r zaf$^C>kMRa5No>@JizS4nmkGSJ2u{^Vk2=H+cqn&)HW zrk1W&{7?@YkjbW2USRIb%`ef?^f096f^DX!RV4XX1sWJJkcAF&NG)AHrr)5g| z%=fe8z8{}j4vY*`*m}28#6_60l@NM*Y<#z-Nl^4Rk)`f!`M{~Asg;@uwFU|NjpUxc zYw6+sBPq}1e`oL0lQgmKgh9^`FC(%45qa66Kt1$BqJC2e{EqiRI(H3!(>Y|5^vh92w%_$!o0IDrgB}UGG@v>)m%%b@kIbzK9>Qso z#B^V~972UYrAcNDE^l@v%602TGR$szEMlBG6I6g45FhjMY z8k<*#G2Zv3w8X&-oI}YlrkZ|8fa%4|HUgk!0|S&_59QCxOm#-rhn}nNqz1$y#M~Ymi8BeuxRNfJN(Sgr4dLh(<7-X#I|rX~y6 z$)ZG#tbl{YbbmHEf`;aYwG0iNsZ0IL%_+V!4b4n+jC9_+Y8K^{S5+m7cq=X6ylDD~ zGae&H$AyP`Owf^W!`DZDrswo9CZT=V8*XcC>5g4H{kQ?nAGfl8@5i#vJ0-Ze1yvlt zo8LczA7&Qdm;26F6sm|YSQK$gXrqh8^r4kYrF~tvCLG%J)DNY@;rrsFtmUW<-nx)I z=W7*iWdKW4{+^sv`j3*pao+Rr@GJ&N9poYw0MHv1rTv^5Jm!KzC{0$iks~V5YGE$W zmyiB_ZvG$ivdF=^rkXnVc+hi5q~=muod_+|3O9mSYZ(mLi?HZ?Kx=DXWr>D1??Qm^D{@8jU2mO-;V0Lu4s6>4nPPWO;A(0TK58XKWaXg#RXn%DUfTo>uRNvxsa@mo z;ob%*Zt`>X*K29mdkr$0bp{_*$HiH7!>ui%cvm`3PEPuT*|{-Z*1{`4Z{qvprG*q- z9S9LwJLZYG>4vuc`t053!IV;y!#$#O=iRB^`~gD`Q2&Opm5!8nYZxcXiS@sMl@d{U zJsrIae3A;Vsyl-K6Mc`Kp{4Jp-}cRjtDo_YxQ-WnyXR_Ma@=t>+yXZLF@Bf4{ECx$ zXn32%%&LWq4MmlsclKE%B(dE_QB1;Ousp>8{Q2jYy;h=RADIR`&-F>Sv5mw$W%l^I zZyMa`A7+)va%tAmBF=5~zcDvFU#v4QNK~Hk#aItQh3S*|vrZaUW6Pd|Xl-}ubqUgm zeh)gi2lE+xszWG=RbY%xe7G>NUmk%=BM;lRPOOU~B^c|R>S)EtN43$j@4fGkREr)J6^+Wx#Whol z%2+uvpOo+N-8@*A5uXr}neL;WMw<6*Q{eBqw=uJIGh%9E(|>UwC?-^LCNWZkGEt~2 z1rgtSk4O77(rP%y9yNG+U{@S{&&A<}RPN8qf?YAUr_VXV*&M6Q(a@;rM6;-@&_8#r zYP+?&>;+{4Z>Su$zaeq|*GF}ETDi>|=f2jsX)5n2$Cc_e`G6X?77g0as?EOUp*_t%ArDM+EO@5x(x*k(C2Yjl1s{Q3`TbekGiQ)@f__f)qfWeJ(Lt<&Fg z6?ZN3W2yM5;`>3M!ZR8;LPE^~JdN*}db${6{PdD$Z@=8Qwv8kBVi zx-M2p$%%2dgD$8sK7bAy*ckuA6Sj;Hq_YC1fBLdg2I48gB!zvWQg4mgxOz?mHb$U( z&G@f;GND7tN<`spx~MJroBb%YyS0>IZ1UZo{E7ri?$jnXaVcPHX2{Wd@j-kvXH4&@>(Ob&ePJhAvKOdB`O& z^TecLKc-B&_|tAq-Ry33T42#eJZVB}VBT-(v?tu&t&rkQB1EGs(3<`~BMm-S=H1$SH~F+yuHpH z9fqSU$^K4TtxnH;aU@Z@e_eU0*qxD!1j!>-ao66o#HqxldvG7>#v&dgCr>P7c~xB{ z+}pt={4aWct+vjqt*2Ku+Oo5|V zS0OTk9rVyb_yhYd9rIw|xrzj_EPG_#7#*BPSt^xzn*R5UvA}4 zYITnrj`=mWYPS~cnf6xZEYB$~2By0mDF+1>hw~p3wHd!?*lldOnuY??@7zJDvoZ5# z)u~luJCc7dA_z{Wa|PP@Ix>-sz23I;{jEv;&JR?0^h`bj3R+_atNOLe9)mkmmrXe* zeLZ0U_j6PXVH4i88v{NEIDlr4Zg5=w<&9M8zeK8s5XarH)tO3`P4G{w96xHS>#KT# zpOiDqx8Q8NykZMU5@N8faENNqBreAoCj2(EGj> z_6ri012T!kqoid}v)HmQ+Dw@4ijVbfjDsYh1?BVXhHB`LMby`%uerSYlmf`gkyUXx zh-=2z6ptkdPZW6>+SO~KKSgkJ#yv#)LqMEEjb%fQnejux%Ac}?#g&S^GaCNOGu+L$ z2;aR5<)WCIglXfD%$#jaHj2eO`(?+)Dwj7Tuk_2n$}3Gx7gDmmlzlg1LiC*BQlUwd zE{$`;=(qg{z-0cH|7jWCcwu_`kJY0{{xn23%%h{q7B)bGkR!NrS2`ctV3FpFdw(GGYl#Djz1uB3i&*PpxF{ z0A8i14_8ianZY&lPR1n>wqZ9N2KcfH@Fi%Iz`V68T8Z7RkaUS1ukU(@FW}Wz@ZYVV zCxHf+_T~TIm&-bxy8K=YdOx8t4G3y|is%K@sN%7(0DW%-2(nJ?q1}_4PquW4qoqwo zIgw5|Qa%(($qM)^0q~`9NOFV+T1=Y5lTj&DQV&4{-$>XhSR;Rt=-(z zfcbK+OTVB0zlL8K_zXBL(F0C;pmzHVTn`q>Iq36SVTrytq~nX={zivj%$0+%{p%Nj z9*5(Kvw!XFk4-!sujVd)0r4^GvOyP!#90s&Ft%ul2ObKbc=*srbUp-rV=c%$#DcyP zuqY@5$htFC;ht|R^V59Xd@U?w{r|Px0e0kn%%A;IKf8agH_KD|Ee|%=K#M0Pk9882 zS;;@>N%6qNM1&FdI|%`~Ocwl6#n{+o6)O-4^+J$z|E3*IxdWHKzW>*s(|T4-1&;kr z9`miHINO?1gwN3A$$f;J@ef>pR$8a&>Gc2rq+9@Eg@BJrPycFp%}f|SK#(J`0fFTK zq}t{`1_0S7aM!8JmR6juD9Foy@|aER9Of3UbT;ic@jumrvN&9(PfxzdWt%sPYz#mb zus1~1j*V)qWzt(gJ>MF&MZy6JMBZiRBn@D5+}T>DzV&>9Qw)O@r_FFW3EWyZ=R^ws zzEeE#OERlMr)f~$k?29+C6u+b1!zEj<(OFw6EXRAnVtf-m3@QQF!l>Tqf~?!t3|7* zRS=Atu5OvyOsGpbP9@eGCr-W2QgC2A!hh80|E8UQNeP@Fbl}?9tUQSKJ^q=ZX%aap z1AI&M-ZV`l0akK+zl^dj&R*|TuLw6jT5@hf4@-`%iPV*FJ+e-{!90spgh&m=<3UN8 zkI|5=g@Tej%AJbV6nq^t5 z#F+$3%t{}rZ<-AHbhZWOL23mD*8=t0Hmv~wrFCWCy;k|~OoZpU?08ryKsNq;Lsh<1 z>PsIgoApPr9q?rNn$WDbGN)L1Lk(8;?{~uDS<@$!gXoc*%H7tv)wwa1pX%wcke(jd z+Sr$rR}@z|94)o|ZW9nldx?hzgYNA&wmW{CYCRF6F9h(>%$sGp9BGl@O((kmjqY=i z?D1%?%Xpl_TE)=P)!#d9>|@^Av=Yd!qkm`VhyN?Duwp6!CMavznwLelk4qdY2UKEgui%IwtlB%o@&hfo}07ans@o?6Kq7bh@IQ*h3R9&by z?%GAU1OTW{*K}q`GWX7U>0q3fv#w20+qoQxhU^jQ0yd1?xcVI0c@CFypN--{iTPCq zQ;tuJpkp(Ovhhu49%}b2Zn7EWj=42m_xs!$XgCNmj(b7UW_*;UqeEDFrYnPX_x*71 zaMSog=Xm zN24&OuCcyXY2QwBQ+yR~c9`ZG#xKDT{>k%(^HGW$7&`c=qV3?Yb7R`>A-_NH}{T z45`aWcSbwDape1&%4a@pf;1i~y%xQf&n$NdF&OKgzg^C?rE3Hd%Z-%jO*2OG#1fPu?-}2Uw#8a3v!?h7CMs>MjW>t9UUhpWug>bLC}f&DA48{!R0}T z>}`;ur@?4@Z*Ig#;J5ibZXCqFKu1^qZ;KQ@aFGC>6mVAt!B&0SGg+3Ew@CkSQj&Cn*Pb62NNtiKSCV#58_i^&Fibg@AKWmh^BH|NmA9>vX z3n51S755vDW)+MTPEm)@G|~TUvz%$5Vh@NeeLp@ZDf=!1H0$rY`R70-faen`ZQLMb zir8eRG=s>_47N0!J)#CxetM?#KYlW6YE|)qm=fc&(n&(#32$VbJxTNebBVHlHRdK~ z7nc+PV8Z9pS=>!TMngkqa}*o7Z@-?DHHKbVIrrtZiJyVyyr{-PM7}wd-~iHemtBA2 zC;KNpAUrk9VB_$oqXHSah=>Ygg58PLqK$a;7EXLk2(OeQ2BbzxNUW=?3mDD#Xd!_e z4&%85IRBb}V4tvufzw$Hjz{IfwY(*33ggF!%6@Y;0&SYwOc6{nHw7fJ2mJ@B znx0*FXq;@nKVRx#vIDOg4r6n3bHXYP%BXyDRCf0AwKNGH{@XPEKq&N}U-EHCGG^ zd;X9M$Td`{keM_~p=qY6!zSb}Na5rhxCHZBKIiUx^3C*mvl8Ex>yzi6Q7UvTZ zvl0-9_|1pw46)LS8b|KD#3m$n=9Z2KZ^rnLc1+)1R8c-QwR|wp($`rQ%$vl=cD8T< zn>iV|yW1N%d6{5&WB8E;iJ#e*Gcz%dvXphqH*j&!Yb5XO@8RMmbsX?YdYBM}2>U1Q zW$qkY#10x3B@E&59r)No&M6xVAuwnaP>#u^IUa&JkDi2qSwcq)mUt<&h62o>4AKR- zTSi-!@w+a1`nl*s=W_X>UR3w_-8r-`F)^F$tKsDB?$KFFbY6+Gax#1udsj=Lq0#@c z<}wm`g7YH_*0lH~7%{6o3W>T^mKtJGHuz<_&l_-XxIM;*Pb;}Qs$caoSA({vY9gKs zH5Q$Bk8AVW-%T$SK8i?;ciBQLR)B)!m~@ybcd&Woolfb?o)TuVOkUQ;00&Y~s6dAy zqG`S6*yh(inv8@#qQ;J9f_tvKA{?z8Y&ubs;vcvc;7toz1e(k?B5Np!w$0&YoiF zHikDJWytmnn^pLQ+=4xjsTI>@A2D11TgzddMhWywVw3yZotc%2jfq}BrT;(&wS37G zg4MFwV&`1IV2ve3(650g^p_F3T)U4#<`WlPoxh~`uNHIYmqI@SMO8egVqwS4E| z$Ul#N%?1SgSiSx-^DS-V=y^K3yKypdEv$F;_0jMbmo+o9^A4=`wpbg&Npx}S7m8Dx zs&dw;;Zi?)dQv92<)JGHBqHKQgW#f8g9MlmG2Ww9fD(g-7rw}vRTtK1C~CQA*tod4 zW*0g*Q)SSquCC0duj?)s>O&K|`_lq5NCp1X-Xbb6me{6fE}H$^p_ucN5Stk%^-4lL zkzjd?OWus0hJ47_=|)-lxYFBNLfek_W~Qr7n&ghF>`d9ml*T-MKTtf!+A3 z%Pqt>X_Z{Qdfg)t3t=F}_d{}Co3;-~_{T)kb>Kj~UlRSQrV?6yhe;{|V@lQ?b>(Nt ze`gLkPVy3K5t0?keAC1Bp3(!rAJOeG@~z8*!;1z`t577<`jvaP;;&{V6o^g48xEus z1BKS4&~Mxkn1nDNtn1R8YZFO{cW_XaSHwm+d*6Bimy~7LD18NCJ5#R(I5Bk+_HXcf z-JNI5b8m5SWd7yLwlxfOwuPWtS<83{CA_46yv}!=SOA zI|kRRXx~f&ifT>23l};=o7*ecR~suk6TE_hVQs0|1}B>Be%Ow%ys_d{{O0Z9o!?T? zZ0>3O$mQT0%pBuMYB&e&$1uA|~Ob*m~$3BF-E{q_*gXj511B2D3m{s}X@B~Y^FcFFN zHR=%!?M{8peJx-!Je-yEYz&vHp1GZ_n;}d&#M3N)c6q6bg@eAK=&Jzp%;eM(4Tt^a zPv&?R9~tFxM&jJx%F^_u=9|;SIh}J!72yP0aAIEMq<3ea&GH&r>aZprb@%nH93Mwr zKP4q&+n-U1As(i;tSXLydczkkZdYjX(&I;&`up@Vp}31OslIlyHW2G+b$kc9{}$@l zvPBjoN=={L6oR^F1o=jD!?>BqhT&WE6d>ogzeD;*VN2fMIMPE?O2);lIHp|BSqM2$ zba_2fF6QPwdMx1lT%i^h^fJXoOWjhRW9MjWgdAmY-P^BI6Q>UGlE7m;HKcQ;H+Qge zHA-hx)*I=wx#&AlDa5-R5V50z!*Nq7<l_Ra>4EYp3fv&E{K)Wdm<4X+|8n74o%|p*x_m^%P*=GMFS}seKZYS2K#D(}=2bLzGf`lD4W-0wB z0Y-XTuSNmI*{7C#d~lAZt=0`0&WniBh1SzYtzcFp?B-Xy04(9c0_dYPeDCLZLTP2) zOt8ywXoGv~XV_n_BXCAvf0o}ahKDynIkArxc~}b&-^1cb58+!P@brGN@b~vHVdiG$ zWi7XKw;5lc@Im?{_qo6l1-ETYIn~T&J4<64oz2$M8JqFOwMkJ{1cWM>hxY+sh0WnD z5C1+Tei>?^xtl2DX=M)6WQ-DzAKrC%$@GX69Od>eIN?-0AjQ&uAaBGoDRTgx)5i{+ zR$(fOnpAB1MA00@1KE1PT+b;`&P)-UFlm%{p)vt+Kx{WK?4(=OiM=aL7a>J6eaP|g zgMVur;l?h0LQAU$>=aK<)dOY|`LcJS`j?F=T35o5PGc7@Vzl%@3`sTZPt2ItbR2}5 z6cV&?2KyrF^T0;h5VHsxZ|uG+)}S>l3Yi@0+KOJ(V~gNlUr$h8tnnLBqThul!s_Lz zD{T>NlJ4!OtgBa>lP@Frgti}=#y*8bVQhTd9OliJ&IkXLgx7~m!7uP70^R~|&z!~v z>9^hY7cXZk27OAC>FB=aH1^-dU%I|1J4^Sg$1=ukeLOvCx*H5_moZj;R;Asc=|70e zN_siDNl2(Y3B1aAWa2eo#$i=A_ukreajs@l#>7&dX8Sc{6SlY6kCH{~EuvJZ9?q34 z&c^l&Ufn6QA)0g;XUk;A+005_+=^jBg@=}G8iAHJ%3~DdfeSxH0dDUd z$Yuz!QzMu|w-b1U`QR&X3P_f%!pIyy)w`2FyH>eeU7=rHy4KY+xVWP;79Xw&`_0lL z9+D77iJvh=-BE_YLA$i)f3OMXdX<2GM1`M;`V+-$EIbr_!js@5(g~Z`3G7UbdTpD{ zDyVk!caY%IvC-kPSpWI!F77crr}mRSJiHIL2Re%f-hFV|Vbf!M$%~=^I?bn}jgw8h z^~rfXjYONbfxhYG{{HDzK=iDaJ-^k=)CWC$N$=R6F#_er$=TV}(fJDTSFsh*%9_@> z1AWZJwev@*Z%wdb)O9gq<)hK&A&m0!E7g%g$|?v-#CN>OTrp z-%Q$N+&WG_j79n;k|H2oWXbeCJKK+f49F7Y84{7I@Nc+|QW(^Q$&)_~53HHJX(W!7Gqlv?p)mR^6**Y3=PQYd7dw-QB);SI-iO zNVk(-VV^g`R`#^dv&LhMJo}6fV9=TFNj+#e5p=UuHj)#kU6u-dI@Mxzz*HnWPXjaG z%!+${6Q`c7I3)ymTUnCy1vN4@6Q{mRx+n$y&Meg)Hu6rPqTb|g`$~n1T$OgG} z%yTtp(6HtCo@Tt1E>UAlM0t+9$FJWzM#g%14HAa&U0q$tSZM_m-Ctf!(s*eULvP;O zxVJxH^zs5sj?^C?YI&zp*|KiOs z|5qKmJ^O-D=AZ%kb8~b#q|7-qb@uzJ7kj7IAQAHd3hexdkqpIrNq)h%PLTm$) z?n7|LzcG=Wc6#m3y1Y-|&;`obmVAbdeSdKsg?AV~va-YKhjoXz3y(diVrI7GF%Ci0 zJXmy&dSo@<`}iJuSy2bhb>EEQxtwzcL7BRN_=|@4A7cJytzlbN{{1lhc8zSKlMWB@ zzdJ012)JG_+Y>LWX_d;xfG?&M>`v{@g*qW?4fk|q$IIeJU5|f%dWatf`QvBAe&_#N$FmH*Hqygv1# zw)Tus`@PSg=KDvB@6YqkMsVF?@{F@S#h=~oLyx>;D?6KktPmpZ}$%Dw1s$laxD5w_so&ed*hsFTEWx3 z+SxZbnP+CLlI{09Iw$VRYHUvcuV}WoE-f!A{Hsnxe&ExWIN9QWr#l}^EXLhZuc&S5 z0~ZoPdheObNr~@|-&~!8EDywYqyiNoP=Hxa&IBQGNBnO$BMXUb>>2%GS$ts!J{tT8?J2v+)h z;lgwNvZ5D+`DEUJ_9sjtO!MSl=jJBH*~7yFAR2yg@d=5a11Xi2_@43wzXt@_kYQcg z*R+Uy7HR0nU$n!<%}4k_S__MThBDk07;Ey$(-oG@@C0cn1^$zzCIteFQ#6WGbfK7-UX4B&3{{_9*w17SM}a4 zUYMbL)`oE)2c2_mC~`0Dm)a%FS1J5Zrdo#B-MTtoq5g_OyS+q?h6rPb(ML&Fn#AAX znbT-^uwEoSW@TmlyL|jWXiz*WWoF!kVQp-h4aodjSQ1K^4y%>q-G+bCNw4iXQbRGX zEw#gq-V`d7Y!jwi(@8&u==QKuxgz=9*gMs~dl!o+B`T!q?%Y^YQ|e(#C}NBZ&8=&y z3J+mQlPp(dNZrXB-0X}Vt7yOE;fNy_5GX%}Vs0*(YPe=g7@8U%Pb`e|y_d=Vbh*f9 zBlFtUCeRi%UCM`@gYA77@Iy;mcV(fQaWtB<9zFXo+y33L=WKlSe^60*-v2;Fzz*8k zDJP&kjN;_)y3Wg3WoT(c65eTB&QzOd(HyoXYjVKmcw00(U%uu0KQmJ| z=N1NfTKnjJ34R>=>TF3uWmspL?HWl&#)bV^^L1KEku~dX8gWXMwnIAL0h6}fh*OB8 z$adD64k4L7+rns;-jbM}v3r%gT)hL7TH@Y}m&#QuhVu(bL5?1_mZqmEl<8=yxaFPr zkrCTAjm8Yd4(@ZA^R{|?pfPq3RSD|;Y@zx!46p#|>J>iVqaX!{e!gc3O-HbF;?n^r z)O-gvrc<@=GDXQh9WZ!&akDtZ0#f=sJn@l3(Wy$MR~g@0s`OQjNA!qJ7i%;ZP5jHM zuko*X1Y1Yao-vPJFCE^8KCU}C#<3WxkG%hm+a?B?y8eyH>KjRSZvYCl(oVt`uPi6& zg%dv$FTWm348ozpn<}#~_C3YfDUH*Ih=if5^J@EG*UFc%po;NoHuok*Gj%2xgnqQR zi;iyiEezJ}mgb7l^r>O0hxlS7X>r1>r>7I9Yp<9N2)@E17RfTNu4hOgU7{ffsmtHc8Xgz9T~*1cOoc|86Yi)I=CAitjZ2(D|*e1`cSxo2)w+If@5352MPs=>bU(2p8U{VmfxPVY%U z|8n9mgx-VD#&Yax5YUo&Rx?hwE(V5KD4Cgu`d0`0I_cV+j(!e-G|9q|uP$$pks_jl z*GSN$4h@#RU~mU9*^=n#w&{|To$76|6P8xzt+ckny!y83X4>ktO7rzA>BJAR{^R1R zmtX6wk{T>7F0P8pso+wd8nto!jGW;^)Ml&mJD@*qYqYOa-6!<6l4x?w8@eq7f0V>gv3Ah_l#(a$PJX%FPZz zq*+237@L~`XQUu0GlBld_^}dQ8XX@82M6wS15K|a&Lo_Eu_sUO=O?eGMQzZP487L! z>Z!w!i%WH#+Z{@Hw1S+BoOC4mmHQ>y&w~&$1WMzRCBd@F^oSM@LBZI{hQjz#AFpx3 zXyHSqC}%g<8}z7OKM`)7-D;~n=nu4vhV^G0NPq*%X_EqbW#4MO0(22%fCcP%7|*a8 z`x#iSX4*wjb>%HShQ7wm%EFN`4gEpSNd%l=&#VK-dV#fhYK%Ft4QWaWbsz7I7{4vP z_Uf4KGY)lZ>c0NoJ{r-F-pe{ZGq?6-=WV=wnbeTlN$!5ulpV|%ly@z^iQ;JtimL?i+sh@Wnyr|f^jf?ur1jpzI zYmJ8s=1%G@-*w~|b?t*j?I8bqoJa#-SuV_NedSxfSStRIs-36GU>O#nRUEhR2RP#} z5+B5%qkDL`#tbtumKM>{joj9?ynW3kc5`K0)!wi^pWv!tQZ3TldF}edty9?*SJinV zXn@!7qvs^|S4m0WiYpBObVfc!t@dhK48#9>EY-xFxhS4QfaPcOcJTJiuWy}M?jvU` zz?3mOV?=L!ef|rtG4g5Axm;giAxr+w7dunWWng>kR;_ut*_4w-(Tfc#F1Ji1hf<#>i*j*u8n)BPz3eegm8DE%rlBwp0Ub3ZcK#N&?~?=s8(Soas5A)K6#}Stg9X{n#xE4Vf5kGk3zv5}#7H!) zd)&oToD&cn*+e5cK5wbSj6G(SFD6N{gauELQjjg|BSUt*aW^Ku+AZ(95gM;!{RgC$ zFVF-FGj-cXiaj>-JEPGar>)T_r|`dziY7a*bgFY4v^!YN0KCq%`;E%LK>I7u;oU_=f!;loTJXNR`S`ju<5-V&_fC*25I;v z(a;$w=O}oIll|fA|&lRWwPnfPXDT z_UaEX?8u9W#7(mtcw*PZmX7hQL~uZdtOU*73tMH5i+_sj)HG3B)t@q!-t>1Wt|5fW zt*tZ`4BF4S;(7KxB1ZmoOy#jwr~N)`LHoC!}(>-WgW!;yZb+w)&*gL_F()v1?tyxpSn21He@ zY8&(v=LViw6)4Tv2SolXWdGP`uX~Nha&`JKE3&_k)ufjt8n~{*2rwtF5RNrh4jF%< z-J;_!bRg|Y8$vGC-}a2_71%X;{Vt(R~~|Y^WqusU&g7WTX%GcOTBRr|iz!-O*Fu-Wn)CRxob@mJrfylzs312NvmO zq)5H{^T|%{)5rdua?)y3!g5USHoYHwqLsj_qS7G;O$)P0l)2|KhT(hSaAn#Z;?pm4 z+;bXpTpfq$Xc zQ|4tyz#vlzXG2A-aP)9m&l!r zr%V$#y9M2w)sOEx;XDUN(`Cx{SlCv|Y2aA&2g8Smg?=jUm@(!p~zdBF;E_Z?B>VM%bsKncr#$XT;QhD%xXZlqF>nt5mQkWI!>4Pys=wl6mt72TCANDOPr%#`is3g=mX5l2jOjHZ3zup{>8z6((cBRV$WaI z3RLNFi1Jn^-(Q}(;HN${`J7-q`__4^-Lf?Wd$w{c~h7g4fuV{7^ZnuZXQ;O=abB^i7}jxy4ZiMsgn3iSgAwo$-~ijs`$x(&2X(qtoc^cb7>FB8G-BBO&1mJo#>%sZ~qj!qB3 zGoW%*;HRolLqsEh9venu2f>RtM!K_t)sAIlM>5e8(Bh;;@4ID7NI~M= z7Aken?Vm=NX#J$HMWiwGiOgI4pi4XBABX6VuZ+mjcdq)|1p$~ZC1qnsy2Y&WyqUW% zCwSaLF7Kd5K>GN!2S5UXsL|^ZWn~qNotwjs4@Y}r@8iajOFK5b$@d5*jBLN%F$WX9 z3-Bfl5MuXrIWQw<8b07-DzUE zRv}7%*o=IujhICE7gux>eVw={Uzwcy>rKEpZ+PBBQ82csQDB&h=ujUb4rtc)da(P2 z`I|wBfHsMgqu(c$Z_@DtuqdWRzbaisueLCrxlqv=f0j=KRyQmDNCqIP>&7f_JNJ** zox0O&0RRrvF@ylEMCqKBIpmXbI>9pn*FKV3g^p98Z)v@EX%ZsMrkSzh{T7iO9C;PG zS8}z5U=Rj>|5vswi_+25x*YdskuLOiDW@PfyG4e7$=4;t#rTr=7nKG9Os5%Cy;PAX zueehyO?+t>@%}cPUazy-3<)X=Rp*~qmxBRR6~) zUo2FAq!^rbQ~o70X}G}F&YmRW>%mPMEE)Vh?E;s6_KfA@Om{PO!#JsT%qb}=&q(It z*;kFQjeKW*2r|UJ{&j_|5}Zmi`H7208GLGdC2=TR{3DuH_R=Fs`=5mH zE!w@YR2C46`f0DTto0~DcJhQF0T%jofuBBAeC;$rG=JtG0f-$_nI0&_4|AU`0 zwO*rr%ob%!jTEJXk!ser$S|+?sHi{@SEO7lFY|I6nqD`qWB2T93=yHC%R(nhyd9hB z=^!`zS=adk-k|Yg_fm;;Ztm-B^w-Q;Ez&WxG17K&R;R&3I3m#{ z4C^{Z_RjwP@B9>O90S9%4d!T|cr2Wwt&Jl*LIMJuy;ERNNu%}0XF6un4$~hZuLUR9 zdjTb;1KT+m<+xk5UieR?@43+7j z<1d$So3pPGqE|**;=00O=t<;oc-kGHW0jTj#cyF^y@BMs)a}(KFF&YNOH5lzO<2jR z>}n))geAmSG|YqX8W^jfNEpw5awur38r_qr8;!bK*bH-w>#}I)PC%tQ4hx{1RVkXd ztA=E8Be=tyfc6Szd1iZ3jHl|#zC(aCK8a8O95gT#?5LiN($0|h00vE)-q*BZSHCU7?U5X}KHP=3o7h1%e9I?~4`^C?Q;XpeZ&B6Y?75Qe#@eBF?4C)2 z1BJ};_fYW%ftRhUAO+eo7s7GOl3Hs*jMZgL+?`V^6B{x@$oJ~NY&IvHLnAUCQPfHm zSl_!VO&wiFN55^_r%&i)=aN5>{xrXJjMB7PnLdhsPLzTzx*aSFR^(&QInPe{o%Zxp zP=82;BGCb79t*(*n4SAaM9OOdXl->jC1h}I%-O1)1c?;jdc?K_mFLzFk2SKlsc*Sn zFEZ~qDy9*w!s@EtZub4p>csZ~k?9>DAmX41FTa<|c&QkcK3^5uTE#(wKX2)^3I`?P z!_;|(PNZ{p6^m+ZMOe}JC*jJ7)^=>{L;Xu*#rYOlR7!M09541ttzqRg9)>>v7Rbv2 zn!fc(_^WVQC9G!Ve1pOl(Qt92qs-HC;o|9_>eV(?#f^m(yrM^XM>Sukq)GVv}Q#tYY1sryVFYBGBZ+I;EjY<@xa7M=D=vv z?R-ibRxY;{aJFg2)zC=0{$j`Y0p0>#vcJWvvm$yk#6>bqHRm&lT>-4;bI2}p?tpQK zGQ}qQqVCJ&|Hso;M#a%|VFq^%65J)YJA(#y2yVgM-CcqOcLstEPH=a3cXt_F1A(3Q z+dcb}bC~Jws;TN*k6jC;sB|r_8|1VK4Ti^EFzKa7CbQIQM+(|!gA0?Zen@z}z)~ z-cY=Gz8Z5zFZi6qUl;cUvP1U1G(uY-G&WVITp`>Sy(<=}mh~WxbfUF9Rb`P-U)M)a z{@GF)WKjZybu14=zU8P%R z=f~-dVx*wsO_|=Ue1B+kSet4!1i7mVY76}u&K^j)3CK#k+npu~G>?tWQ9gG0V<|GN z%n=X##}$$D5AG8dG)<4{*`v`jDlZ#zxd!9niKyTH#j&@=$e}0|KCSTGaopX+JuB-a z)0+2GNr;4O!D49Ei8n8Cbsyvxc;_@6*}MusdkE77Xl7o%?2OM<^Jn4wU1Ao6V9%2G zT_q-#M2tkXf*;pmm9bX%$0Nb5Ff5UPZPhdI>CxHl9$r$TpGjqL+}XjQYDLAO-swYejCK|HUgy)ghF<9$>pyjYNe~9>1gAO4RP6$OxrB$CP4*wG+jF()QVEp`E+k~y6I4 zO&}7-pb}TTCyy^sgwBFP=52xr?p7vMfMw?_*9xI_`Fd% zOESvmW%4V%DmB;B*hwY7X7itNrM|jUdb8ykM-I5EGlcRpwn^uv0qNEUeO=R2#?(cP zLc`l0r?ghhOcWbYjC8w=?ks1zNUMhWcJ>jrIM2?!_cZikNSuO#h| zl=QRr+P@QE4hN%!)$?SzvC%%TJi5XYoA6FpWZl$cYz@Zan2RfFh($q5ZUO@Z;nKZVjs8?DK_`J-;1leCpP3 z;ZU#-lb>qvc8`v}kQB z*QVCvT($Oi^V%0b9wSl9Js$=aCXt4TDgu*o!`s}O3S;Eg4n@%>5J%jejipjCy3HK? zkSj&vQ=~+JR3*EHKsxd8i2>qp-*Bc8msYfMkrJZ7e`lslUzCzb%$pD$6hwo$dM{nqCw#ECFo4Us{Bz_ z;x<_;q8B$rts;>=g@gP4fOugM7|Xk^e!Kh8IA(j1s~f_~9B%=MVs=9$)fY)5P@0#E z(_}#KR$*+IL4b){W&7GA7>udk`ErmcWc}KqR)w0HDp$8=*p2SI=OAjL(-SuiBu__IP_HwL zErdW(VklCKyKj6@{4FbF1@se`Jil#Pr|W5{2vwvCd`JKEGplN*;2HneUj)j%?m2wf zJ!!f9|4+w;>MK{?BrB{ThH2{c;`4bkXYLYvdY>b)lR#JKqqQh&;!h`OX+941vKeT> zR-9dUcD^*-(R?f{-*#Ku^9rK%GAhdR4bKdR&#juu$%Lexfo%;&!E}!=Nlg+bzHB%O z{;F-=j-qB7ZeA+JGLjlDK9@6RTlX@)8eTFgR@xdG8G)iIVg^?faqT=Br^i?Lc-UA# z%;V$z)7{U%wgr?9K2v&i6I&}_XmvrIxhYeg|;upwB868cQ{Qpz#0a5?Bj-XPFH)brXRHDy`|A-tuN>QMc`wUT zi(@BxN&a>nL=FwnkGkd{mtMHlp%c{0*84&!%~YI-uGNew8Go_2Z_7GBUa2xI20uI} zFG;*Gg?D=*nLj7K-QS7x0S{GydU03Xc^44T+XsB>_=9Lzam@;44-JFg2Q-!=gEJpd z6P^B@%X+Z9y8!sk`bW7|C0s35*8v3`Nul~|i(j;6qKWV0Z8)67R6cp~M*zA*;wczr zUtRt4qPHr*uo^cs#+2l+sk=pMiB}m*b_GY@U#=zD^ttZ{;8VS|_*Z^=B{qH+bTb<~ z)-e)kw6-vDG3oYQ(o2s{5`^pSwI!=Fm{mz87AF)S*Z@P;Y_y6C;j0(Z( z6^V$TTpC#=4<1b;KVm&$C9HDtx|v)}1{Kqc0;t>j66PK+c6-c$d0By6wPHT)3pqrm zc;*XHG75n+j&8SjThgsmVcbdW@Go=x_zuKS=6$pmOP1j!%?>WbHjTRO4g9G@;3T!J z285|xWi>C3aV;CTe_T!i52@u6Y~#81uPI;6+yvr!cVkj*5@kdSIbS#qwRj1Dhjoc9TqY)fr8c*wvsXaQp9)M?BWax$;H1-+# zsZg{+$abb2gb|7v)8+4(xK9gszWrP8QH3e>Oef_y^+BFh-Mv#VWX7FPWiBy<{)jc7Xmkiz(7-($mY*@9S*F`VBOTb#w+0I6v~t?Ka-78 zyRlFfbsZHoa=j9J8I6XVDCb$7C1@jlHyWJ zv!asX!Ecb_O(9Rl%#YUDqxLHeKtPB|NQhFPu*LZYKHYbQYu~$X{LVUXG~wO^KPY+& zu=L| zuw~1P)i4MdvgwvEs3CHVDj{(ep2fu)(qKl9svPNy;PB0QXAr3f=19XDov?I3>TN3x zA*U1I8kK(Ix{3SQHVTHxXuOnIgHGtJ8Thwf*3QWt3VQme^B4LTk!}wyD9Mu124hBj zEeO_=dZGTIO`A@h=Cdy$(PzRb_oKG2B* z9;G*lnM0%g_3-y(UAeJH_pjQKu%d>IoXU~f{IgZzo#K_M*=M$H(ZKHffw^x7??-Bp zn{;@!z4is#Vfw%c`8Xs*^q8nvL{xNHR$JZvxo_A@3W0Hl{t0cT{+Uwa)b__iEt0sJ zj+{6VDD^QF-cb9kCutYzPuhixi5N{bpQ+U9|8UkrcIT^DbGB@hdL- z(y@7CJS$F8N)ps+?C6oDF5y3G8Xin?v_4f%L6Ex3M$az)9KrLDvkP<{if)oG8l=79 z4!0cyuUsCg)}#(Le9TMPM3+(i;-z*~$c;Rt#-?Pc`q9+&+F`j7IYGYhP`UDv`OuKv z2hFnsKhdDmy>FKdw9ou49)eCiP1)5bNeO;Xa&@AL9dcL|ogQsSlLe^G2_gW&F;A|s z3@3biy^k8S|L(jR{l>aaZXe}+~pkQHXZgaiM04h-ZEyD-wmj-*s9>zHJ+~ps*7MPoZh8%S#JDfj0K; zZA^4u0sIx!fx#mOccVRkT!1f5i`Z{d3?3UsM%t#@nRzUi%OgK!_DcJ7(R7)X^Lhzy zkSzO6bZwd#Y$9{OuE7;2M0(3Q9;(2g4Q73EuWNL^MNNo8y}5I(Z9-J25mWQ}g)Me< zZ*^e9eJ|d&i_6mgDpl%;6Ks#X3Cs2dD=X%RbBYQ~4&RfA8&EN0&cO1Ch5ZTRp;|@y zx2S0B3zQt09G)CnQK4!Xw~CEQ6ormedk!s1=RuKXDBq0oew|&$<_ZoPTu4!VhL!-V z!y6JmbA9^U)A&I`IOj1jZe%P(FAxsw;BQ@m7*9#;r+ zZSqUewE#T{6$WON_=i_aH13{??ID=bmBO?6GKPHqj2 zbxn13^`1@*&5g)WliGZHY{ zrZ{aQXjZS*uBD|7v5{F`l?hOWb_&fNJ@@c{tW#;!f=!02*gvLPzVfe5n|9ZM)hMXrSr-PhH(Go&J07 z+)Teu+x?j?t$NWP#f!rmqY+}=U-pgZyde8_q%rAG=(%*n+1Cm9$UMIXoPKF01@B{} zY}9&AWH?U!eg5!U6Y7ko+LyLb>)7o0DL7PT_Lm(`C!O@*{PTi9y@zCpsuH?xg&LS_ z1%n(UE#oCy8JX?q^^g87%4tPi%j=`dRH^@Y=(cEE`GcRlJ$vM+P*bWeC)b3N2>nF7 z@KbPZo}whTIeeSf-*mU>i+!i$PDN7Sc7iPZwkT!!-bKI-xpAoEW(Wq{i;os+&7VV? z;tYX}B#-T(VrMU#2KL3VRjO`(c;#ZS>5MkVij&qFaY^GeW5-=J1W*K0p1E#u-Mh<{>&cJ)(pcj0$CjiEOG~IDOOyog5_1{Wf-t1a4tu zZU{#xyFc@-L<|&bY4$^tzUfKHf2^!HS(GJoc1jpaDoBZ0yFcl>`?ORgYq=PzI%_US zL{@?n{~({u?e2*i{agiXbMdOsbsYyKA6EgMK#MlsLR&Ypi8rsmEF4f#?-M;$YDJ}j zH-LCg=V*>w0QZ?Vjpz)`%#*vFVAp@o=z1ly!U3o%3})F9+yUrm0Bd&`k_V)B4~PyK zV7S$lcc~Pw)cX}TTbiqHNG9xDn23(IJBXasQ%g{=eP&{a8T!?@PI%*Gd?ps1>9Dqf z=_v4{!t>ukK~V5j<*0i@qx;kS{nL}n)Ad;SNlqp>8u`)P`4$~5esoOE-QCUk2Gq+L zwi4HB#_FqwLFVbW9Z|Q~I7neMp0I~(;|z`E;mX0;w?4WxI6mLMJij`-%2;7@9mXmg zgz>E751B)8964OMS#9^U#c8Ijh-S1$Z|gzeG}_uRZd!%bxd!TOfVz%mRC9LRpv3gA zjK@rH_#-rH%xfwPid&`{jrp|OQNaDpF*geR0zhbJnsdeq$ec;`aaXFCY>R{E4q_f& zUu?H9i(}P7=D(lXU<(B1&*n-{IQijvc2teLNXUo!SL1~VM9>_8*#?YXtK*vZHtR7+m^A0*d8GJ6M5)?*3DmOOrBCd=q|g`j6pQP;)XtebNfqCj_6)@ul8qF` zb~bFjhxA82#Xa(WIoXFJ(l;ON!9_MN;(tJqKW-W{;5e);ETNy+9-lf3uGbO;)928t z5jgI3XYe`zOGU$t59W$I<9SVhHl4EoIv8-SpZFNY2$PTx?ZWEdDkCLlcf+4@4m#o0 z>DjNHE^Z#bIXPw~2PYW?z7{sQx&ix=EpW_GE`+q7k9Xj<6uRD z4M>4Dl`-X)lMqs*VaLqKflHl6MCKJz(=%675!(1?#BY?*3I#JKK`WTc(v-v^@nay7 zqn}}ruB+5g!llLP<=f@g2;>sW}5<>IGfQ#cGLPY`Uyd!g@`YaWeii`0yp6;KPaOhgSU-2KArW)}6@{8O? z%T?Q1fxeD=)Hh#8Rc}~EDIwZoZIMFBK17)giOU~Nzh55r08XKoF3qYEnx$pb;44e) zp}Tk&GWNiyi5aOztLzb!Sf%Yh?LH1IdjJWEjBve66gT{Os9$T9pRMXQ@t^9;hmj(Q z2341yDoOnQh4fMW-os8BUys0|gAVlJ_wA8O3;L<$aR z46XS;7jLg2eQp#c17DsHU}`PS8Gg^$b8tMqIGyEd;#*Zs)Ki-k1A^d!lN!Qn-v|8uNcAss2N%HvRkM(ag6`A75Thx9tp(OQ`;p_d)11S&4{4dl* z8kuKAx0_lVwjk%wBl}}busUQml$9o`@@U~grRK{P+9AlpIxl39jDIlLG#a?EHAczN;26|UPrnr9npgaDIPVA zR}(c!Rnd~IQg3oGMgWOuAj3SU*?zrOFJg4%-)wMdnS^Z(pVHfL1oVnD7`bc`wVhnV zd-r8E@X|*Q)lN|3G4;u#thvUp&=Hp6hp=SgtPL4{jt5EXqXC{?0&XKNKHJ%HL$#*? zld`_gDH_N0h*2EOTSV${s_*sn_e)UiF$&Vf(=#m$>FXHES;?q~s%SX4vnEZbo^jd1 zSGRXjf29==02Kdl`%zTNPs1ZbKO@5NwcQu1H?6{`DuJioKg)Zazj1oF*&Ij*;fvWl z*8z$T#goT`{fwK7ZQ~H{fZ>2j218tgM}sgwAiQUmCISOT7%u9rXu_!4*~oxFC>kj) zhbS^Du8{-usk2^SW_f*eadB%=P^dnv*a=mOu#~;vU6U8z0>8P;1nwRatUfNhY#5Mu zH(QOy$2DOOY@W#eGfn5WXc^*6#_3k|Nh)t`JN6ZP`fRO$NPla+LtyD@kj?qpQTxYY zqJtSC6*kzPTBGZ6dwhAnriBQHW4JHlOuSTfLs|(XP-`p=a_(W150CkSB>FcXFnR|B z8I{OcJ)XP_u$b5&w0QMfW?MgQpUkaQRxi+^|K_V#v42;=S90)TpXLeu|D56fDNwdN zl)&@GguL94D=OZ;3qxkZc^G`xkf`SA^Knzj2`Ysy=pO2sUq4rdZdALGHJ5^@4xJ0L zHToG%R7{VpiA^hx2}-{L-(i!LsEE?s33o@SO-UW_=GTtLyYAitOdvvxiN_ZywmcDv ziGLH@u#k&)$wMx-c@)1!cTYn>64#In%*x2g%LS%m9h@JY9wzI~#8b0t-}lG2&6WKU zC3AFS-R|MiJ|+zYsf;Fg;2V2`dZD0##d-@8ksd-(VAoW?`uC4GfZDuQ}D14Mj z9AVo{KyoOg9-)T(Lvw5PBPitJ^WQlOg`k8${XzJ&uh@5q75|hluEGzVFbSY}(&dY0 zKpMA?Zn=@!-)-!l=JbIzF>yvdXd#qoqqu$rGL-2t-->=NI59TQEX@XCBSibF;|HEw!Vb`9Pg|;QPozDn zX~3qw2*Y|PFgmL74#7IvI9rork)z-{2NADpssEmdwNbg2iUes9HSl?@MXDF&y=m(Z3lgDZlZAGpRP>N9y`_$nGYsNpgJ%-4zkS{x87h5j<-%yP| zdP85#Z`0AYIwXvwkJGGxWyvb0-;!*Gea?RS8@y4@XZymptub^Ofah)6EQWQ3?7^n; zf=^@BSiv@Fw@E556AHhM!SPW5JxepF0&>nA-=byf z_DGu^YSf?&us$RP=6zSwSr+LEIgWy3GLd!;i%YiDc|AEBni_)W367R%|7Osrif)T{ zq}*u@9Y6}JXp8?8q~9-+S?13iy8^l&KP^(V4Qqh#djE}yRHJ7cs+8e@?u`vDd)9=w zgWiHD)5;!*!{fhp+kbIkZpmp;(O-ts{}R-XtY54zvw>54AdsgWTNE8??a^d%x5pC;u~sLQbC1_N>h(GF_8*)(Ta7U~6ei#naYW zOi9ziLRI#g^!Ccx-=(cbT_ab2S=9n(7Hw~HdFiWrA>v?B1DTJ(Pp{O#94oG@Wqg&B zN@v$cq?J8-S?svJjj}t!GPi_QIg+GOc!t0NubL29aB^%Y9lZCtuI{>!-}4|o5a9Jp z&sX4w6dazQ@xrI;_k44V!MtJec~6*_jC%QLHzOxAZ|oEPy04Mn&1z@llfB>VStN#X zyqrnS$KUauM0>)RpXWg|!Jx#K!$$6JQ%@rAC-^|YmX<*p$+vq;!_~$4uz!cYWd!NE zqn?Wvio#kx1v)nG6zwW<>{`|E@GcD=&4x|`UN4dpE;c%D^=QAE9EJ;Z(?Zs9BgBD0 z&;ikVOMLTjf9;?ef_H%)+dj$1|MT}hZo2?EDOKQso#D{-PU`_Y6RD-4J>PNvf43~-LpTdRt$-%|N(M3jYCqFD-M1MIX zn~tzGRv^dhyeQ1;NN4L5vZLVnbxPlN*dfeSOtjEd?HoJDa_|Y+_KH{tPA!7bNNMf{y&xECoH5 z0iu+Vt5UP=X^}$V$dBxzEmjRR4p)PNR_y)T}rpr;W0T z%2&C@M;N>OcDvT zE~6oYj@hzs4fvBCnp+wfnO+g6W%fR>Hw5r$t^sT>_m6JQ53f(oj&inE_|}r7UGDE* z>>ONN7~9$&f5}#7Z*1t|5&Q+o+;_A*KG-`uIy>9L)!p0>+)~}WIx@DsI@mouJv*@a z@dGO*1LDhMU)LnQFu~2!vf z3V~X_2HrXiz~*{eFLQeXL%-TiUrEJbY9BI~G;}n?GVuKHmH=0)lQn*QeV0Zq;n@L> z#wrKLrYh-?4Q{F-54)gd9;w4If#Dj5bC4KoLSxvAARMh(6W6lTEB{KH4~_W|E-s!~ zv1B{HfTVdkt9@bZ>r6Q$ZgqNeYm=9+xva9Xh>wwGYPf%%j=ag%4!yCvyBUp)?4mjt zcTgI(RX}iMr45Jcv4&+bZ6H!WTc@?9&DY!8H~6FTA9lT*)UoF57Zqek#=h=Od;-7S zqr2m9Xqho9cep?FRP|iX>Rp3+20Vq;C>(%uo0TxDPFIN_n`wW=dcjbD8M^{QVfiv;zk1Gh@YbUy)kOJ8(S8r!QQ zyq*+08w2BmZ*(>{?Qg_bJT8OXJJrW4t{016PC=)|i)g6u_HL5KKneG6TTM-3>;%cz zaaEIXgP_@v0Vf38^Nzolsf#aezt@WA7TPHmfMn=~@hKH~2wO}IHmX1BX z+ruJe^;H z2Hy=anC3=I9}|=9e`SKApN>&S6GbkAdH6XC2T`A=$N>u2yptFMwf?~cEu3gz=P4YH zXc);7T`R@?94y*ZIx%7MV0n-GgpQ`ZQi_FxQ63?d=P0!9NHT=I!{`nvpDG@l@4D8H zPfy?C(WMY*q8s(Y(Z{O2y}(d7luio4a-N@v7mObx#T#)h*ssJ+x8C%mtqzp5zO}{K zikh!~VdFq`s^0`dnj^zPhYRzq=;n=LG`AmTuFi|782mchzqB(oKPAM>PRzr^%vhNf z>1=LX&`3PL+TGhRwmd!|%uHDp;o)32A~Lol0;<NuDJ0=Sq-d&zjj}!FxW&L1MEJ;x5T>*aeq#^zhGDj2vHkl6Ydc~ z>%f}%|4dhwc@xTGUbc$cCCrTvh#jeW9#|XwLnijw){XptYg#3&20IL!KYa}siqTx) z6*kC>-H%(b1ga6Sj6X=G!%>FICs4;#6^yg__~|FkCkC%NLIK|n z42Z%JQvU%>wy*6Di!o39$tA`je9x`8aC`_q>k@Ot2UC85VLgEQYmLY*+4E(ai(`nr zV+%GwoVPnJahf)`+gMBm<*-#2J}>MGKEk(WhInVgeni4IgaC0AzRB{$ailC*A#?=d zdpKxh+Ms`r5bq)teODGmV0CDSTujZ}4>-cl-b3~-?ys=w+ydNK?P&zR<~G)~V8&x& zWeD>0H`jBRClzDjsEqa!S+pJaKe; z?9rwMilCdiAG=sOG>s_q*vihu!`KQCTbu(jBE5|JXW{DX}8+>M+`j=$EIaaLuMi9sb{8T z8og?6e~0t!w(WZa#J^~+wn%Tj8|%Ju-Tj4R#xc>}6(ox5f98Ac1oz`7vRq%wR7?^Bl^xBAY<`|?*iP~ zg}E;M^_wCB-E;h2?dwwY;lJ@nGeUHf>A0KM>+zXh?`IXdiN9T@4x1xbnZX8R3P`R_ zG1EpXB3af9&UFtmOke?WRYb2hBzZ|eDXt<&I7md}gk3Vh{Y!!7v9yQmAdGb6Nx62U zGAX>nuQI*sA7pgL*Y|A?{@8JTGX~lA*84eH>zo=uo700d9o`TMwHsK z4gC=b|6Uey4a*kreykJ4er-3WGxE|?4?LD&c@siu?Rh~=_x6AQcu;{VkXJJDo8$ML zz{wuRzIedaN^U&zS~hK=;pQgvJ38JL-SSJh!YqUw@d!V)J>% zlAFsk8nbd;M%L&yEPqij2M%4vk+Uea;Y9?bD7CVU4t&A)p}5wBYHU=Y=Yrs0CJ(SM z8E=NGbf0qm1c%&+vS<4G8Z%Q}!%qhSsUAub% z8^mq%u=`iC?4f^Quf+b|Q0L%ysoL3=P9LO6r-g_hpA`7lG~u!i^!})JE?wP7B`BVm zC80ekf9n)GWguWNe$dhQQqWgv#!9y?jn|}F9J;P|4gmwZC~i>rO2k2;EOB0dKXObb z!hOFPOu-@nUyN&~DKIRX560LTl&duvn~z^N$+nbPNN72&wIF-q#cOqh&Fip7-6+mGt-`-*&_aVPT0?ec+-9+h(AuOHLJ z-@1K++}{!opB=v(c46yx?sUWT`xl}Sa{m-6-=nc~tdXR}Uqj z;kQnt2;R!e+v<8}N3zC!Adx3(&nR`!?uM<^M@42|T+YJ#48gs3&n`%_b(>mT!PQ(f z=q{F~EzOpYu$M7f6VtNBfvGhBd7GU*0+e^nZrW?Oj>5ohFI1{Hq~XHyna`RspPQKZCRu^+38 zFx0f}-VI06ANTVO5unu5M@$jrr~I;_g^=HG3YJ7f($iz6gk+rp1YoltSDNmtqH z8(W32jqjWl92T(>nww{cb`MW3&hWD_$;fuEtZd10W@C$!5VC&){!J9Pm}ya~-$hld zvNsvQn@x~oqz?%unVP6`xNv@^>ewVUkstQ(Sh6t%=XMkx-`Eu+uUG=tOUVW;+(=AR z4|joYC&PK?)MI#l)H9=7i}NBZ{9pN5Ha54$SQ!G5yEr#hu?g^jX_>i+IG1OasoUK0 z*z^#jzJQAbW-nt6kSKJ*Nxe`%{fmAJsk(*Ig~XtQN}elH{GstLU3V-b9}S}oB98&& zzV3B90-z%9!7gt#`g2iFn8r%mOv8aH@gGVw6jq7-pVIrZoK!Hys(d?SliOq20C+ zSeTj+axk3N!zH=cB_&>75#|!+e=n?37y1}IWWnDezK@ z(?%MK%*hp*;6>6URix;4idW$vzZkBW@KDmMNqPU1%_kMG`XJ#rmOyRrl}1MA9l@Io|AO&L z0vM81goCqvSFVVON;_M;mVtYDwTRgb!zq6(|A`QJ;mworn#@BTZ-m1bT;eoCRHsZo z1#ofvFVtueKo61Nc%NV7adYLXuFLO--vskCq4(Bh)+U9V7%L0Gj zWs88Hka7`nA12ctiKj|HL#6Jj82&Y2tC}>RU^RTOcFs?Pb=mi6qay3I{X9na!aj8W z4`KEh=kGT#Q`NtIPJwm-xg-gHDr`NvWpuU(()2gtxBYr)Jf7h*SHGM}doY+}Q;2Hs zbIcfuaDdG&S*k8HV>HT*hsVQM4fw>a9MYPvw$U9mPLbtn4LvKPTpUV0T-1S`B>P9<<7iQ+?#K7++TQFIoP(v-0|L;4{ ztv6DBWt6g^oyg{=Wikazpszlz>Tj&_2W0SIeR-xOG=ninYFgC_jij~n?@@~ngv@}s zC$CBC|8WVXNEoq;mh+_A?qE;!4?zoKD?65d{o%FU68sL>hUBf)`~XG>kiN|dzthCm z{GE3=<7FftZX-vqi2dS77T8Sufnk5}HADmC9}yISsq%-;ByOGhj)-l8cLF@Db##9C zj4|f)QIW~zL>=KUu-y=}mEuo&QTS*fa4Q6{`4qZDSZJaF8@Ln(FAA};VVH~aNCQ-L z(6R+*N`rVT+tdsFazZ}0Nk?SMC3XAlBpC=poZwn?f|UP=|LxWP#q(%75>PXFgE753 zUh+`!&E}Tv#kg$MX3og!6ip;zDP#>noK{4*5r!yjHSQuyr)7 zSMUz_>>`EFJ4|>hR7o~qkGyZ>!dcw;|?=;#RlRnCNT zqn_E}Vrx@mL)sp-A&pO0Q2L-T_K7>}#rt&tN153ns8Otc_=j~cBx7&UpeOXsz`%bW zSul});&Mz|siWCf#cce90~_ukC9v8r4~5=vC)cI*ZL!PIEr2cDKg5;h{uI)l2_n2$ z_J$KJxJeP<`dFZ<8Gp3`T7Cky^MA1A`u~nKT7&rBIfqOZtc_&%~ zs-3oR)A$E4@*4u~FH?gVXim$Zz84Gr_ek7l-+v8Md1KnRd1ynoDP<2oP%bbSC=z%p zju)ZKQOy3qe4&1FB6P!ew}88+1-?q!*Kpwu2(GNQyo8zI^$4`Jx33Yp&h7OV?%lcG zQTgeU2!~b(M&RLFoW;yRx`%}%Bhwwx5y>Z!>9#?=N*1axeg>;TDZL}D{_6o)3aXpJ zgzh0*EH@?k5`B-RNW<7D&x#ywvlZ_I=Ns~yCUN|6ser^q9BD3TmHYr<#k0H<)IPSh zMngaeE#LE*6rnxC#eyWn^s{|z9IVs`nDGWiAW%_p+HK8w z^mdq-XYypYw*lZ2&i>C`{W{&i`loG2i0^kt|I7W>kV~MiskN-Ls;aYUfS9-9{6QaK zM#!2W$)z3BSEiBaaaM+^6OvrGxd<_bxW@(@ytGFJrciTm|D1kjmJZ4xXm~`ylT^QU54xNQ+=z@riM;Zda{9v#@g)W{G7`C8gE-; zBy@eV7C!zFZc55`v{*&Ogr_vT)CCV^ieFZ!Cbl-Ug})ovPO)N3u#2^hE z?o;|1bR&;uPW%_9Y#im?zbW<~+|t6I;oXam3S|pA01>NyntBz!^^Gn}G#WFyiH3CE~9w zR@om_a(y*fD0ivPKK!IOo86CUv--Fz(vE$aN|D)(%Ja}1^$A02jG!qA?ttn{?$K#m`W|J^D0?$O)e)lbA%pF^Xo2e6L^86q@8JD_1F z{Hxzb7rHxD&YEQ%SLmkffF(VUXQ#Dz)gWj) zT{?RZKs@34M`%y#Lr=1wk1%Qof^n+ltD*pC--pZchC{xM&v-xUv5E@9B-22I0G2_E z?CYhn5aV+eI^?4OB2kk)*`ihwb`P3z04+emz7++Vu+bH#N04Me&w2lTU$EeW0X^ zLQF)acu5*C*rD3Nj!bO@J2h*XTFD*P*Q=!{jhor7@JZzh4t!i6HlKK=+Sk&&9UdND z&1K%F#{?t|!qh=r#>HQ2HVa|kn^?BvgEQ}P(Ey5M-l+dZ?>`bgLH>VHR2ks;g^UL9 z=ac1SG=rZ3{cJ8j&TwCFe?g;u*s{@+{Mu>$@$5(>RlWEs9Q9Fg_*_G9#1S8eU~!AV z7Yw&q?jHihBvGKEGIG$|CSTY-0f3jFO%6T;raePcf^q)P;Q8|ulO-$DGYP%n@>#Sl z{n7=%OXY8fnZ6ujCv-NiDZVSQIIgpk1dW}-un9f569p0PgPv|<`8H9}%tuz<()Wi; z*#pdY-_{Gvg_xszNkxUNI7?-qT}NTn+WP8ku*B5;oR86umY5hz>-CedIWLEzgw$|7 z*?GP=R&^ULJM414p+1VH)R9y%0zTj<(V!jBk@)j^DUxSiGd^U2L9#8>O@B8*CJC~x z0^8pQ0^{c!hR3r@|3&Q9zxF)#6j_?&oD21Ay_*tTt}~~&G`M9`$`Td}pP1hh%fUD6 zd>Enao{LH_ve0_*WA*SdTz`PFo|hZLM9Ly?9$y!WqHy0)l~RPIUP2j0Vp-{KC)_>_ z$!Z;-t&}K4njVO-rg)ytQki;$DyNVaV~DP&969jK9d zbdLA_Rkhnh{6;Sj&5R_>;HB6+E`b~;vw_6kYy(8q> zhykfvJsKhV;)ww<5W24dF;GMHIY#ap|KlIW#>YkBw2K=hsLdnuP_S30bi~8C17UIi z!}xhSbPw~rBk6iO9|uu{>%Io52_SPyj?l)p#=BNnmv-r$1g!|n^pMsjo|$% zOPS%*3Vr?dl+(g4K+Tp#~H4+%Na$ z$&h~~ZqV6!AGdnE`ic4O#CM?W^jOEBTS56afEwFHKLE(^jF6Kv{oLCJ@D=h0cKuSrjg<13@=Xt zEr%rKrGoqzD*yxdEl-BK#Ao9U^}k&Vl1#UD4A`dl-uCsst@MBU!Ef*#O#kMiuewl( z#_;jz(9Ca%U`=Yxg=v*8o!HlQmNoKkgDGW5Lbwu@N8^p+(KdG3hirWr`4xjM59})? zCTJ@u`iV9^F)#Z+hH`oV<9OP6pF2#uvcwKWY-s)1`&P}$wbjtn%Z_BYC7YN6Q*zp9 zdu|s{>)^?gY|&-MyZQgR-$wv(Weo!1 za=rOjyW@9-$?8;8ru~Kc<9b%eT9oP|FT`VOw;Q5Hj>>@_3v+)dQW@2450H0<_AW;D zXftb6tTps$f4JC~xC80cK&uV?tF8R7@wAI)G$y1j=2m7lmX`jstJ8v91zsMWJl~q7$<=PlYdoWNVG~{n$FINlz1hJtIB5=O9i`}3^}n-CE#Fm` z5mpE%)5glxhX0-rNfp~%ht*;D3#trk-J?B9AMDcsFZ@;E%#r5112ngu_gQ^%eGV7% zopC~h=VQm=JaOOFrW1#+w^ecu^T8CxR{S(0!&hA|(EAQA%fnc`^{8wIG4Aqgg@R=@ zf&Xp9c9}_umcah&9=r%ris%B_pOoiTz}yCI`jm#X56t*B%Q36te3pmR4%;qj1gFdA z(#1Y}sTlz^>*lH6k4<{F5Z&x&tkvT#ys$qhvPNt=Fd@HbXUXQ!5UC$9yiw~ zXSxCqL!x5UId0U&{ml9pKgbnL38_)0PLOOq9p-~K%L7@r?4|>jcD{wPWc&LWtHeYm zt%mXGx2ivwt<*+DC)0K5H!t7=cXdE-8A43B28MF8Abf<%5^5k=_dyH9=vdYdzhDPZ`&L#)cpctCN6pp$;QKzEbwRs;F^ zoA^7x95u>hf1YQQO&~0mE$&ed8Y>U9$0rNG^;Z4ytZi`fF<72j(}X?;?XPYDq-^qV z*ZPz1U_!$9B#1a~ypl&%Di;Qk99Q|@69*(LL|MXU;@^}>(W9`kOQ zfD^O=qCXNl)@}O5G&T8;aUum)`;v5(MZ@pTingD(hgR0B84jN$i!>?pN*DIkr-<$ zp(=IaOV51%|87;<$2AnFhFE#5t||o(X^x)+B*IBL(afChjTUEMMQ6zu;{B5Pflt6J z{x_O~P*ETaLwMJn;mSShkL9d*%sWYZhRidL8%-cOin#yZoqMTA;ZzAfUD~7{x(}2p zb90xf(ptW!W*9S=)`vZ3#`5P$z*eKGO<|)HwPvp8ht-elU4D14NL$*U2~tj{SMDBB zR=zLOy=#6%@9|L$exv<>=yh}QDZS#oQKNmr)@$}}-oAHVi_VhsUOhhUSg7vHus^Tg zPZTb8(z@Kn#jmq=y-35)Ok%$yWO;z5bJCCT89mr1`91I##mr9NOe6O3{SghNAPT)O zAbjP^LQfDyLYG8v_8Tx_#GS@`B}3!rqQ?BF=BWYkB zM(=gM!g=PQ&6zor{9vl=fA8~%*b*D5xpJn_I2!dnPCiPC zktTjG4)=reM*>rw#INOQ-}t0)-j{)w6N_8Z4&i40tIHfLTe-#|{>OYx;^Avw(vl4e zuV}>4ZSC#d$b9@o)(nFxSnW=*7Ac$L2Te|s@+B7=X;{dM80%7{XiiSfavX3o6d@F1 zIN4Le_(eZLU~lV&RscaR)C-=q9zq0n=yHPd4(=u#byIY;T@wa*>t4a3L(A_?Q-X>T z2@W4g=)A@3fh>Nb-S&VA87^bgF8uv#Mn54sf7*}FJFw%5J1K{M;J-dtk#tZ3f@ci2 zk7v~oajim4((g)=Py9{Lepj|EesI2cej?M3B5lBk(QiCX*5B3qlZKjFU>#Nc>6NxX z{vBCOr+g$3pO)dO05`9OX1ty%n5!jhO*gGH1djl>I~8gX`4KQqGz#(P=*@Gqu}|x0 zrlu#TFLShGjERH0mR4lHXb#U&+?rYlOkGZI>~OZq0*Y9UmSI~o&Bw>jQoB6c7sAc5 z*%P8H(nRTr3O##pIw5#>8=v{+kc<9L@jtG2>WHk*Zw2=!cPcOo(GK}qmeJjlyZcnZ zb3AM7>F?jM#D5Os1!tJmHBcp^>$%B*TcEx@Vpphaq_y88h$sf&=6R3l%Wv% zIp4U!peaw_^ahvEB6o^2fOvu2>B6$Z>P+Rf=GX91p)XX8rfVH_a*VwX(T6Q0pox`$ z4G9LBNN}%}{ZQ%K%EzyN$S{HA`@K!69)o(711#>3_U(oLdV6_0JTq9;Bv|4L<8G|e z5n4c`=MVWdqJ0}ztalC_71^DmTi={!H#pKJ4N^8A26!s0emJ|e)KIVPO|$u94<}+C z9JcFXlp-?B3iG3vw=oYMwcFUeOwhu@XC5LuRW%ZTn|{nrF?rrSAVk? z-dqm8Ul(ioSOfXSG8RSr`R)4qkxyCY8_I|KRW11?gbve)7b(S)(C*(}yruVf^~$D>xMyCP2+yIf?r3_{V0*LFxCHy{6D$>a;jbr7H9r`w zlaoqzf9`06E(cWRNK+@ws3lt3VofwjVh(B;!{mZ`_cOimIokQ>H4@D)JNIWmr=SmV z0k)KLL*Rfv!d}-*#JZ`vM0x_v9*F(;e8u7b$s)BZ%yWa3r(HpP<)APM=sNVl2rlbE z_CI}xIQ+YyZ-JLnThtUTGQnl0SsCK8fWdq&VrLUMw zVGM(FZQIoM8!+5xiB3e`npD1DB4p5cF6NHYO67ZwXdbYSyG>M_T)&(+B6m~YA+KzC z;ys+lW9eJ`#GN(aHT*i^b|tYv*4tQ-wArra51plC_kU9nmH8FrQ+GfZD0&|`d@1to z6^0U50?WG&?*3EH`=Ir|ojx@raHMaHS#bAtoGTUao3CU&7StW6J&;c*A?7e!R|Y-( zexe(E@*n)jIX|FyWgNE>5u8qMFl$$-L`R%!Y;+j-L*4m4NO%@*mG1PS~bzq9Du)qVwNH4&C^-VpB2D=2GUYkwe=zaot9o6jC-tdJ=Ekgzk) zcwxxa`|>?JB1VX|1`ioR_tpf9%QF^D^lx6_avca5MyAI5hZvL1i3o4ELcc)?6AVoS zur|GwE?K9r-v0dLTv@VcsYowDy!f^Hm>=_ydGT?LlkaWvClcW=JK!}4zZb}hGlPes zi=Pse+x31v^Yq~SO==h>u2D%>ri+oa0q<3le+YcSE&Ey_!g4TA z3amq-7`dOG&gp6tU-9v^BENP4_%LLSZ>*8LT7Ja_t8Ge;U6~@a7%HQse;I!xUDQ`z zd?#7n3)NvUlfz&ZCh~>+GL=F7+b9CFF+Wui9Kf8W-Eezs;zj*5!E2HcCv4IdPtCpSjxyY7#SAE z_&tTTYSA-J2?W|q$dye&sBRuh|zz~I&qdy0MOwF92ULKPLVs!XZ=5*2) zo3a8)Z8a?%t&MV~VX|o^YIYc~xl>EfkS7ELX$$QzuOR8dI0dPew2QD^+h00=XO9rvlFz(WXE#t>VM3tVNZ65%D=K|k5llASdqU<(6t@w z^r;=}SeNVkrFFoSO)azi^=!r0cCI6xWF2pvuK0JY7g=9W_H9Az7?j9iri)3RP&{|v zG>0~!JvL5+YnTb-z`=cdc!#TieAZ(pp!=6#unwXS-Vw6d{v{YX%lX`a;S}aXo|Wo{ zHn)E|Q--!#rJAd1g(uGvLt(qVdCsZn6;|RId9|GI@CJ4U`{O#}9fc|FMJ-vb>U>nn z(G)E$>)QzOGx+C2Y(geW0S!MBe%wd5-u#TSpEhZJ%P1 zu?k$Mai}BoWt{Q4g7GqQ)F~>E2wTQ)yLg8vT|axZ`zo#=nMKA4#6OZ{Ut&|FFSQGI z+o8SDdD|02d}-ea>f$s7GsMWYlB@h@sSTE-W&~oDuzlJ#0iGmQko=hWBr-K+q-^(Q z7%qZL9{UfHTusM?AFwb!fjv0%+U5$G@h+?^Lr?P)bCTe5O8v5bXL|J(L&p5QLXZG^(S0uyHi|emhaw@w&8Eu^g7M7hK z6!cE+-osZ4{DWchi2fR$SY;;gA$5ChTs+K$vCfr%Zsd!p3g#|2BBKW@V%rpU)mMtRd5DZIFVbJikVA( zz=TICorkDL{VnkB{QV!3n6Cvh=zqDsLk}QyDB1Eg0ef>TnbhDmdt^-x`63t+*55nIi7>?uuZcN~NW>5f!sIMkO~3;PkUvrqC79|9J>>aPB)q2?St)Vt8$%rW!Nlh7^F zH+{{YtcH{SAhlG}{m?JH#rDMiv+3(!)hMbacjvNdDXldjF7M>4Y4fcfEOQL$@ZI7B z-8R*-5mHL;h7XAP`@QEa`sv!<#|Qq9U%N{gW_u#yQ79Wes?zf7F~4S_g21x_=ords zC1mfjaq~vlzbTY;yPJ4cwtbCm`SMZK*9oNQ(1o?8(FSKvc z3>xU`tr{R-KBG*=grl7uxPwXfZ=B8nMiZ7q3DyAgW!G*!f%pG3T1kS?leYwoGLv9z z3O%0{eD658y}un@zY7VUnvhrwa!{w5Kl+Sv>bFr$`=5!>3JiUA{kZ0c(wsK3F%&Dv zP}hPTqwg8GEl`W)!_mFAYx5u;ro{5v(J*DfK*Xy8Y8o~$6K@lUZj=|2>5aC8$G+wK zquI`YZ*yau63hUu$=8h$SJ)nm^;BuKcnq1i|5vBs_ltI}viIl~;(F|tOg*RiP-5~| zmww&|Nqo3(Iz*nWp|*{v!X$IOxYMT;?tWTXK)mEVDTA726BtdV1dpkfq{`zr`PC`i z8)op^Bc@Gi$me1dbWNO>ou;g69>zrPMtA&ZOXBQGQOufqA45~Q zOA{9_(t_%?HhSkS*qU^QtcaygP-131I@`kC?2-PobfBqQu2_sajOTQ~bU{$ijsi3Y zspwriDp@l2g)2IXAzxp{pf1bvXqOd^X1AI<(;roQ#C>jIDF`Cg3Z10nE451>j=7ZX z+bai(ledOuCiK*U%^(Rg>VNWGDV{yvb>zs`W&LBt-F64o0VNdf-88K6<*IzQPX*1Z z3)-ez36hVF(u0ppn2(y$yWuA>noTzA&^LP)7@ehiMr0o?h37Qg?sLseAA)~Y}!4G1>NjKnslFx28A3?*?VbNC1h8E6+UgJ)i~sc>QP?rh8&*$SJe^D_pu z^U!18iv4ad(Ef>(_zUE`dE;%4+hnm^1;|^5`5@RbZ22J6Xl%W8R?fbbA;@3PGXb** zPu-cfnv4gT;ODn@rWKJ71U!M~{+dPP&tG{q?T>QdjKoQ4>Ig%8PyyIlRW_S42a zh)4dLeV%7ShIVtxH#yn(EC^&O?jD8f#Z9<}r&F(LUj@tgHGw1*+7*3+RQ)A0g#?Sb zT*ug|iig5##8G(IOcap_ug@3p(+(HfxzpA32i=x@f_k0}(eWAiR4FJ=L#>X9+6aGA z-PjUNHGvU&gvr80@YjhTzKyKHJNKY^AbXundmx#aHbt6l`ip+HBz2rZHY$6B4rLyv zD0%uAj{J;h>kVa0bl=_u4VX2`Sv-5HvuM-N)K|9<{t}?8ri^7>OFBj1pDc@0WcKb} z_JV1DyNFwaC0JK7N0TPs2X^5zXaX}$Msv3CndTP6A0yo={Q3fEO0=XbEL|MbiQ=d( z0Gcq=@&`gnUzYz0!^{SuhV`s?w(r>9%s<#G`0Y5%I=Us0TP!c|B;cYe$%XO@ZKBLo* z)1h+GT83Zv|Hw$$3qoQG#psK`Vtsc70Jq$t@5ewcsR8*Jm~0Kc8_5Sn?YX?~EoVnvbAx1C9Z~MNo-<;=Yb#r@hlg_nvf@@Jhql^ne^`H2v#SoNNte+dM2}(E!eLZ@ z&r)VE^}Do`=~wq3kP8NruAq50bQqSTqtV{#c3=oZOV!d|xOleyy2{5|+L%W^wcItw zWp4S2XMUdO{QPKRhcqce@5{WZ-g|{eRQH<++S2!9c{oeIx0uOvpZfRWlaiznJ})kP z?rPSeC%Mw`93&8dj*KnxFmx~rb4+c;LBsMtNmilIpZCss;mZdckQvC_jNVyULtC+Y z%e+cqJ-~nrUKP6DfVSpNF=p#Tb!Ua*I|cbPAaH}ra28_rU>G3AlGM514&UQL7A&~k z5obJun?%4ISt+^0`->sOM`=M$OkywVk|=-Jn}B z`3DY9(^U1E(>TjXKbvaT zD|WeI3<~w|MYH}LU?QJCvf^a<<<@owggdOk0;M(e`A!UVwtnORX~gQXnzAAHz7e=CpsxJ6%(L|eBo;rSVE|Id~7Sprbz_T z7)2AQ_oRR7#-E$?#7SV~#c1`)4X_cMg&LdDWTP&4ggt+rq-*&E&RKTb%d|I z*q#jMEfDcm_&fLc#(+CyIIN<_d&V%4Q;Ya>q$H#%mz+GesC^OfmuYjS3r_nzRiOyH zanaDH`vhGtiJY= zObi^a%VV0k76t2UQ-6@t(|h*QXMe%pRY-<9NkLnXbA^SuG&t$dDM71Ha4kcn>Lm>D zc1n1A`9^u3UT`8FQR*9#1bQ|c#%u5t|jsTE_TYRXon#h07NTLa< zFwRkzw4w^*%#9o25v%_n+ zwJdH?OZ~_415O`JefTUo0tY{lgpBKcv_o-pL{SbtjfpJqloxqhXsY$mE}5E$)CTvQ z1XK@KSY`r>O3kzS%zZ#pd6;{S=7a|2)@c84I_ow8>d=mS8%>RCL_=06CP3XaI3`(O zv`?YTT;7MQ$yD?g$2S|IG{)BRpnp%94#Fn;UFQ@LIh^$GKK4~%RE`!rrhcIFp=+H7 z%R4tgKtlcZtN^Xd5l9k-^&#_vVRQ$uJ}%pr=?GZ^g`yxMz0oZrp2nG-IA+ForV4&F z<+dK90~A3$dzU);q<9aO-qo}F=(DR3TU$IWGEgX+wLu`;96_Onjt_Rcc8e4N4qpiH zF9I>H0ZfGr=yLJfco)-MOeNVq)@UHa;n3P~Kd#PGmxZz^rcwStnG?d_tLNVY9IZv>&#x@;XKBYl3n>XVO=LQs=B33FE_H`B`#m8u5{B z#618TuRQp&Os9r4{W1y&>gD9*iod`^YL0O;kkH5m<%h@&MKGI7Ke+CfSYNFcfki=n0Rf*q*%pWAwAEz_WEioN+5P*}jggI=mIuITHy1mcm?D+P z)1Ze>L+!C*a5oX8Ln)8!7dk0oDLWzUy2>sTXDiz_`#KL|qj|XdZ+SF8+OZL!Lickq z+0u~hyGK19x=Uj00`Uq}>q=9{S=j03-_J6$fn>asL>G)rdmI^^PhZ~O_~ooK^!rSR z7WXmi5(&o*VSLPKJRJnmAfo7qIc|{Il5F}KbVN$JV9r~+zCKlSL(MajPwVnG*Ur`e zzYM^QZEug649ic55QaP2`1~k#Y8URpm!QpuuF`WqhyS#cMzoB$q1Qr?v&yqZ0G&Df zM>%(Q*Y|ux8o>k%U)C~xzh-Y#6(3*Z2aQ4y(wu!){s3x`G{Z&7EZ&V_haC!u94-31 zK)?n%GBWZ!g?}em0{%?{3n)76TwR?!%w5fnL&xH*Tu>rX$4w|*`3fw|MIVNEgZq-? z6HrJ)nrq*ULgr!N8OxZqE~l(@keX-=S3g`4<1 zrMtr1Ddu;)A;spT3jDpG8|j74OxSSDx4n5=XR>*p0ZFOZ@!PKZL#R_!x!c%ru{c{> zTiDZjee(yDk8y5GS!wV0Enxbu9y62J`$W?2jlD+IvBs`j9jMqcP%f*(A%OT`{9UPY zdi}T|0IqJ=KLE36yybvj(er-(3K-!PmG@~;v7tbwpGA(v4^Y)i7a91R+ z^Z^6&;l~zo^IJIzd0NfmrXSu5?7eu^Ds756D>)25<=eo;q!JFV?S2p$I{e0^%EmcodCmNt&ZEcwz6UEMOAp*h^!S>|6NBoL6})^)NS85IQUr&TJ< z@}&Lgzg9Sm%d^5+fv`Kqi!ncU#bwYs9fgYV*I&;g7ZwQORvB;ZeF~iJxxUr#3Fu!? zRHpxB z^Lu|6_bUj$Vn3}4fFEEhAW2EQVx9}qcNx2zk{<1cm!009-+}xeN$-=F$Vd%MVbZ9R}V}6x5g3lwVMnBfoxW0rLnF4Zc(?y^)eY}fRQiqHJ;G`T zu>6*W^~6tM0qbY~_RN>>&C573xtwr@rM1h2CHe;zf@ z2nEx#t0F1EZm#pLRKMX7z8>c{8ZrsJ))|u!A|Ad2(f2?K54dSVO@M2;hu?j+v4q~- zM4b?2e(|fYwX@4rO@`dq`AEbh<=SYNpHh0E21u8q&q>4cyZ4*AqG5n+GnLmi57P~7 zAFI~J)+k(he#_zl0qm4_cN3N$JZ!2MnY#PB=VnJ2g~_W6Y>WxQKrL841mxIA;@PT& z)9H3mOds54L76L8!CzzH2}$p{xg|0%0=+@PNgNZH>-_Up{J2O;!b(FI*EiD7U#x>O zRlVrHq$}r6GsI6-{o+2xV6leQKcI|S2>@ue9AUW?OjaXx#NWAP(0IA-FcpD-GI%V=Pj)A=`|zJ#1#SF?&ATl+$;NaKyKEf-38!) zMflx2f?oTy1`W%V*;%;4Cu$}}ul9p^Z*7sEThO`OJ2^JCHaOYUJw!{+Sm)_w=4@L) z-326}s!GkndeyS@O?S@;I{tuZ7g~$M-!!rMcDS(v#IqdWV;ZarMo4~(F6~*A^TYVw z_S@Ryz7zH=)+58w>*s)3O&t+hZI@yF;Q4+3EwH}jPYo@rm!sD(9TRSmHgH$^i49QJeo7@N9*9JZ3TG%eU8Qo$V?>*AMkAg4 zqK8jFhLaHgb(+I_WMg=SD8{#~O-MIBjtCDgB^HBtU1&o#0VUyihj3CqkqnP0BRY|o zfN;a|RCB$dH;zHlOTf#OU66%>Q-HF((#gvtlP0m08)d7@RYJ`Cr>d-?xV2(dRJnvk zKfid%%t{u-zZ zPt!~U_GoMI@_0*jkIi8I=;>USifLO(a+pP4BW4#tn9Efuu9_Zt)#?a)QYA> zcgzKuN1w8l;E=MU{Vy`ZLvpXWi2W_5WY8bw5e8-f>rn2C}x zbSJc5mMO~y!~+ctRkHNfse0?n3oD?UYBSwWH?I}SbV(cnOf_ZSg|CVGtNz8MKaMSs zYiGvCMwo0lX{YR3+*5Iu61YVxIQPhX)f$_mQLk~!Ek?6>H~xT-z1GIMAF%PmY)j_q@Pj#i@q({VUBIMX$8T&On7 zrM52c7~ds~USxq1XlEkiTa_}pm@N>H8SK56-A>Kcs(oV&JhJM^3m~N{qrTK4p6A6F@I; z6xN@?I%?j{728yZ>(N7(5n)HBhAJI@jCFv<%xc?sby_gMtI;h~Km6gukeknah|`i4 z`6w{}s=6Lj%i!JoObmw*(weZf|L`b`+A)w9eq$P?^7`oQ@QM&q!=-j?@{*E}?kR39 zZ7n`v_}54ueal8f*OjdX!4vjQ^{v zLGJ;H{w2!YNBjEm;|px)3E#qge$$A4kUEsP33_KW!LxJ5>*em~ZD;50{SD$w9N{hH z7)ZphsW6RW((^uGTisc3qD72gI~f5eTy4#rjP2ZC61d({HyrsvnLf7!QD+&DjGURG zAW8~ta!lD>a1fX|PHvVcL5nIz{wFMqHaYHKd@!hC{DTUeCVe0_=BSYYd4WD{ECVp} z-CU(&NrpAwL6Q^?)6bsut3$YkmBRfcso(C)g!{V-gPx}i8wKt+CbF4)3Ya2Ro<_c| z%EvxPo&htAUkIc^?T-Cc1MR{|{fG88L>k22&uQ>S__!Ymk^P@Z^!1;PMQP*m z!Nq`vW0g>w_^b@F_Mu_ncJE_Jl53O?k1xbux4$TM9;i9_f~)}PK5C>9|lHpg7cOBeb;t3{V6FXr>Sh5XD_Ow zX`^DVXKS3?k((aSVkoPo1ie~XGLmrD2#v~(``utKs_{ed#}7q)adB}cr?00Qq_9mj zRWoXO*kt$zyJv@Fglf9$Rh8|(S5^tXmxlgUU@ZPS5{BXG=7JigY(?yg`#5_xPxfDA zin__qo|hk7fIJZg_EhICgc1FB zPX#oXs)QgfKNgK6QH~5WqvtpK^O4Ndfvb1zb%NVumH#sWfB7}X_>2D**<;%j z3>QhReJUi!T;VfCdyL1(yp4>`$!8!BL^sU-3d~9pQ?rn_ zK1(RbMBT96JQt=O7+_BaTXm=R zYS~4zS345H^ASD-Me4T5X6iGlrG-ogID6vo$H{2=c!%#J;s~-#Ff8z6Bi4^g_1E2n z`M75y1E#g@ggfM-!UeiyH{0`vbtez+Sl_P;mKN^`1x2H@Xc$5AYP7?_5d%>f^I@3Z z>vZP%UN6n?=x3ayHBZg^`SP3%X9M+ZdXDlXEoJzX={)D^&lrY+C(P&6Mre z+8L@YHM<4XZ0bipMHV2@n_Uo>O=XjUw_iMPW+-h0$Gee-j$n=149cRHXOy8YA8GdKfp4c30`(}o+n){hpfJFu?X zHPpm!x%EB|7Z)$D*TeH1U~OfQ_5(@>aHVB3MmEVM9P z<~akaS!U2wZ&V3!f(3p6#O3{C#O1;W?WIB;lQXi+T9p~&5K^HfMsNU2xp##9jW@C1 zj%XrCQNt@{or#RS3b_`3rnIv%fCSV>hlUC_gpfdK$v~g&^PcOCAVb-5Tg##m!48*U?F_FsVG69U#Ygxr1P#yj zHmZtaZ3V&I!&P2u%4{M!S6%N6+4$U|;=L|YwW8`vUD z%VVyprHB3znPK>$`@+vKeFz7WOK`o0Q!UQBR2~C7ah=65gMrTtXsPpt$9nh`zNW@7 z=~N78OG{x}(&!-c19ALK-&j{{b5-UHX8ihR$8;dRK59bMzxk>08bQUj%>@VKl{@yMD{%T3%Dka4NO(nkNc5nFf*StZ+!Onj> zvQXPJfstqERN+`pIiwrhCtIqhz$*H~98U7CIEHtVj`2^YqDoQ!q#)_3lc1Z!a^bb; z?fO0ul)BbD{i9*_qDfvkM(`j!H3_bgtqwRz?H!w(fJ!W9QHddsqWI=uM3y3|_9C4*D{zl7RRfEqSx}D+oCH+0T+y?CUlj*2n4fjd zb0|)o3KafD%rc)+*E-=F%W9Y)mv9Z+4b(#O63bij@5tI0CEf7A)A#w7gJB`RA8j^L zoj3GHtsaxGa{UWFhyISrA)Td1^h}^}X!zfGuh`cRRDs?_| zlrGjgE-Y21hC~qwhnRV8i8R11%%fbiiB|3MH+8Q(jP;Rc)Zmd|eqLqG#-#&)xe;~? zQRw-T=Uwi@97Wxlf9tf=)*xK{cyFLHG>|4DR;$UmnG3JLCB(}(OVl?D4AWV}9_h#Y z(Td3nYgJz#S(F7`GifZGD7$KF1a&U3mbTd$DSwi+ie#!l0`{BeK9YdaNo0r{%wBS) z?}wWxb*E1||B5ZhC^Cs~;OQpyAe~$xnVKe&6#{AHqQN~^o9tG3UsqeWB3N_ErV9IV zZv%Yr@4Vtmbe-jzU==mk8B7&D*96Ef%Mo4Se1!o$m>&@eE>j$Chq5Ll@zGL!aoQ=L zv>K(oeIqkKtW*^wX9LY*2q1hFzqzUC&QO_d@$qSb@-dVc(lSvrl*Yzag5k;_R-I?c zvBtMFyUhwihWSO_NhMGGO1FjKGH=aK{MBOW*8}fdg#V0@W3%2W^HxGwY5xGA7G}la zcsJMHKXIZA43p7;_^SuODQE*29PYY-cW5*`skTF)C?Tukft5svTjinLXPNvb;Q z;uPAP8Ou}M?n(UGf+737v*6KXkIo*19&-^Azkp3VmNOCb?BMIB`FHFziniHw(xW%( zZTadp?bCwZw_Q5A%MSiO54s_zi{_`r(x-zhsW_rN%W&VhFsF-zr}HA(3L|W0^9O>R z1!abt(f;`!4kk-kLDqdyTd*D^&4@r0{IK9dH7_v!DR?= z(d2o>mPiursakcG41NdZAb=#f$bN9km|tDf)-#sEuAi+zuSh$6{i6jKEo?G+#@F73 ze?b~8yYDaoF4u=Q;F7l_8Zo{PV@txH=*nL`Zh?cNRqA5;Q)hDa*2KcX0&z~&&R5aZ z#l@;lSN8l`qXo23pz3Sf{D+VmT%v}mABr?3^C_u-nLc;%ja{@$X;y~6W z@CkJJ<2b?`MA+{PML=FKhc$f1!;DPhH6_}aQD(++Od+`~^vLJb>jd5psp?PSIy)8h zXY=x0s0-jw9SAmBJey_|L}*imb==x|cwFt~J`*Y+`Z=3p!0UG)N9{0(rd(g}Yxs;7 zhd5@Wt7wUt~VkmMtaS+T@7m99Ij(L zos2lcA*-FYC2px3;g-I>PISGd+eku)$n{YXbmQ);W0qi5@4~u+2k+KPmhAj&voj0n z=y;qkj;DZN{r+hjiq*qW>*?v)nF(fLL6DP84;f94EvmJEDzcr=oK*Jh0cVm=pYa5R z41B&_ha>r_p^d9g?(I(~vap(1sP68JO4!{M%Zhju%fhXb^?_ls3l1|*3&5%;PKG`L zx&0QZ%flz$ff=)Brxdnm7~!nG1*l|HDOZNDhHKQ>`N>DM(Y>eN5<6jr?a+Ty3|MUH z(r+*l^Ym5L{3uAEn&QCR6-+HRdOx7rvAcWsESA2|VbVTB_anU{hkTDSebD8@zT$Jo zn~{}1+px`RL`3mP%!Y!BLueT(sW?MV&n{j)j&9uwoVGjKtmL!X@AXn1OwrEXtTRSJ=9}RwuY4r+7_0qnH(!6jxI35k9X+ynUxi~M?8;*SeVkr1wT`h5j(Xya zDR+MBB-l&4$tP5tgMRfR>f-ZY$#0Y<62Ubu9fV(9o`&E0vPM@SWQvPdbN|(8o;IXB zUIWZ=fvuFr*0!NZQnPMa1e4qTW{mqW3mvCx{I_{F;mp?sp2|=he2L?7{W+Z2tgazA za{KLXD7_f2?4&GtyiQ7ZvEHCCpmAaTfjbLBHlOx$k)W>&bB%XjpM`zNZSYi%Vq;?~ zlW?G*D8=#g7V3fu{cIg@2OGJhmyzV2Z!ASZ4k?~i)pLaP3ESZGF2&$5k!U7KE?%Nv z2-br$ogMgl8lv!S=#O2+yAK2&Jc05Y!>Cno@BPXqoG)}61P9?vLN;T@36%soxW)oQ zTq6y(zD4jy>+@z%l;1&Eu7iz3INbcgf~qVc~FOa8a>fF+Q~+$S6BeXP|%39_J33(^FIrV1=;eR8B0bDbhTj|V-;@>W7go_qDem;wb>A_um`SG9FvX67eIh0~O zL+&>%WChwgnm+P_o7vNdpx4^U88rmm33T6Zbsn2m z<+=F$DFTzY!KiIEId1%iY#%3aaVHejk_&G(f_}Sff zq1W|lAp|dJf7~yRuU61j<)8Wdu_q}{HuGMq#?By-O+!-;5RLKS*Cm^ej07Ss4{RrU z-Me2Pw%ZP$tk*q3&QSA+N;=%VSR%nlhNztw<(bl;+!ryqchAl3rusPC9F?-!ha| zX?3Ws0-?73sK_943qACL=EQ@~$#jPl+j~sfQ9vq73hw6#$#pfbK)=`}rWEr*^IZ{ItL`=saDYWVV|q-gG^ng*r)uXmFP?oZ<0j6=eXQTM z>1zDQyjdGzPS@Y$Ftrc_nb;h6H8Kw#QvFK^?x)iE6YqdRuYU7(57cTGOOW0y|H9RIZYY0J#cPkB;13A!vU{7k7U6G!X|-|Ec`qvu zT9w(^c%|O~DUdze__3!TAozKlNyR5zQhG3p-OP;U+?Ue@OylmbBSqPtLU1wU&iX4y zCF>LM!SK&@^_S-dvG3kJLulZit(tgm4l2}~%6dKuK<{6up~6|MN!`QZ!9V_{RpC-nWdrqNU4> zNCT4=GsE&UjUTCk851m~=rVh1qF+a)-) zB7QI9r6K9e92lQSroh$~Gy_5Yz}Yv#{PvdZN(FVx2}u)fJwdJ_9cGX0mK&IuSYx01 zR$rz*8Q()w!=={uhz^MVYDJP2GYQ9{51h@u2$>Vo07@IWtRW=MhORN=+)~NfaYd{y zHgD8Y=&ViHRw^W4%qo9^G};fW+Xszio`n*Tt0huI4g+GnU5l%C7_)M-IXsJH)OcW4 z6uNTvk5tpey+?GMx8Rl5lV`8|eC($yr$*aJ=av^p7o5}o)NHKJJ>tCNtFg*@3xq$Tvjrt2=b?<>GJ_q%IgHkYyE+X~y5 zn%R|Gh%|r5C$SBYS^7_0Yi_8e;6KNekA1=!c%rNtyVw!8p)X@N z;0d--eI_)XO^<-|=-VNL;l}8a&neYa;kA*GnowZ2;8$j^K&_2qW!gijKG^|DYbJL5 zCkjMe36B4o^XFLcQXI*@3gNev^j5f;%iOY%Z@35*I9o@$X^YDumWlML9F@mt84bMJ z##J2(AfzBm)xi{=IVq58MVhgKisAbn^7NlFCZHVM14eg@fgl8b|MWLYf<4i1BefQn z4J?zi@xjz2kNG^IGUls((X`z6Q9C z=FYgp#$ZeyK5OLqn*^V1gNz4`M5UyeSLhpJv8jn8)MQ_P33Bg0dt%;Sk5jXM#WJu; zBdKbpqO#s*T+OqEWzt>U21U@{sPHn}NF*X|y3K!dYISEpa>G{&8(h>)<%jZI@?^JFzuTSFwj`gitw9I-=I5kT10#!i zLD;+!sGy*iJ-PTNX! zcCeOF(W4lrkCxjaNH&E8BqO?bfNa!nG7IxIPy9B9TF)UcxmBYAq2MYtQR^N@TdfM5mwy!e*F3f0LOJEkN=tvyQ9YE@Ow^@5d*Nl`T(z zjmzE{UqmylEBuRtp8+^7#MTeMa!D>=nA?<^$N6W9y_T~vn=A>eOB0KS$ z>DfNOd)T!N*!j3Y4?!?^6Iu%7 z2z@7N`bd{EI&!$HdFpgXb%c$-XoFh01h`)NQS`iHst841n>MLx>~UqX!i=`&ei2PusQoq$V{2fdIL#ME_$ja@2eGO?l} zp6bZHGe`p%!o3Um_z4oXQxU`5`ufBn!QRQkl{z#HB0?9?W!xKCr5o*i0m>@1zVixY zVd1i;Gc1>!^2Q=X2IAJ^lVCv{a;&L4k||l^IFcjv;wJFZO?k}i*h)?YsvbVo^ZGov zBYfh0dvLxUeDRyi{

O+!g@ilXQv?kZ_Q~*VaA{C?~n8I zU!N+kZ2)5q5xa<8H`02k;&7#t4QidU7?G0sk1503)Zf4ex8(>L7R$w%I#UM?ovYa4X~PoSshvBO)i0!b+CLxHbb z34xPIbBNO1+o3E=-h~;4b=7v$gpTY0iAOr1H@q)C;w_9QOqK+jM=fVV*4SEpkMNFY zOd{$T5>F;6c?`Srqa zI~Q@D`s&rI_j7v5{3Z^@34xJyjGuWuFJlpy7l*S9{*441;uzjm-mPcmF>(@ZZwlit zdFL{uLX187>m$|rZMZW{Ye%@W zy8uB9WrEC>Ga+90@xF(dN8S8^u#G3xQ%p#GI8<1QGt}BV{fJJsDd&HgGEW-bwbi%& zlc!3m`T9x+?_eaLDLH;*h(xFV1kPrUZ(CSUnq3g9OrTLzdU+$z5BGxC3wo#7dh7<^ zNWmqn5rYws-xiP`<*yWd@XboEm2&V`Q=+w&u|ulv@kwkQ)hZL#J%7`97 z0ONtEF-q@T`Jf!(xG`}8-tuk14r_puYr+^iKE%7~I6AX@MxEEjS@2vD`+iA{tk|V5 zXZ`mAd*41TRDT)Dep^vdQ7318v6eVwiv@pTB#4aO5%v0EZso;htZL%NPoG-m+RXH# zWz7dQ<1}s+(Ucp~G!~kdaxxq}ciDxz@)L553U4D_FSFjA~{cMOs$ z2`96LpHEGhC48@Xh+newtID)Cw1^g9d-*I8dz&@6c1evrvFeJS4H?XqUwED>!XXYJ z9u(WyRa<^xv0|#lC(;JK%-7;w_+G8jf$+`^E#5B?9GR=#9!VT z2CGIWjqw^Ac0Co`WRB2KPf`0iM`5D@r+g`>cyj`$w|hWLZO+Co(pRyPjni!cs8sPEM@8aN$f2#m6@s}RX z2DqdEV4^_Gr%9(UvQxcwX;H~p?6vpNu&VcR$R5vf_*iJtU0EBPN#ps!hZf$>_0D+mT9V@-pw zMIw4G49notWUs0y{LL+zbm|2B4fj!`+QhjKJp2jwsSZS@ctJWO#{VF>B3Z3jyd}5g z-E()DnB}T*<1Y&tTGt2tP~ie;SdnWJ?l<`^5Q&BA^8Er`^vh1Z<26NZY25DARVgnE zM(7~=1PB_K%&EBcq}dfG0A{UhMQ zD!2^X}PeB{vVDvwNl-MUm+E*en8XBOXmXDGmp%B#xR)u;wO3K0*}p-@bG#QU`d z%=EBf>gQ0z11-Il!`}|SelD=c7z7lE@x41%rSPqotGQztRXm4q<&oXinfjH`r6)C{ z+41vYRM53Ilv&59>JS0mUY+~AbNg9BYOC*yV{ZfCx&O&l|Fww&YZXD6K);O-#)8)$ z{B-20cLraVbX^J;%&ywbt(>2+kn|va^G*cd%pcYB>iBd=LSAws%a_6(O)C-P|Fq}M z0g{V3BT)2y=%-TsMr+p0uWto;1Y_VeLW=i4iDp%p8lfd|WcNk>Jo;W9Nv8#KQhs8= zEoD?&kv0K)gySrwrZcsZxcx=hMU2z_j~j}r=t+a^ZHo@G%4BPlHk*?6*8<{sz1N~5 zLqve4Lw}D<=0dT^QMX|DR%8Q>5RVYXfkF#rM))r?0B*JW5QGjS|NGg$hX7_&N5k6gpaGL~oAXOk3;o_nJ{qGy89@LK072`8RtVn?)K4vXD6^0AriD)1AN z8km0Cuk8l(q{XhKs5C2);l2kNUju!tEin1$ZS^%z8>iF6z9oJxowK_1#vK6-T8u9? z>c>F|B~$o76k|L5Jgqkyl4O9UsV*UCnuszi{%$nJb$mE6uYaz`@25MUK@(0@K6Rbe z+asf5{=5?V>U^<)xlIzZ-#HO`9JM%lw}@Ofd(<{nV?DyHppDbW^q9tdgVeJN-j!JH zhs%?BQnD03^qO`maX+w8k0<)^gq7j5z!JQTh%`yiUQY5ctC^4{Unke#@$nvv?s2$^ zJ5U~g!!sbmNG0~kgAuQ*+djl}R3M*Sym3XiXbig%QVX<2Zk!*{pf9*fGHh|ue!KBL zMTu3o8vkUc4#}tXz~OYo_fY-aVJE zcI}fbXl&doUjxOT)-3U5nHwN_L=!sGR!yJrOaR*wkD(M|Kl);-t|phkxU<;XeG_0| zJW49~vl1&%&Zm?)P|7N&Z~V>kY^2RRuLnGyJN7<(5MeN>>Q`K*9-}1;8!5mQ?})J| zrbE0k>LBw&D4klJs=PU>Ur`1*bO2RJrAxtY#rW^=-`6`T&8;$^D3!e`nQ!}|wDGiH zHYG4!%5uZQ<*80Y7w~s-#kLS;R{y9JmRO3X)nFfqwz-qLwvha;{^%&p5BXi5E z(M&d|N)#mq{UrFk0n5|8hxO?LUt>OZRMYh%YBUV}_C!#dLv_mPUZ&qGHl>wFwRHmRO6=u@o7QIStxHlAG`gR@N++_+BzPpeSaq zHYC@AHI-#Sio%c3=D|%K6)Nof7t2X@S2JzEM-1*QCl2tl*Y}042g7V#$t!j2YQKK3 zrkg?}l8!OyG^+XBHpU0CIKVUy82X7|t>=}-$k2;v&NxdoX^+!-w#CUu!mjM&ew|zs|inH-rHie+|lo z8l+vx`8OPT|NX~L%fQP0h{SU1!!&u!%OH)$Ghsky!sf~y#~v`zjX zH1v74>7Ol@@4O?CfXsiUVUN~&Vw05WKH|NszFBJJ*niYP70VU+@xlA`Z>@c8w$1Ig z+B>K?>k69U0vq%8f{TEGf?6>35|E51_{W2pXcgyD)k1j9%4pnrrHUttkTCr&NmqzD z`2@J@H5olXqF6R0yJI4jizQ5yg6O5-0fP0VBU1C{sbqII^qc?Dm(LdfMi!+HRYsmG zExkb^7C}T-3=D}(qcY%_S<+lZyt%rMsM?_JDHy8C`{*?!EoZRmTHbD8e! zhMP0bgIMEss3l`Ogj)vlr;`#}&*=XocZnJ;{jDdMo2A}kMe(>c-sPw84aO<=jt?w_ zJqarFysxIIaEHut!yj-goPR{xATOvEclMlns`Tbh>(MK}oVaQ(4$&)2pRmCb{T+zZ z)n73SzQnL|m5)_G6qJi3 zy`e51uD+0y1HA!!1^V?v2QQvxxYaBE>vH|aCnv}Co|Hga4R{ZM6Kdo~@+`qMDNN*G zj$CF@5)eoc?G2I&p6cw;`GYUh2l zC2zKw3GwkSVPc`o*&b`cJjYE+!tLR7i1XLx=Y_&|5C!W696tM@XG5V(qun>}G|O8o z{32ke#12Q2mU8BPom+b%VqnUZDeg*7dCgz%&iqq4cdVgN?gK=!Yh)Db&%Ii&W2J+= za4?6HQF9k;B}!{WGc~$ZdswmHgq&QLQlrh(z>oE-0-LSvtpL_gLL3kUMyVDk(LjrL zMPw-}d`#3UM3_(q#4aFRe_gaqF7%xvS9T3UOT$V}e%Gscg{V8V?}?i|&4u&El9W8l zg4f3*@qJyy((Xh?sq0Z15E6sGQZDP{!%O+5osG&hiYvmJaUag`x3daXS0zEa7cX6d z2`AAtqYBfxwB|;i0xwvC*x83wC){ln-n-g9i(*nuNeC@Ol+C?zY%NE)x zkOGQtgKWpQznk50XZg8b=i{QdMJw016GXNF;)R55o~lsqVJUl9^OzGx0)^&ZFM)N8 z4biLw-Y|>Yt_Ko^mJmp>M)F~eiY`ITYLa7jy1RY;1CrM$;jytX4kN&>@_#^NZv_-U zP@e2y`dFx-BKK`TDxO^CW@Y5N2pl&MI9WcDEcytr-Qql4d>qx-%$=S144i7AHaw_C zk*NNlSHvJ_mcq9G59Q11RxKFg-(P1IHisk1kw4QQDx-^!wM}aLDq8cFEe96lM3JH3 zE*+rvybP6R_sTMGI@|?v)!|zZz z7T@)yj%+q_P6kAtO*qh=}z+BN4aip4}u z8Hpsak0Pwh=CZ5S!VCmy%<>6zY>bPN$vie$Y(BzG)}Jdr)t;U`F!a^|gO5G@z?xDA z6L}Ly)o*%T)(-!e(RB2{4zkyVN9mJYArN zMjhayQGF$_tz82S`+FX)L}C~_iH{yBRR3PnMR*3mdU4F7euo55oE9jZjJPXjL+LL9 zb~Wqh@94C7ej%a5bY_t+@3_#$?0-kH>A;3>A9OsFlJX~KO-wyaZ)l;y`rNho3U?Q? zCIyD1K?weq9>ijeONX^*{dq*!QERPK}N?(>ji7!y*Uyb7_Yq`8WNv9CnPqL?E0#7S_HX0HZ{D@imYzhZZr;TmgK|*+E9RN8m4O&(ddEkmUWPCUgwIc1_qxE*%3^ zV{`h{M9tEC*fK;R%$&T|%434H)muzw*#f_R(b1#p3V_3@=Pp@+3PW>K6}jS;c9~l-@(?r z5|q1>?Iot8KRrwN;)auV%a?-J#|u$yB|dG;nTlj^GN94{eMOR6qd<`u3#fJ^(xO&J z;2%gpX^uN zV@|1_dHk;EWq`|u{*c`iy>o!yf91%q9_&}-ukOLS&F zUhcV2umMG^VU)6QS@2Z>$w{aM%h#30sNLUR8a)9n2~`N@ew{3hDIHIZ)Z?CDAb*MSEn%iYD+{JUSb(WI5KLrg zknf}=xvGFv0L>AUSb2oPx2T;t!z$ol%vvZH>Q5VI7WEeGs6v~_dw$~bi0UfYxnnf9S?GHxDw_L03dzGE?!Ux*83^`{oynF~ zRQ8S)Iz{XVjB5~wX@PUyFa{PA33z3 zcSL#-g!+)ou}Z>rxzD zv7SJo#?{CXxT+xxO~RlneooRv6VvO$NvR3#Br+V53$0d;wnh!aVJBkC0+8_;t*Ras z&sB_1j=~Y#;@+{#hTZ%C+F}<6e|QT3A9`J~|MdjGU#?65=h7{vA80`Vbo4ydD5FjQ z7ci^7l~v(S1i&voIgt19rI|zK?IHs0*t}Ei`HHuW>(LY*748#u$eTEdX%RIxX#iJ< zpA0P8+5-0OzP7g(Yvwj`REqs;3Pd{Am@Q&>^3C0STM%SP5I{3_3cRxgG6ETsl{9!d z{;sE7&71FpijDPEm~c00CG8WWDCM&xbw#<({L+24UY486$^G6WH;_f>vrc)!+^37R zx2roYJcR8?=xg!r_7RpkUB>_NhOdp=W>NxRL}A&$4^b-OkGPAu1Lk#V80$_epYSY< z3_Mq2w5an+q+fHVEO$^~c&XQw@*r!rvb}z;>}Sfp_Zx~&ju9nLV9)GP?pVqIRx@$? z?b1h_FI+~KzmW<1>ACCVhmT)${z`f0+7+Qrs5Y@?@7hmem9~@c_%L`@Qcg0zp3DRa z*>I#7MQcRb3jMSFCr125^&j!QU%zH2OE$~$b$l%JUO>gDVvD+HzjS3<5`vR1s` zzH1zlSpCA-Ur6KnrRm1cs>D)3IH_Jx5CI^VQNA}7dgJ^1Rz>68KeJjM<7}-boU90p zwqXw(ob6&_?e8`?*7C43ZFpC#0;tgUw@+lT>l(Wdgk|_c@b{7v?^VKC3I+4v7ad+= z=0-fIKO9bi?+obp9XR)}gI@!w+BEX})_L8&yu1Y!n=Zr4!188)qxxxA*qmavg2*HS zLRxXjWvpb>tEp2zm3#gC|++G`1yY<8xj`rk9O$NPqXWKy=j+eJ65lp0J7G9c6?t% zU}fIM=^1t^dcjNm?N5cmL}d6`liG8Y|u)tq=$=jn^82CuGopri-jfKIM(1 z8TGTRIo5sih*@%h*EM)E7#U7pN1@`Y7_r5BqFaH94~-@EE!V%pDTo^S9Wg-r?V=UR z@1C?V{i4&H=mhjto}4qlEk#~)Y3$bkb@AS}r^*Y^=v=WHFkyv$v}ig_Qf#&vVt0;3 z``Os@(VjPHBAj_z^EXm7cb1xqd6=3VYN2sV+WZ@|L;G+|ql(uL_>+So45Hqf=Mz;j zDjZbX^y6)O3^)NPB+_M}t&ZxQl0LjPeg>SN)!>jTSQ-{if0*1)3)>zm09p=l@_=VN z(EgKECe}-R!;PNshd-On^UE|?_dj;k;Fl3ZGesGshIgyP_7Ri}G2qlU3vhD~p4Lej z2~fd6JFBP8d;yo#^%HX&VS~qdfNZ_tToVp!gNo=Fs5|7D9OC)fMUWX1K;C1+l~)sg1+0W)K~ zkrfkVd;wq2n=U4s-*`~kTQJBif0k{;AAatU+xL|vq>s<}=Uk`|*ZW`z;*G4-R`b5l z@aqA2R;x>GQeof8#OZka`XxYIhhaA#DZRw5O2S^xj3RM-sl1SdiJqzP;*FSBoSUj( zgTaeeq zrPI5vBi~0IZ;)zShf4wg6(hYUna74Q3;wV#oi!B^FZmy%+Jp}*zF}NO2#pA zxw=i&k?Q#aJ`H8)vX;?)q3L4vLf-NyNmAN3C*a6YY1u{M6Iy#c$NAth8DpI%(ut)y zn6sK|Nw-h;g%D}T0)Lty0(|j+-_}%-kIZz_M0zG9wq+q~@dTR>soPo0AGcJ_48>~K zcnRY!zVF2ywZF0W+DN4G`s{@Qt{~MGo4M^dgzDbb8$%}*mzq!{souSWi#vkzx1D7* z2F+?+e9qq`;365si+Cyn4k-6h&Q`6GK&xHlvAI9;f25s1$?N%ub2{;pKjAhwg7UmC zU=(qtCIptQ%@!IRMHe-&c<>1rcnm`8?%V5Csw&!ZTEQXGEEnTe%SdOUNHjux4eV zO^jP{)h1QJIR=<-_I8?wa}+dqpIUAod9YskAizxRao8WuId!kp5dkBszl=+k)2zP! z<#cPBoAkUl*g0zcka+zwLRIG^snKG(8Ba&fUgPFw>h8>aHg%OxRwN@}xfae4$gL+0 zH8Z5#csK4COIt&dD+1xvcSLP;)yu>CXS0sUd8>u982giWhjJ?;*B5qd>%6^JWp=e( zR;H-z8@zVkv9w7y^=nIi=6x`izxJ}>_jvm)i`#MkaHHDa1eR_4*_Tn^W|6`i!)`X4 z;45ftD~n?NVoyP;#aI}z7vE4#-&J0uMcRoD*7-+KoQqDmkmtR1z?n4UYn`Sh;J8eE zXISc!@mzuP>J`Ra+i?9>;T?JvyVT+4L5G}yINLclL04>eyF@DznUg}H_mrMRmRn#D zI8K`M^5vRls$jIX}7 zUdzwXY*v=wBZrr4f1F3ebj7yKa}wg%mIa$XB# zF%v^qfLZ5k0oC%ZWPn~DoGB-W2`Ig%+_TDHkqfv+Oq?*e8uE|HePDVU@)|M%Zqksp z%bdLFhFxE1OZ2vvq|eqE(3X)yefczTCqdI^CL^kcs}&F_@qi}ndq-j<%vI7C+H_MT8(}u`KRt!;o z3eOYlU71(b&DJ{EkHSxgNC4Z)P=(kH^tdn1CoWWJNVnV2 zOdWtbew%&JYuIwWxv-9jtKycRscXG73iq402vi!W$Hg-PX;GX zvmz$|PBxcYnU#n^oA7(Rwp(stTy2(w9~5a9-EeehuHKAgk!-360qnFvv9h4Pu0HYX zQwwh*{gsYZF!gDnZ!B2Y<@ktJ9BOhTI3gdiz z2^F*7ttm#lE)H$#bf^GTj-939Qa|pzN~&KK#<^~$u~vVKN9aNNqQiQ5f-S_*2mtfRiz7{#--y0~Bjs<^ zK*Tno97?twX#0-x&ss(|PE>Q}W;*Ut%>1ysj# zAI%Q#7ASsrC^+hF1ztVTZgk}esA z2cx`n#w9Ynpj=$Tb;NE>Kny3pZDhNm(Tp{`HXBnu3FE{<&^uQtf-wU(R&T;lOc0_B z$w*RiJxKD5t9jedRGJE|$NtHk8td8fC$K2WH7Cz1q>FUF#tOM$>zgD5a)ouX)jT_; zF~?fg&PAdYUulKPEyTl($D^HbwFZi!=~@r6$Oe+$ZG!Gz64ID0D?Q$1Al#0A%pM;{ zMD*O&R$YVeub)Mk|M(tRleTYhU)CDP}r0Mr<$&)YTE2UH7%2xv8l#wrVg`CG%8FB$J5LvjceA!v=aKpA5c9? zTAp%yrVLy5t)5=)C`xsT7FsSRbv~ll2UxZ94n9!-vxWGG87p-RiF@vZ1KyO%XKTbndDc{|fR(ylwqf zOJ9=)dlCYKyZG17@AaT#YkXvpJs=a+7qX(5#0G}$kz1}qAAb@>MsABhA>Kc1e<)<> zb=CO__Fpe{2+#%7zKrXI1nOoa9PjqvD!IV;aJFCL%GUU9 z`)9<-Tv+WmELOpNM_?o;*~=-yHg~L9sJ_1NAoXl$?Z@o*TB%H_lfAC~DZwRr2C#Rb zn=ad2zhQm!#6nr=U<2;W8?E2AkQ4qC$DyUR49wh?#>4ML-_Z?fa5Or_Nn(B1r2R)S z+J&J1$`q;9rI|Hdi$y)x!|+xzt$IJZU$Zm2Qe()%Kc!1HJ2Vmi(dCV!x9$Gq3p@1uPaUP^&&%&#TrR?ce0{?tB){0>Lz=pWD zHB~q1r+L>faR=$F9@x}!@Vjd^2lF;IjB69ja4iA5wh1;9*>iGZ?2EgVssRcR&*%~; zzyIeYyLvLeo#{p}vUMCuEOmB<8MQqd0>>dM^^*8IyUTGl<@0Fum%!0GoNL#Ybt|bM zgOp;3JAT$|f08jk^~=~W|G^P9`~B?)6kk5J$1B4aid4eiD(Aobh0Gpdg!s^J{POz~ z#o{RG(I!=|AYzf@f$U&>sCr)9_8@NKIQS}WgJ3@G_%Xu2od*A@rIb$iaTV{woQ6h} zuDdsPjp;w4gIfDuOT5YPm(a$Lxttk90{H%W5@#;U1k$aUo(1f|R2h=OS3`#oCtKolFHu-Uj>^3q+F5hMUx2+*i zWHcu8hGl|;gggd6F7oK%4<5_}*qzTf_J;nqK9IlmribO9S`!!x?K{H1NUcaCBBz&4 zRBAH&PgM+<&&_P4RePZNuIs(d&d#Feg%j%*T`3T4dadr5yE1AO0w3Uj+%=Ww@7?%u z8yRowIFzA6-ya%{PE0-TeyMt|E0H2G#I3%w#JM`3qgayHL|&R1JpPB2l$1@0{EBd)5R^fag{YLw{u<=P(A-IK&>eaaaJZLM*l{@DYE=X{oAUKLR+Fy{3Xfrvkw zOT9JiCs@<+D0d-C{%D!?-OX40Dttz!J5&B_PbVf?Un3UVDH!iFeuJ{(GpJ@glWx*0 z{F!nVR9t&~^Brd)b5j%Be)Q;?sXL0=`}LA+f5|N!en!i9KXC^Q=O-VT#C)EEtNIKU zGb=j&Ojh>E+N_t(oK z^-WHA)hHg2aT-3L$zqIT&)a{6KS~pcC(nG?j&UrXz_NC~8H(vqsW2xx&a|pUyFSM@ zpT|(jn&+WudGVlfFZqc$mY3t&Z^8 zpZ%>dAHJl%{&zv5HcTLgKhz>%zjSV5(lXms-TI$7?Nc^mFVRm#)VTt~W03AY2A0TZ+8O<1b=V_Z zzN~9l0R)Xrmp=%Ql^PZF@?#Ag1Vub}?CpH;tiR;GPAd6d2kRDGwU%2pG%c}i&W)9- z!LlK6>y<(0Pei2^-(GnQtVM;n>N=1oY16DI@G%aSk@q|;gZ~?cuDSjHOLX+9isQ-4UlDxDg{oCtTwcEcNPxd=PJbx+p>k~keSvM4U{a`qez%iSP zyz^ge<=+}V1Lp~pc;x@-NnhS1wuW4ralj}1E5-ln4s;O3f$2NmnFfRs#!DGq0C=A52SoAjCULv$@(1&5;as-#q=%95nR&PYYYtDQ-06kJ( zsuhCdzhRBlUyVN7@NauiILp#iUabXSB1-QlW3;~zilkq)Od2xm=03mSwjfP z2dO>~3Bf{$Hn0C60HjKALiiki(A_!&iC>GiDVZIIG>^&s-X~Tp!UE&;u2R0-hDwJI zXeM{EBuX58=XDba4?4*!EBhc;P;fQ8e*tYO4JPl?5+&(5i`0jZFVhOu0=UmNj+-a8 z8#r?wtvUYwV;T&7N1p&g2vQ+HT^Aq`z>w4)h9JB7um0beM;8{7i6t$af}}?_de6r1 z4;%dYa566%6rJ3ZqUO9bQIFg8xH`-fAkS&TmPX{<%50JUje{eB;JL=8qmL?Fb!94+-C^n z_799X!^|Sw9xP~91X>~zuJEGjUhmGzDNGsFF~3U)k_&ePj`#yk~-d#e-fa-IwSHm3-#`1xjOLrm@5k30vQOp2fgP9) z%7))F4hr*l-2@hBO&1mgh9-YWpPS_pw%c2C^Yoll7(4xB{QR(H<{BA{&dAe)%hr|| zicjxdn4Hx0CYfJMslCo=5e?FPzuAOkZL;x>L&ghg6EdG<(g?u<5F*gtR^o$&l3U^e zE_sL#l?{6q0u{AHamc$%2Qf4XmdT2rF8mh8936k&tPId@hDAFS7RhQs{DilKy-Mv>2{oB;_)qExq+zskMnY(*$Kid%~nm zdggh4;bQ6DAju%)VgYIY6z#&%qx{^yj(_NyibxRI1k21qV>y-vzDOr#k3fV%tW>07wZ7F2S?D=_CRMww zkxJEOAyB3S)L~n7zF)vI?hpG3y>5F`55Y;;V+TGV5Q$yMKbPLZ zxKeA#&9a8UZuFrXOrAZA1TXYD5PRbluHk(r+?4#>dygP^8UKXI)b1w!#SOpSMq3W(tU-=~q?ypGqwjCVp9oK65-iV^{- zVUt7(*i54KkjG2AzZ{4sq}qYRvyKTq!S7(k-y#f_CK$es=Y1{f??4#)Q9=PvR8DGN z0^UUxwF|Y8S_&RM{xAa%E^r}QB04MB{>U!;(T#&Z9ntn6?PKw4Sr1J+kOV~L`@fV> zi?RQQw)YHca_ibfDFO;8Dov51()*$}A@nLBO$3A}RX}PYS&GeIuW=3aD4ZdMrZg&~^n;PPVvIUHIh9^#KH#&5Ell*%#a~KXX&OX29 z7c2`zCgr@GPVL0+zU{foB~EPcCm^L~3k0MLmvCtTEz&AtKSsoo5) z#z_R2J$=Q(Uc|#xo{m)Dyk%x_D;%Pk@eq&yo#)5(>DIWE(3#g9%gT`Ovr$20$Irep zrEp(&@)hM@QJ?JUe_mN;pHw_ERcGq9zlo?$Y4-RA_&Z+fLD)T&YI(4vdq zL6Pnjl$Wnu`^-frQ(j3X>s$E8h83ZnueI3u{Ffxh@J%x5HG$7csC#C@n1t&z_)DNW z!D&NQd;QV&%d+wPoi>YxcwO$WLv|R0MTm}`;Q(ncyrsj7c5Y4N@{Yzjd9AJQZ1-+kYAB;a{8J8+=fmw1xXVSKv! zF>u?-O@ab|r7DINWPm>pqgG<~AoToa$-;NoD;@|42;?Ds0W^I$bEewaNg#&Ibm}c4 z$7$lttlEq25&7Js%zk^-=il6FzlbMi`Y8{kCHG3HPz~m!XM0fnu=G!`v>-y`q9IMI zu##@!N6;5H(G0-^%`yu$WD4tka#NWa2GP%cqqy}(o9=hc22QE< z#n|07QAL-$S~ODbOSs4Nt7FU6U04^E+3XsI0RbplBqO^jhsBgd9E zNU7mnU>n;2oJ29M%C`AL=UYCVpUMz+zeYcp07XHANFw6_$C`YW-;sn{EE>c(r>5Cd zf(za1A3VZ__iK{8?!u;wi6O8X zuIHk~w+XxHaPDFvXNaQh@5;NKyPS=*mtA4^NDvi&0oY<)H^3P}a{hcUnwRo7B!-R% z1q2_lclj>?1%l8DrkB&f&k0Z=wbv!#Z3GB1`+Kg?H-za_KNVlQ-(mYC($i|O{WlFQ?qaOf zdgoeSRA+arH?WUw-V{53l7|xo2fQn@zJ|CXa+QgkjRKmwrw95%%YiGZde_SC{7mlR zU4ks%Z$8WE=!8d%@4XvpCl!1tZz9G#)J(S|g?YRS*WeOy-S0Ri{I)%kS0qhr%O@qr z(rW+3%h@2lc*N3ax8|1NS0MIjKP8vPbI2utr{c$dv+y+t4MM+XKpuH`8V0)pz8HB! z0fgGt%&+z+hcBsaP}+o<&~+SH(UXp008YF0XbDF_j&K3Eq1<-wBye}3P&52R4y-AK zRYF+;t`r!|cEuwinJl+sGv4sH?}PbI<*dUaXkF!oM#hooH1iS(p8aqk6I!0S#x zV!zrMC{>C<*4+|+B9LG{#ofMAf=qUYfvuLC8vAEqmcF%;6>>)Toh$hsAosnDFe_+u zRXjt3g|`pnYO!YDgjqalG?y#7eDjB#B3f)5`$`QgoCV|jk^0h|$vKt?!Fe+mEu)6N z;dv4)xA)~(qEH8ObA%JJ^!?60sr9El529Fti!y?CP+iUS-mfxLl3vC1lJGC@U=yQj zEAXD27lbJ4V6@nc3o+m%LOI?ykcL-Q?wrR~yM=+N`-)BNeuY3XiZPm)->A)xdrU<7 z`U78k_H$QlX4T&iZR>}q=(}lojIOY6_gMRY=FaPIg%$nJ{6Q!MuC|K~Wh1=$PwAXJ zH<-0jq8X;Iu<6x``Jo8=$M$)m**Ar&0r3Xf z9>PtbI`XWYDMBvE)ohh0rS|)`s9>%zD03 zfo)%O#26WDmr=-R;qRTFm(R-cav#<<1RgKYamINpG}OwH+yE2*nTgp5fxGRwcdB<( z4PFOK%f1fap?a~ty*9(m2?C9G***-4FVoHHa}3i@a0>m9@GG=8nc2;>h!5=sOI12f zpURRVd&o`^WO`AVmLd0s(CvFnF>g);T7vNatjP9L;KYrq$*MV?-cab|uEHHlkD-Hg z@wo>Eh6bg5!th`0vJCxq=XH+=HZLYikbP!AkirE3Cjw6!D$3+ztNX4dPb&+tFuk=+ zX9`dcug=q9)g5N9`&Ph*&NV02H{|?^wI#W2Lh34KJeda86f-aR4OySl&fsZoP#Urb zM6tdUyd$(1f*v5hm{n-(r=QFl-tGDYSbi@txOxT>0b|nOj*E{=h(C+6a;)Z>s9}Na z2wpv}5~dkDbd%I34O~b{F@ZfhJp^ZxPnwt(pqA^sDZ8VN_dkjX3fi9#YFK10eqBDA zc8)5mxt}CJp-Yu9<_RX}rh0ZUFGdb7Yq}jQM9-XlR-`X;YmuRW+E(7U8~rE;g7de2 zHmQ1#*s19QF=%lX^`3!?xN{+p8XxMk8RxFIT+rI{MNE4uadk!u@N}DD<;5oU+h;n()yjviunQ3*AA-lpY z`gLVRmpe${v<-UI=d2Ni{ax_2Z^{CWG>NRy*oj)SNPB@mWM0OWl?mr~7kR$B)hK^> zw{3XxvzJq>|A<3u*Dtsc(^RxqPTs@*|9CYq-&@ZB=&e@t{^R9@)nKrs@Hg&9bQ01s zLpPA(V{)a<<5!6VQohD&6%b4e!rB971Bz)Yr6C#isl3`kxp``x_({GkxfJyadrf zzYq|tff0?}0c7;2xU58TalYdqe~i;qM@0&KdhYKB%V5Af%{)R8(rOh!DT3Q zHdW^q%pLPrc?zY|C? zN@XqhQgYu@2UhvT9IlNB)uRU_-?ZBKrNtIPRU&lao#ENO8joeM6H&z;Uow_N_Cg!# zic+gVnVc+C&P{C4+M1cZ`T6}bl4)FXOsSxN>KlNj0Il`iOQsilwdRP@7_&cCoIu5$ z$MPEz`6UIzROoIIj27yi>&>iCXOx3{?58I3-D{Uj_sm`67Krm43XDpSS;r;c)f9@P6bg?l**TPu0?L z{%bICl`aqSSOu699s0-}Iv_+3Rhd2^&S(1mR`zI}+cf_-jvcMvGb0mbls`*H4~BHb z349``K(0sjri8H5X+pT$#jN{}qh!aw#)sJP5n%#@n<~*Sx)9n0(zq!WOMA_E+CoHnc1TRKhU7df;tFULQl;VBt8=aEm*I5-ri>~jL z73r#LhMEc11LN4w*Y_(YMEN&P*eRM#8rAitR=XR42%o6r5b2YR_ zUHXo#b|Ad-$h#p``-j!cvB6WbUajJw1qkKA+15;RPxTHU^3VKGa6B}c_*>6kQ!%Dr zu?(L8FpV+_ve;Fy-*`-{*B_0yEQl{L3(3s7i;BK8T=iConA>!)1Gj!hty%KdQ(Db5 zDL<>Ug*8?fIm#;LOhfY(pw)st>RKZZV?Pem?|aIzXvp|*#Il9;zpFzK0*TZPBa-0m zKjt%~3=Lo%^hw-c;vJoxLt)$bSIEhQtI$e{it3tF7Ygfr|1dUXa-6w`G9y~@Q^!P& zU61ra4Zt_DZ{e{qE>vAgcA*~bC*cwFh}$yvhH@@|H8}I(>jVPzE{E1cLw2H>W%v+JdlagM2I#ez~ z=vUs}etzBuZ|k@2Ef7a__G*r5D*0Ey@3o4$e4R^p!-N~IuCWu_$t$_f)^N0c?f4KD zO;tQob6N~!1%8SvW!EkNV(!sMFACX!{m&yCrL~>Z{-gFFKE?a(x=LLB%t`{Jc`OSw zD?_;_02$_!*r!qeNu*2)XK34?*Tb{*8HvDxOBkoAz~3i>5$aKIgV4X8mm_q+f7P3X zI9s`BtvqxW7p6J>0mOk9xnhLJohI|lUypXR;ErK(7;jH-)!|JO1Oksk z556DkO9Ti(;(Qgkq>vr(*?<#&E??Fmz`{%SLtH>weyD1;^^Hs0nO7gId!+@t`<;xg z-WJVSsQ*%$P{G9XblnS_l)>+G3!*{S>Nt+z@-E}UzspeCyyrCiqpGbqIPyVD3rIRH zXkFPlKi$n0lLI=|otD|4NDwR&Icf#?S->6L)oh;tG8QieZ&f|~NYv?<7U5nzC+|L> zl0!!QPiQe?&6WwzGS1NL)qPyf-s($7SHPeKI<|Zv`qxtX0oa$De*Fp?wf->pFe)o0$H-ks$b7_OAU!lKXdvP z|Ly~_`!zX@giM~hC+zDtfKZi@$$5nWP~gKdU^IA}VbKR>i^5$IScKhmn`#n-rDSAf z8P8OI<~52i>FIoh0PrG8$GU;>HgZ5EY_2drae!`2pZqBtnvo}Z-iHpzjfgSq5$vw$ zZ7>!BVdr%B{axOXriJt7llB zP~o#cMSE}@lDtO_IWF5w+~Vw=9336~9_~;XV*)0(l3`iJ_DQfch=!*z#Z{xvaA;i< zso13JD*6s?P7Seno~$AvY}VDG0kXLwDTW1kY{}6j#ue4c#J$~*z)9z0b(M=mIz--7*Qz{34z0KKpP_H^`RgzP*)~}fqw-+`wR8sQF3!>>F{s4eN zA5TeZ39p2jihAKCPn`{HTqOq<63J22NdxKaHGyD;VM&(vrH|y@YLsriMsH_c+4b^H zX~5E0ly0A6sYE@So3R;IL-s;4O*8#5qYQ40725Eo7oLTtySIgx>LS-3l2bTyeOuD( zc6Agd?(__^_*_;s_G16mZ@D0gZuO6HUz}=Yw>i66o2pSl5p?{ig;z^x zR%QxO02;@njQi?oBvZt+djPM2N~ek#pV^ot)b_B73=I%9=jI-S{yIC-?1~TMYP}?x73+s`eBG0NW;CyBoxw;bowc-hU@n}}VfUj0 z*so-{!feTpMc0oILDFJB@JI8r7$70pJgFC8BQoZRzlz?~dHm$$IRzOqsr58@ru!l6 zxApeQaAo}b)~kwRIUpg{XPm)f>r{HB@v^T|9I1%n(4FAHj+*KZD-=TZ{k=C|hlIQz z)9wWL`MMw6TakCNu~NW*?_ie0n1}`O*qPCwAD{@vqUAh-*H@O;^?Sw+%6N>pd7$Q> z*M8gSQ3Khs*ABy_iqXgi z;fJYA(Gi9XFaNb=`o5d1u$x%k0y|uC*NIY%_TVD&^ zhJ4Cd35?4Z0xV~(G=ejUm#=a?AiRfXc4T^9V>iuS_B6))WI(n%Db{&wwl2ksP)-7c zkwC<6;cnFQH3|o$!)5pA4Ji}5Dhs#MSDxoS$=ukaKTjC+Z9lyE8+Q|hVt@H9SHo)J ziXD&Q)@()S`;6%QDdeKRT<5^GE9n)q<7Z$fmfd8O5_m)0nUK>Xd53MDG}T0-lc{zK zxz>T4r9F?E>yu`tlhPcEnq^$QLp`hY9|rE}3bmqRcMc(dcDN}CCbI<~B>Jg~ZGc$yv^YO8R*l}gbS6)X+efn%RSUISFv zxD5E>{ukFRl$&M(hPJim&pSZzErf21=;<)mB$f|l466~4wzFuBYYj*b8D5%)w6s@z znYiZ^$$Sd7XO@Ggi;uf6O*ZYWs~)6E;;gEl9?P5wzMhUL;q>+Iv%a0V`M6iud7>W7 z7ytI80@j!vP-9qYHv5&D)&OYm{U3)#@n8NYylS;MMVbJo45Fp>NBvEs&Kf6MD75WU z4~@zjFjvpFkF(gg?X!-WY@qQgqgX~sB-Y1$HI&(Z+64V`LvPdQ#AE?9rA`H)e5_l_KQ;=z8{q0lPp(zpER>*ylnVhq&brv)cYM&2YVsHU`^>X(B_LXR(sF3u_lelA;Mo7 z<~M#hna7~bUWTh-r%a6z*<+4jZ-9~48AW%y7@|CM5DVu5@!rPeZ1nR0Ob6j1&fFD| zkuLM8t6SI1iFr9OAv5zP1LQ9ACROM)-2Gm=dHbhtRT(6_9;Ml~a&#s+?sHzaIeOQA zT3J$P$7);n34qXX;2mS^gbx6-8m>C|*@By0fej;`#OdgQU|uqQ>62|ef%8@SAI+5xRdPGy7h0Mmc1ovgcr*pK zkw04N$H>6Sg<9L`(LCswuQV6Zfxes)DXDY|nDEFRc+AhqXAe;E2@V$m1Z_*kVV(|p z54$#1m=Wk)rvBqxdOw7_Q!4?FO|Q6ezW%Q=1n*x6ppkGi)!ns#cF0jVYO5{0~1)(7)VVqIqfdlypl6r*cSxHIW zbMBW+09@d?KP11SIX-&ZII*_5xvXrH{xeqYasOtCK2@ZY+qd(Sg_q6?5zMsc0Q%YN zVanJ(29>35E2#J;uD|m0QLmI-lGp2i(nmZJwlg{JUKYH%^1WU*XF3DE6M+v74t8uK zeH^-gqdGG#duwINU_x{Ej|)bu9GAN`4lSi_1RG5b;r-dL7NY|x8*$*}`r2KE=w57O znPdLaBGO{wR!ZtqS~3~Xe(qAk6Vz086Z&R-Ke?b6+jF8R*3im^!KW%o9AaXa6r#gz zBMMa*A=cm2vdU^8DmY907Q!znL_psz;*X zCtJ-aB6iM0AA9vt=fTpt$s$PC?BaV1LVZ%^|u)>?sh-02$V#y3A^R&rF~Q|zKEqsF@Ku&ENjsb7k^ zaqdEDWRSnGZ@|%AnbZe=-2H9Egjn_9@_Pm?aSf@ZbsX#ZYsaR;L``Z&vx6PaQum#5 zwu5mR7MDXE78WH(da9ROTg&cJCVmGY$M1i31RZZH^Ogp{l}`N#iSIxm3hpNnZ!rO> zQPW=yHC9H7GOex-t{ATF3S|b&uC_>|mho3T{(WnZL7dadAiw810y;A|t;sPMo4exM z-xJT-BYhPx4B3h3UD?f&V^3@{tk|@tbqk<8ajPmQO~-A?y$ab5Gd@zboO!`un(vx+ z+Q4$?6rQ=oBD$H_!qf3_DqlP=Zg0R8{ppzs($mB}A3vPG^Ap94eUX zJuMwSJW2;O-w<;jaI3!V|LoXUL*M>s$OOG^Ipb83o|V=KOvwMlLf)5BDgEW7Ht5|= za>o#X+=Z?2))HrR#*OJa63$P@a)ksQvi=(pY9FJel%S_?HvOsbQ_s)P1&<%BsyD~_ z;wL@R@Qd;j=#NW%$?y^(1DchInyw%3WlgmC2f%@eO?lz-vYWJ9ky%e1ZAAqh87e1Z z(P^yAtk>o#55!OMx5D}!cjo6k@JID$_Zr6j)Cxk|8+~XE;G2`o;$UApg$<-(%v^o6 zPJHR91xp+0b;|ADFlS7;C`-L`(gWTGG!wsXQ8nFD$c*0iDwSHO zX+JV~w?0oBr5@GokS8W%Zr;)*R+aTn9u(?f{-(X z>=a1#;z2%Jj3$MI=O@eQsbsP>JMzP(!1O0Fl5}?QLAZnGHtR{&0GBkU)8C zd7b^`og7bVvpT|tr@|_{8X8`svq+!X(A}Q7)M{{PKMniZTTt_-rzD;rS>dsuk;N9S z4J6<>dq_P9tj9O(GUa+;b?JFGf7b+@$9;%U6jv9|7Ol6835x%H)ba3yDZ9UdfbEMz z`P|>h_?zIR;5&cLZ0GT*nh)5UF5%KF;5D_zJ(rXG&5R<|$h2P`c|MKFb?5{x$QgLg z1{N-e(x$pNxZIEgQ>UP2@w@i9>fvZ7xS@1SFqPl*RG-x9;K=l}a zyO77l!x_ia;^H3CNp+-O)4HoMr*y7@1TBNn+KScmDj5;l_p~U(Kqp@c{8!=?{HAC6q~?~Bq`>UzIfvRZ(FcT<4E;@Cp;^&dnsHWszjDM? zll;hp&R<==Vu6k$^VpE5^Qt#9)SJ*ymNQ!gwBFB#gBSZBU7>Hw#v~KIv^JhjS1iCS zW;fSE7kRuu%2HhjWD=X&k@RRfel__;735+)&!?JbuD=T}kupe_bkZz*o9NA-*&{*` zn_isH&c{#E8Ee($52<|5cll4uFo#0|kK;P!N3Ilbb)|KV`!7_Yb;MQw1YrCIkMUH=;*HvL{>P3(~GUlw2aJWQ&I zLN@ydo+F1Zf+E0Amk`EEfV2GjOjpnAyZ@F=R~Q2aV#=_!Dd6GL`zCbE|CF~jM1ceb zD&Tlc@h7{kOSXI(SNojJvvvhF(kwVcDPk z#Nd4>=N7`u2T+{EJpOayQzt{SY+2DKDy1VmM>*>gi>MA%b0IAaa2LpF z%#_KOyn4yo!$1V0=A!*9aFZI;V?xrhVrWcM=@#Drw-DHq3a71Kom^E>?`&ux7x|BfMIc)kf(F66#bpv zx~1_4CSQ=XjhNPSj_v4$MTyj#8w*>zzglLKXlVaC7BM$)PNb}a%I0|>mjDpC`x_G3 zf;_qX>i__H0DTc;pUr^y7vJ!EI5{&jI(iT>0%76x69Qp=e59twJ)TzWSr&(_=m{Zx z=B`Q)TyHGZGmLt$Y&VP;q)clPjq`4bw#j(L!kf?=Y0|)TKaJbsb(K@}^(eGbj+zR) zdBizrJCc<0nm%KoFfZ+8?F{htB)B+gvrAe}pJTa@X%ns%w{0_%-Xnk|s>qL|@-sxZ zyfo+K=R7;;{oXx-UgMVh`w%${J_6hdDYO=A>TQ?m)h>5o)lWobWfNgE*23J^YRzp8WKR^gw`rwMiRi*Mf>j&vJbsTs&t> zIx&^?b0V$SaP!&2dLEQVYF7#1qN$cue1srN%st2DP|oArg8)f3$`kRHU*bI<1>nR6 zKrnp&m%sK7VLt~x{i{?mO;}CMy}-3MIpTgGkV<|_4ZyH3KIjzvgAFRlWz2B76fP-X z>4l%tRlh;FGfaJ@(6^NN!C4dy(LQN=QkiJ#4&8YOGaY>+ zzh6*($_f^kUNo*#+4^m01Zznn2`1^ly{?m8ZtmKB=D(m9o8jX3z60B-qVk5QL3Vjc z&Fz^#DP+=9Lt4+6Pec4qwg27bvO<^$^2KNfZf+ zyWoZ|mi&?=Qke&gVwEZphs(c=t~*pqTox3ZVx^^_iBUDA0Su;oqYO*WlJv!ZOHV<& zAK{En(U%Zpt6cXaS$gVfu_Q12O9cZ3Z18(^vNt7J@^UZDL)au5u_TWErS0(R=;Y?j zSYUmb*a5$t@ARwtu2WV_*rmklFaOk{AjOhbcK(0B+}8d7ecHI9#=h(gt`ren?es0L zCY@;<^bP0n`htxCF!)~g7RavJ_+xLN8X3KsF=PM+zr(j&jtCXvneZ(G2{0EfmJ=|z z>XlusZHnwoO30GZ6*O2(N&WO4=j0;C_C_=W?HO=Bs-itFxp_z0<*|b;jql!aug7qc zlg!^fE3gEk6{L%&Gop_)dvMazq63!@YOehiA)7bC#a4i&Qdhh34g0QUm3?_^)8c)B zn_S!SO(D2*y;|kfA7B7%6?O9+`bOb!pt9~5mhLl$hg{q7Pu2{l=-;AB7gcLYBGjg1 zR-qMo2GU?%$$=kg7Y`+%F@))0Ap%sI`ftc^yZzgXA<;-8_gzyzMgN&D3E6bp71kPW zJmSMATK#lq291A;8q2#i*|Px$4XVQ1#{jyFuyeH__7dXH6RuDan!+^IxYZ0etkFhV zgW;x?G|0tsYLdq2^S}=yY-1HoNZ{aM^-${c6Mz(H=uB67V!KJp?gi0*RAy*_pgO3! zP5s+?eHgVj`H9Bn&b_`f0LrZuPJXNIT4GO2V`p4-dgZIVwPvY*zs&ETjR0?i9rDS} z^A{W@F=nzL!8h)VJ$#vK+s&FUA-d}X2|6HIaw%k2@r~B|fS#?n?WstjIx__ZPB6UTYc;=>-=op!b-in^=%3A! za0BK*M`Ry>RuP2{YqNgFrMraWSbv`w3VSi8o}rrQ{Exc4F;R+EV?_a1$k}BYlX6HR z&c259^1a92?0tR-$|{Ld$c>KT5LOX=JxmEmPDRkX=dk+CsQ&_;5OIE~?0>RAuVZ>g zWqZ?q+^D*Ij;Z)yfp9?zB(d~T$?i^g^{u+K2iNxA70e)w9w6XH8Yj=EwuL+U-d@y- z8agP!=ekhNSvwRbWCEN?DBHEtTEciGvdx73QnU$Zi-!bzb*=PEH?XeOKtw=Mb0sq! zhl@^|;>b}V9QaG2UxMabI$WXLPFGzV6^z#EztT$uPDNg;PvmOw!O>9cqpM%cOn!Qs z+;{Nd6GezDA6GGACy6W2-*b#XJRven#2X)V^wnWAjfd`X<4@9G(_V7s=%|m*2jYg2 zK}|9=4)vIwnG_*_4)l{}KV>+wY zU5pU-Zj2{!1c~Gwci%;f5xPP<saipQwY=Pbt*Is4U z_y1)&atBpvVGS2|DvG!9(&xyxE9;3|)7{pjTOwgBV|wJ*r^jMg6G3Z^MjYv6L{nKt zTrGBN+K{V(>K70Pb+or4Y$czwD?^Q?7y4zSe zJ9P{o84oYEA5P!B+D$R~9_P9cq9XX`)E7jd;-mZdYGrR)Wy?xl>fC9v)rd^|tdv2U z4n7PtcVZBex9=p18ja$z>l>0TvgKSh56T??k8B~QoXs?&>qTZz969vWdBgyWLpS8n z?O9Hqh+*w2U{`Ydy+WS?_82SmgmwP%1#tzQTGs zov>;A3koaDLQ@ZxyD3uJu2(O*()9dHDs?2hvoLf9u)Fu-Y_l%JbWEosX3}wC;$TYT zEvZ-y?m=X8@9%j}13t@)i;R!I6nd!K{|ElNur^)4yvH<4D~p~oB5i@@lspgq-^VMd zhf9}dGP2x8o!T_wY@f(=WaX4fJnj445^jmlPJ#vd=cIly`c!J(F0vOzxtsUWadfT8 z`;*}5<3ukXaGj=M>()1HzD&g2g`(xnmYku90DNc$`+}}<{{n5n7s;eJ1&+$TM8*v` zL56ZIVcTtYJW~nJ^1?cBFDJ1n&kX>k6XyM@QtE$*PGXS#Ya6(IYNezZ#l$74Pj96$ z2y&|L6+au^mduwVAPNKDvT=6RPne1?TcLo#`5tx6SoHH&!h{Me=w#pW4}UA23_ zk@>BsIBC;5xgaon*8LU@kh20hS&rL1alVH#I}ymsfCopdxuZ@#iTc&ZBaAor{wS7n zb!EV({{X@ApBOMsP`AdpQxMXbwa>@TSQ!O%qLC{RG6_hky3;ia(Q@n1a_dldJr?n*PlfVjf*W0AzmWYMX_PCK%lpdLedX zS5*Ek4;W{~e>U#_x#IWTp}@U{3_PscclLyN)Vr}sXd1EkKNdS@y?l38mAx8!{B)4p^(p13+b#wpq+aET>&oEfOC__AUbE}ijt@p59Iq|_3- ztK4PlDBx@(zs&Xj^;JE?Arv&f7{v1yI3##6+&CKq2cBZC7rndge}1fcJ90FFI?vu2 z|KC1o{%;;s|BpWY0LcEyZX^DW9H9SkvJh|+^Vg?AMO45i!7`C@!1?E2^mo^YfzO~u z0zH=VANon&9iM+b6ObPvJOAQAm?L-o`H|u}h7kDtQ^n-&;MfcoJCD)si%E~Y<36OU z;Qh}1Wt-97<1g+&@)1k?!*AbY7(zMjzyq|yZ@)42%@VsW_-pPcL@|znAV?Z$HOQN* zLu$~?u|D+WM2qvT|E6OMU%118?<}vrp`bE7Cc`gK)IW+SqF(jPe&i7)(7jqURMFYu z_h)97lCSFwLIkMgnveUm^mC3jTZzk3#I{7@S7ZiZjVz5$SOAx4yb+E?^9$tY$*#@8 z$O&%IzmXhU9Z_q}Vp+A7r_My?X*u%lQ3n;EVl@8K99abX*LzOXb!HYak*6Z=$!k!<5+ znZzKJY%dszohHAYNe8->?HI<3us zGUa?f`s0;!ZBvTHc;6hYcM4V+D=H}os@TfrFk#Q{I4cN69zzbEsmJ?`5b3e}#lI#u zta`++r84z=2#!sz?`N3EjRZ64`bZcX(~~(?&sN*5fI2(h9O`=4e7&7G>3ov3-5wlQ zq}y0qu0=lPdxjItCr`#G0@*j1yUlds0fR9FXUm1Mo35D;Ea+xILy0ZQt+c{e=EGdx zkPTPc5U~jy%d?`}k+%1c@R4j&Z3_lWj?C&Cryo+jg3#G9W>k;A-u~EFUX4*RzbsUQ z{V*90p06e#xK2rpISbgc!@v1#(eEBPWQ=c9HTcjKttl75`)LcHdSVzcz%4q!dp(oh zm}4CF8bpgVk-2aH{McK=`M$(Vq`cu}Bj0jXTQYKMlO1%cvi9CKpW#eOY+$bnWafY3e;T~Kg*URd(=@??s%BkQG+}Hm;`V(^JL~(=p%L5BMXNuB6J@)g^*-zHJ z>7PZQ(Xl*J?cSDzvY5j*cpklAW2-zs&4^X){t)c6Hj;3{WZ)Bg=^AiJ`tz^4M_0tn z>tk7cxAeXoTLlQPV}9u1#n!s*&~l72kRL%%g_*Q@J4u~z-+~<;cZPu`JQkRSuV(v$HEd|Q%7O1yhT9^l1 z($`9K+_?_rC=Q_kvh#bZr&-!}{tA70lrJ}ThSK=CHv0HgY_SYxFTjs_Y~#&V)+%qq z6O4ezA(YnJcAacs(Wq*-dgmKf!J29!XLoVt#%<84#m;)esviA883a_RFg#H#r_O67 zD*E|xys%3kXvhH81+H7zkVUm4oKK2KJpTGB@3+hMTwxH#Qi>Jc(23h<_9p>&dY?@7 zkS0HZj1dxusGb!KLZ3h08%`ClJIk9Hj6B}RlyVs{HW`FBbp7_}nq)CQ+FDJUZ$rXf z_VF3t@ml}fRx&Q?u-ebYBL=2B`v{%Ss5)Y*{51>yI0I-c0vpu;<+d^l+h$-ypE(e7)pWS)xa%L)d+04+b zc&2FK$L%a;80J(2ALSs*kZM?>kdjka&H8O-U5KO@u=j3U?DqVqF-XPsn?N}a>%-;Q zD5Gv@WS!ONHCFnpeh5)Bmf-8NBddU3ABB1N!yC>cf>1wyMQsjZE6@P~&M<;rE)2-n z@$sUwVDj@W*M)5wgdYPpyx;@;b%<@>??FKO_(0_5x>D3u>}iS7JtU>R6YS`!H!(rY zTn}cKDNJCNo+0sIvlR(dhgY4n+q(0PfKvS9eCDh_nMsO-SOQR9)%HllIs|Sw!~Yx_=2KOA*5HEhzMvC zzbczXRV~!l?=jE&KjxEV@tCdjOU|7dGVJt zN~{TcW8c@Ry~zu*JUs@k<>`sqUzcp5KmA}$c%SrNUFv6BGv4ySTrq{vodk=tuDr`# zSm15tABr3Jy1w5#hIDe)tSD`GdQfecCrFElz$Y?&9Er22KUfnAJgm0eXGqk`YH=P4 zM1qgTqY>FJPtti_MVPi31eW|t1HD{#&@ftq9M7$Ta_U>gdI}jbT;@hRcf$KX@D3w- zxbLk7bnezw#+3qtQN+Oa(hQR@ouo%rxS7BRb>`ZvQ3~UU-;CUJ;tsvvTwJm( zxZKUG=~3PD zZ7w9m7$8H3p3Sv~fxy0FSNKglWqjc~L%;4Btr&TMG@dsFG3+k?GRwC*RWo*#Npm_r z5Hp1cnEcijl!mdOKLpqxEQN!Y%3KstwKJ!~X=iL6D<54zYm*?G0A`|F6o7H4(OQ7r)KRT0Feo`|fyO zq-gX6`YAdji@o2qkiJiD^la|F)M&$Mz`PG_*Rf}+ulW0kL{kA7|IMcK665phs(;3aIY-4njAQctjYpfPXc&o2Is_DQ} z&cj#_R(mOaz*jRi08%}3z#0>E%R5sP|fh`7d~IID~~YS z5@XSh#%WjZhIP^zNF)Qga)c8XE*SRebY_(9p-FLP{r0LkN%r)gJ(@;Cta{p)f{fSf ziw^c-b~UwmVzg64^`ZmaQghGowSQxF%(ke|{0&Gg7$HAGFLNEEO|BeJb_qBThLT>0 z6*5nLWDL+Ogz_)`qky4aF1{~Wu;(&S(A|4xJS^8Soq!a^6X}6@-wUm|L@@;CKtGvU zw7gPKy-slH%7i}lmS`zRIY5tC@1F{@pWgkiPb!R%1-S>m{0#YzhR%D^OH!S`NBHlB zxTze#%;rBi(J;k&PmACgWp`39*?;uamIkB8*MMe_tW_IxX2J!Wh6OOkYM^?Zoo`RI zwfA&(_LTMfs5AbFcGY0Sh`2a2udU0xnxX#|>2OshNi%tHu(7rHjbpU=`^Ns81S^+; zzW-}3-yNIwwB$fBbZHB#m6=&twYla4QO$Aj^$lgSmef7*8&ste*1s|soAR_Vq!!K@ zNpJJ#jC{GnNPS65TN3$Yh1%LBj>13mkPyuLw@FJe9%-oD0l(sw6%<_PollD5e>~gU z18Xex9iWQ<{1AI06&0(Cj{?85)BM=2g6hx5Ql&N3W%yXMF^&TFolNAYYB#6K`moOf zR^|uU-_vEd0+5cxCo07e5$3=i3s)3X3^rhVd&o%rjs{v&Rgwth1^=EptD~ZA*QG4Y z=h0(qr<&p{)T|U#2cNhO^-e6Swdl;%nBJ-Ff;e}7d@(gLD+}-Ez&f9fz2&g8nVk?C ze_w1N@vJ||Rm1xjGe}f2L7V1KJh(A^r@$01E6%|vdYVk;=Zd= zSHkD=+ohxm8n&x9EH!nU9madhf0YqGp6=*6Ub>AD0&50Viz#m)O?0YQa$wbfsiP(M zdn#|quGN^PyGFl!R1jK2eOLY3r}01&zU)_2 z00|x2sAWMMkr^u08_Jzq$zhd%Qr(A)C!Nkk?3;=`ApG*Qw?2SCi4=eu2x;mVxgyEP=geV}BE)7wulh?(5U+Ffi6- zJ-nKJ6f-I&z45TOshLjYH23qv;Eqivre-Gf=Rdj0nxyI{X_8rWt-D+t&2l$Kj~M-I zfV52fFPTkkTTLPYmVdWd0a+cI9m!JvL7-V9zB;C<$y!kJU4=HrFA`89Hn)Y=%uGr7 z$hG=#QPZC2HK+!%mvTO&IU>4Ge@&%$78j6&Gc(Mm%A7RI-hbtR0T=^06|O zaeQ|iB>gXOX(|%zeU-&j^<(UNp!tU?L05Fum8PZAMdX@ zUf=eZKcMu=Ew2Aqi|>d$8u?J0CqsW&;a6b?*LAtGAS~lhJ{#}lpTW`yMrN52K68p?OXwk~4%g{83ZkLF&Zj}1zc&~lBY;CSD*&_!w zUj^fXcq{d#wvJk84)kbX{p<@J5>M%oF~!cRChw$Yt?sVzI%A6DsK#Qq6egLZR92tyf@9O-n`f}UZP9v*0!P`?_EWCJYL(|o**m?cu*>B%YmUG0n zz5Rj+Z#wMm=gGZ2kB@u8&Y=&lz1+~tHLY7aIQYeDkZ{ht1j?3P1ERj*8SxmLDno2b zZe(KnJ1cOB!&?R(`IatVp6QeWvWevXmgsi1Qz}a+DD!~z3Poxhb+bndg;CkS;?+WD zj=Ub>e789=khA6UZ|T|T0Uj#rJW(^rnc+SCeS-rJ!zHUckeCGh!o@`L28M)W^ORMq z8BZ0qfa$DwPfuZKi$imDwbSX37{bvyjx5%&_53J|AlZqj^np2xz`%e;;|&aTHN5QBE;F$n*kp+XBU0}4q;gA>!Q`f#RubQpkq^KHe7YIZMjY|6c0{Tn ze`|=h(Z{ZXvSMFnd};xcQr4q!>|R>|V3vl8?1#mzs8qKcjLU}dG=ibC4`jF2$lfUQX(*ZH36;_XdwW?ZHGJ#(_>NmvYP#KJ=qjZDVY0nK z*0NfBWvltXHJSL2wUs}l){w9O8JV<31Yx$&-?AB8Xu6B7jy9+41?9hOUIIBC=Ej&cvN`mu-9GKpB|Rh!*T(J3DZ;rh%RIXjX)hj= zt1pQEqkK3$Mo0oE&v5TRX@u;_t6VvkJmW;qv!) zOTbYF6?$bSFqUp!T6%c@%uiVO)KMj9HtxgCUS~FRQ+|Ze?wX`8_;~pKQ}yfT2RK@> zHLLs9$i}d<0sBHZ;O(TcQtu34gj{27y>Ev|pQwD^?kBHx@VP+u(Y8q+r}k-WMYW=L z1t>f9-Me>fZHks`*IstB^>qRlE^IyYDts#UL1D|-B4Tb41pC<_{A>5s_j^ligVdmd zY=?mlzWO%!Lo!?*buSh z514*wWTG>$6}H`)h%y82|DJe~ox3f4I;MJxNi8e}l46*OmZt(CN=ZUz`Te_j5M!HG z<+&4N-WxfZUmG>0^w#WDHWG1>$K+)>Psv_t;?z24bpTf-GVi0(NY`}larvlGfE8dk z;^SJH1GG1{d)sGMySiQF=72nCWR+DHkpJsez;o_RBbtmaO~n(RK=Dh{v?wwj-uqjY z#STzB)^7g3O#-pQ&_eUD?4t+2=AW>%r(yY^Z)KLGcy;FD58BAUSL-T9HqbcZ{`uU9 z?I(|!ZeSBkeyg>sCJ7uI%nr@|+91p1e}w;@-4X;ydq3xzm2)?&p{2vAak;oi?`$Yn zZ9-9j0l%6}8g-4?i@}Ro0;Yh8@{fCDYdaFWI>YeF&(H6RZ$m~c+MBfZ|Ecc1qng^j zc3~71g#(C)NLLY1K~U)}L21&ZinsuHrB~)im}_Pmku< za9292Wu$0zwE`%arE-_}R3lL<#!@e(7ZsZf^Kfl?Bu_t}pP|ZaaH7T)&A@LSR}m0K zI2ZipS^Hh$G2qO~#YxJ&)$*SEm*v<1Llt-iIb2;dJ>c0}G^u^Epm8`?iXHwSk3E1v z#vck&Q4ZWd(Ae327-`SFk*u3<>6ao*mvxQZ*XANFfpBq;wVe^i;14&sXl*|L9L1Ln zw!S8Q36pq!JD6bPfj%)s@EfqSJ*kaud-g4$BEOIK4c+MIXqj{>L0B6M^YXIc?@`jY zMcZIqnZy{Uq)Y;;i=V#F720%CgQXZ_+f*Aoc1_MpjVNoQzh;acghUk; z4fZPDWIrCK+`BSr4%Lf=clr1~=`VWuVy_^a4wqxvd>JJC)JQJugR7|5>Sr%zsf;Is zh9|Jc)Dy+R1Snbm_)>sM&3>v3rEKv6yuRbd6-gLdw;B4C$}9XZECpVvTqrl%f}`&; zhEnR^cVs9*{aTOiu>88ey*M0ul9&#-PmF)e+0mdgics!vN0%(fy?XVk5k_)QFzkuB zuG>2jm8&nHqpK?pG`DYrlUalI?-^l#+1o1$pnVZ z4<2;jCxi4@9%iuV#aHq@Xy&EBS6PM%5{oQRH)A8dv;+~dwcZLh@oymy?QBx-07eX<5!(TGdDG~=w-pjSYmC29r*65Gnx#s%023#Crxjmg) zlClkIvji7!8Fm{_*90f2GpSeJySwg3QV5B=(Tf|Vrr2;V6&}knJ!q@`653nw@K6taBw!)N!>I0^@nD&mmK1U+?+>K_e4uWnw(k-JY$|gO6MP zbhZ=!G+Uc%nW@%!`J9KQ$I+UGUcjjZT5s20vF{6k*x3@(GL`2G!l;B~lQ-Lz;&~2V3oDSG+Mk}d2eVepRbQ;A|$ zKV(YqSnAZfbZU-O8P=#m8j%vi!uG($wv%sE-@z!{QS`xbptRt-j0(pC2hprFU7Kf zPq}2saiAgifxX#M3FBx_yA(GN6c_pCK?FaS!dxw9V*Ltpc4#*8rl-7r%pi0g{hj|!K3Vpf|x6@g^GCnd&P?t$4DxkS>BVLg!X{zCMw0v@S zla;N6qj06(M?+p7p84$_Fg-Q(m2@r9a?37O35UnZJ%NNhBhsO$#jCosjYJTER3>*%Os}CL@H9 zYYvxt+g%IM8`84YKL(Icr&c-T92{=7-!S|g`v87zQU5JW=hqxm&IGzK@^0MiC?U^L z1M5R0XF=7)7Q6N5rnQp+??d^8q1OVZTeE9IPX&o!%+nRi?y&)Z?0h$FW!S1GMb>@e zae{g(R$}lU*Ys&@i#EJ~j{_&%euo#=IpwN18|(IJ%Oc*&U3Zs~UTtYLDbJ<&=1pTn zNXHY^*xu@su+!siohtGJs2sH{|PU5dnVz)<~ex zy!(S_p%;FAuG8o9=Z_z6m35zvyctXX6DCGJ%--iaD3zv?(iN3DiKWqMYg3Kb_w4lQ zD!M*AO=Ntv9fil|E1{BM7`vjRL}H+{HYb;fKtp`m@ls`I5m3B8b-|ht47ez^?J*NF zrH;F8nl3h;C)VD!Kij%$HC4PeSYTKe0NP2|yqU`$-X&M7lAGhQTL@_#Zz|2PS{%(i z_r8o}GdG^Lg%4lnj(_MROFN$plg&nAcS7>-wBw2y9}!MmtF>^YsI*C?`?1znpf5ksR3GoC6yiz>LtSLOlU62hGoztG2r7w04`FH7f3 z^z%pVSb!Hjh2^zRD_!N{n3-~zimeFUE4SgTADHOrL8zERnAM1BLebC8Q2Cm$-YR|c zZq9sf?r>L_UNKi#vc5-lq^G!j#->JY=8Ku&F>+n<>l=C!u1mykN6_AINq6lBDdEaf)U8edOV{ub`cFQgU?^$0b4QD-Bm5-kT>qd>xMv zKc!&8o*OnglM`rPgK6)n2CrBuql{u&lB9c*oRvp)V#qo6?LG5o(CNfE6@9D-_TdB` zen>n}xx3p%DknrpLokLU`*ld-@I=+4Me?_@#=*rx3`keMwKg!b(PLw7zY$InphXK? zwJixPaZLzUN@{!}4b#NMBlJ@|dW_-AC9)(@OWmG=n4WvrF&~r~F4Z5pnlp9+1^)Z6R#O^91nc@CB}g(N9BPqJI=&=4 z%WS3@YoRKLpxb#_`=dNu?6})^@y#0Z^i$PKsoxn|BuXJcxT!vI9Ii&?2=l zg6%0cAn0^QV?j3sVF{%bg8E)&Hy|gnR!TqGiq;f2Xbk-5Y%EV_{sKWoNyQ9%PZgZ) z=rg4C#?5;Bmo)4FrXTTJHVvml4t<-A!^ZRPCd_(sJhvP%rP+gORzSeFf z9^spk{*v82>I6>}=2XtarPBh=Uz?izfDhq~UgtnfovBz>?o?4*hdm9!lS~~IF$seXZm#OAfo{5-KUO3Q~ z<>$bKm>ohJ(|(L^`xQJo6_6gKUT7U&8%Zuq@`B6Eg16%vVV_>A46j3l8fxmDXczA) z!(gVnNVWW7(q-#>#7O|YJ_5LDYlye5T;~%xWYc^s_F6A_l1jVL_no87KxEt;BRs$| zIX88l*oz*_LsLFPdP`onVn2!t7{Jp)E_$XrZhNP_3i`H2AiX8v1>#0~NeuqpaycjBt-M-!N%}5Ic2IRT;`S+1-^XqD}2Vl?PK{CQKJ3_JxZU+TlNd3e&vsct8VmU z=>E(yDaoerk zN-$Vn1p&C)vi20^(o}<&x3`Ru?TMcb{s*m}WQS5Xq1GtjeNC~gz)P<+tmtRgivMw}rRJWi6=O~M#VFDABNyBLDvUX>>h$d~W z0?UHU{pg=zCFUX6!q8Z)4g~b&`5!T~oJFeunBKV9W5@UBPwpiRjzdzz)O%)?poe#| zZwKZ@xX7+?g6ilqkkjpLY4F2CyI!m6JI@kWWEx#{<+p~(#vk`t7nKh!=XLmYYl>#$=skBp!sQL8kms%=n^KLm)jcq(Ee?~(2Ez>&{`9>I~GZ~0o|?D-|;px zXpgxKLb&WM&n?9P1mY!@rRLb0!Up7`&teQzwz~ik`H$68xxHU{*u_*_DB%k6yum9h z1Qr**KGWO{9TwiQ5XZkfoKf{wvV*0pu6KXY6e|{Qo?BRKDWd;aBD!zFs(TU+%uZ#{ z@W8e4dtRfc=T08L#prf61=6=C^2qYl&V!TR|FPr=A+luR;k=Zgh_Y z<_YOtWnMVpPCv%d1v7h`K|`sh{qg#J_Gca?q4!|orj23hub0tvE-}S`T$vei|Rkd%Lye64~Tx+PPvc>X~tsu3rMW^-nrOrMRDpQrtbv+*13%a=GnVv_3!Mw;btV1 zghl4$stnvOvAmiDk%iC3o-aFbk@^oi0KyC-32s2og5B&xg)4sT?-cEld%w0vl@-nO zS$>_N$8=`G>^f@aUVB^SYAfm5RQZ=w|A037lgb8PQ=;U!K}M0Rl&0+2Oi!*a z6h#_@%BcRdb!pC> z-=;FXCDo~O#@%Vk@iegeqy%$Fb$$9gOcg+*?|qpp=%Xk8ANEgygawlmuS~_x%T|^bSKvI zhMktoL$?`&vVOX|s!Of3-n>bwPcO{u;#}>j4m>-OZSPi+7X9x8k~gXRk}%yhK49wm z5+WlFUy?r75eZTwwc^i1Hw#z#-0$Sy4Hvn5@cCeBXP=N4R1A z`ODXxI7Y>cXWFTDSr*YQm06j{)qZE8m4#HL>xxcOd5v>9rI{d0=$23%Kydgy;4#+i zxV#%8f(guTh%fO3+=k;XR)@W+IFPZb7Z~zyr+dX~t&dMM1ORyq{#G-~kCR?GTKbKd zYqiO{c6^IiF&ZEB)RJHgly`Zgcb|&Cpzok}Zl@xvHx}z&mBjVoN<*nsn)PHvxUfZ5 zX}qRckR=`2evP!mLGUK+%3GC4ztX@d(^($>{qcr!;z~ok@86J}XblIBBX8aLo@m^1 z%DsjlVvRxDEmib^hImpp5bS*&O(o|Pj|vASU;UWrb>3w>RBTF=8a2oO8iW!b+dGSy zhAodgt{G{RoM+a_S2=4s2xi1LVaa(i{925cFf_4Q+vSN~^dqo9QoWp~d3K|5?`!w6 z(|@DD>gRE#9V?M~=hJ*_^F|tPk1CWxOti`KE7e!CsQ@C`=?_E48%B7T1HQ_{aQQlz z?Zz%b9Jb1AI4FJ^NMpIHuKu0)g@5>^^t<;NJI2T4D1U$4x^&ubpee-F=M>qJ3A>q- z^U6un{ThrJH0ln5SAJ4A%*VMwQ*(XR&l{Awh~K4^%P4Gr^UUEYnaI5vsB7~*2pic& zRXkBxBqIcWF^JINnqnjZd+C5LL6j_$imV8~_it8d)Gp#Gcx}nY`n>++XzY&} zy~&|$@@vF-L{?(_$L#E|o}vwbm<1vDhKw%gwL)usDBI;|N;a>-JcHs-4NzRi`T4qQ z$Jgld!U->wiH6m*GVk9S&Mop`pPSF$npqky_>dkzefDUc^5+7bu?%g#yA%c~tl=4l zPL%-CmRetXyk&YYJI~FMo%7SuU~3{GQs5`pdc^tz)HQf@okZp#sebj%nQLBWpS!1T zBka+XpLpg)nfeQpy)O}o4Pc)-0y5 z{#ciOq;g)HJYeH@Kgp2Rik>0^dFH;VYE(ZScg*=eQX#U82eAXW^k=GkPplogfA!q? zNQ&9p8zdf=sRV1?$=cS{fhfJGGtcRQH~yVK0o=vcr~f#VO@swc?*bC z$s9dew}Pzq5Pl1qK}25VY4dsa5)@E=xMfdNMqs<+1gfBeH|TDC8- z3_veWWWZjjKU1exS&{!4AwU>Wx%Kq$wrirnV#&1TkAKdY-^;PKgYs#LA zV)j$&9W3X6f0}<1ayBv#L&J9H_q2aN96pl6MWn23zK>{UD!miG&-C7OP^*@RE6K*< zH{IMeUiM-An7jlPrXz)Fk!AV*wsne&GdkHS=`@LYwpBB%)NfU^-}QZ;E}SELFbGd} zQ^+g|33*g^QeE0PFg!uUtzmS4o2cI00ds z_v9wOA+~DA$=H9*0;6Sgi^Fo#hT8By}p%;P0qJ+#NNkVUR{DjEe0cI!Q`f8X5 zX4@Wx_pT{JL^n_o+f1K!X99IIli!!bq5v^50STLcQb^r!I-%XDuEU7nq8;6JF*(>Q zH3L!doge^oRxN7npl|BF6oJR=;aE9RYhc%ulK9u!qB$Biz)=wq$?D~)jqnT?HJzB0 z#UQua6$$sjn>$`Etl#&jd3fF#2kyDkpQ&Z(!JD*C`eCUgMkL*b?E7pU+f-YIAhOb^ zXS;8%4fpm<^)*z*Yx#vo(@)Jy&Merg&*TS#kORxZ->y}L*}cbBY^%S{q7i1>QaTre*+GYm7tf} z+FmKco2oXf(`&0iZvxZ^fIdDt13(kJu5d`TPwcQqX7Mo<8R5)WtKu=xRAocrsV;B_ z*Q9?aLDpw&ygK^TsUw=_BA)S3M;WCE4~+Pj%X%|{bkgY5HgxZqVTV`x&M2u@B?V|o zrpR{=wzskm*TPyUbH11LA&$CFgB=T{M~wEN>}DH*m;!2K%8%Ctj~oPc>jKG0@68=p zccp%@fWSyz&;A?oH~ti@J(LK}UuW1XO9)@Nk&?KxTCCLY8Hi->AH_UCxb1VL!;6CQ z)L-{C=83ZDup@N~L~TFg++W!M6lv71^p8i&EC4Ehoxk?71OmPas`gN%lt`#KS%my@utOfK zo0`I=sK%)B41-q|MqNiO^g{8T6b0Rb!>j6^!hh@^kf)(xcd)O$ioIl(ZhEELVHsfO z3NGE|0+vv2zV@vA3$xyak5^gd*DXjo5{IOE>|=Mf8opgy*+15I*L<=24Cdeq9~Uj_EmH5~`7))G z!P*SkDpxt&oGT2QjF=hQGuE@3(cz)~sT3do*#bxW$1lN91wXNA`70S|*Y%OpN$e&I z_}Lh9QeLVv@t~V0+LKr(J!s7!;;~7piQTlY&*=T{SW3t+6hjpKjk=T&%E_lDf*y6x*Dfux@PAJpJ%f zS>Pcj~m9{NjUz{@hdeiJmyW*O1ExDt_s+kaQ+ z$U{7Fy;|JOdA(*|tXl<%%*l2du4D`F6n+2dMtHmGp0%ZH>y%e!f`2mtZ1+RzF?nr! zfX!V?LNn0YA}UjG-Bk2sDp0F1Gqbjc{a`b}_jitJDRl<&#{KUAlwmfbrL|ks?>KH+ zmM5orP}!7Noub^jevJd_tP1R#__0Gqy4JLL>G3)PC(ioB)stzI`{w2i^;DtsJH_9U z5MT?f6C6#tPrC)qSOXzA-mZ6(MEX7oYZs@tpYm9UJA^Rlo&9f{>oO*h)&U8ezwzH^ zL{IVQ-ruQ4Pni^;`jPK}jFQl0QM!$q7G|DJYE%;KkWR z9H)pOt`niYsq-uU(=`KztNG)$s!cgJy}Bh6WB!7y+R*;Jv40MgpP@to=%Q?j7OHPv za^inW;TJ~4B!S_h^zr#e1V2-bfqXsZ+04<-gVr}9ob{MV{Y8}vKa-7q)gS!Qbel?~ zR_lG-Fa&_f95sw_s(X$ zM{8VA-G35+Tkh4=F3F^8UYuK8yvoUHSZH0S|8CTos zB}g80Pk;aH2D7rHYveaXzI4C$gVDNDp$lG@R~&!*O*vx5`AyKSP#Y0q+Z^tL5s%0C zo$2Mwzj+sD(OQl&OwNT6`O9@LTooGk&@oDFG68$9!q=~t=`&-!TumN+?wzM%>%nP_ z6w(!IzNKE@9w2vAiiTz~vM}Y=1wSXta}2@?&?W`+ymDSyRVPsK9I^!nDg1q^E@Gor zo$IK>U^Q4?j!5P)#O~^n7IdJuj*W3w^5h{`mkgmOukeG^DV(S`PM=OMCH#Ef;WLhL zEnMP?I!?%}KJN|J=a0`L2IJBQWtna`{aBC2A=>Avmh;OF46O%?D_aHBDEks&6jda1 zfsnMPAsP-}YngF+B$9TWpBl9LqN;Ubzzv-p>kl7n!ClmAtkvWCP76$sR3K!51bQStv(fr2D+aOU0u+A4*N`mdB2lZH08I(a^1p?oE)~G@#S?6nCwL zNdwf_M}4Z4B}R!I!~IXtP_6!{!UsR!Ok5A*Dq{@gTg1l_Ip3D;sKOBU>Q+DJCoyIE zHnoBqxEnjnVyi8_r2WX-m!@U|MYuH`bhWPZG&o6Em^`n}s#Zf(diQvV&53zi_L!B4 zTc8$-d^@a-+h3!Ey$Cqd7&CYPXCOvAWyR1^2K0H%qJNthVq29l+1c`j&??Y%;{{Z> z#DB2CFrCnqO?Yev2-&@WAjr{!c>W0LWiee^U%y((=v!Rf=vbEHyi)NXgr|t;!uoFV ztM8Rr@ips%Zg1k|;FH&V5f*yaA=R}9j%%`ZyIV!5_EJhO7dl#68hZNe>W2hyY_Sa2 z^9Dk;@obatQ*ow3@xj6KC2Y&XF1tgM#kNXp@6+%%0D0TIJ%@#3){VAj7rM3XiKNmn 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 U)_4;H{F_2WQB$Gh-eceY1>b1T@c;k- literal 0 HcmV?d00001 diff --git a/docs/image/yocto/poky_code_structure.png b/docs/image/yocto/poky_code_structure.png new file mode 100755 index 0000000000000000000000000000000000000000..c707fce7a445ed6ddd524c971004a7f79138482b GIT binary patch literal 32298 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 Zb;SGbE$T}MaKAg8oRqR;xrAZB{{w~mnd1Ne literal 0 HcmV?d00001 diff --git a/docs/image/yocto/tasks_do_compile.png b/docs/image/yocto/tasks_do_compile.png new file mode 100755 index 0000000000000000000000000000000000000000..64bd71e2ee1f9257126cc0b281aafb62164b8fd4 GIT binary patch literal 58259 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%0DqgN&kNmh;)QB8`(e5hDw}4 z$;9!09!CNlbBmpAyj*Jx(-!%k2md>cVihalG%>%Sb|7(-f?`+LP5W`9p6Ap`8vm*) zmK8Jmi}t^nfkvRHKi(6ln{*Abe6<^RwEuYqP|NY6+pVLwxCDtOiGgPrXE`|%%7VVS|0;KjeKeeT5dbp`=^LaHnycECfAzVpkFqdpUnjrTLvIcwJplm`~q|Q>5m6NKysDhH; z724YHXAu_*p7}=We2nPZicujEzKm_DEw&%(iQ84vS4~)pZa#b=WWTrIjfta9x=>0v zT48UrgO#`DAbrj&em`z3vrEI=8PB@xr#VS-aa=os;*cYaZgm@QU}G zvCFHS`C6=swv|eDBOk%%bP2BBx!a#=6GH99(~P6%UWqHC@Anj1Cn=~n|C;Bikj^Ta z>$O*Q%2f9?I5(s`hP5ftQA+v`+y-uYp`Hp;kXoKvJVzjSCK*KX>?~EjjXcd%o^qTs61HJ@ZfZweUabJK$FbQep<{g-zu*!g9BeknC^}JdY*8{P(@8Hyt`?m zf2U86SMQVKgwSXO2d0U~>o=NUe)5(3LPs%+PM&6y6TjDVZ`3st4t=q_166a=Ca*_) zeg_%!_DbOo!%+_7H4`sQzd%BkYpQn>-~t`~N5lCVRd&OldopQW-}_>VW1L-YS>hGy zjaAc$I-B1{bSh%T=`9-AmT#axY)AVMLV4wfUXXF<)(}H``@-FA6r+ag8MR` z>iNNR$(y)#cXl)@Gu*WzI%r_0r%!-D80S6pKF`(RmkJs812{OPGk|Cu&8mG23@a)( ztAB&rMI(?B6PNh$H!vRi{l6LPomh4v3Df;G)4jAp%^KUPU(0kRe2+CQ-9?owO@Y}f zJ4_LJ2M+3vLRY zAWa2CEUrbykV!r}7YDA6GPb-hsW!s@T7OIQ>#cz&sc`%zCVs4QFP@oUcd!HY&kGY4 zXgGu>#K<0|Ka2d_lVr%SlTR`LidJf>Mznus;YJ?Lhn*MC(oBQLA z(Scj<%iS`LsPBhg%NC4KBve@9ImUFuq5~5pEnBytOHvjIl40LpK;nRM@^i zb}R{Cy8|f1Jd(J3(OM?lc{g6$QQa;CVtu#^@|E}6ObEzaMk{R2GO3hrjzZrO6d6~p z!L4uf-4QFjB?VcG8>p2Bmu=J`WstVA|6yo>wk zl9j22IDLg#1;!D$29OEuueJr|Tl|_KI0b@-OJ=~tjA8!j`M~Ja?IBuo-=ShdO$TT{ zl^T9_kKT@}b;WmnI+Nj`=W^5g;KKRs%gG^0`mp8m(|Dgn;sM={d7`kU# z3{0)OJHJP#7B`? zaO?@NePQPV_oEVEDX8c}`&j(eU^*oK>*L@jb2VK;{`&nNA9xw#1#`(b+tFI7kagld zG!UTD*S|xb{<9o7UWtP=%KX*s>F-0e9UUFpqxfEi}e;JOq@4S%2 zDTRX9PX%H6W;-8!^wh7f7on7DbeSh9#Xwt9(s%n^7`koD(An(a*<74I+36H3rU;56`11RA^tQxAqVm-kkhE&$U7WH>5X1^{C43{gGcV2!oaUK9WF#?P24 zqi0~#oifKTn-Q=0$?JiLWl$>tU@^7|x-%(=aKXXBAU%uIa78&?iKGi^G3Z}cZ{$c3 zv1BBN7UMXi$3~+Q6~X}a%t1=&6+aVoBIeyo(=*J;$<--E>sMUCKm#J$*7u>Wyn=eT zn;JfX7QqR;+~LE)JDJyeL{S^tR=611hFtQB|KLt>iPYH=H0fI zQa2WaJu^GqS+{Hnsp_9fy5hJF{YzlW2h@(1k>s?rJ`ZSjN&br1tbr}je#bJ3ZG?Q? zhm(ZOlrQj+)tW2y#oj+p6eWXmk5|5^L@@Zal|^2#A9aFuJ`H)-8$VaTepew-++P|! z1S)4uAUrj=BQdM5ZTh|mEW$F054vDRLr&^)xbM}lmQ=1sIgi2?0iS}&$b+0?-6`Qd zGQfL`l8E+t4X&dGnDY8#Ay2$iYr6hcI2xT^D?PSl3D_@}Kup+NEb$7&!{;Mg$lbBV3KNQJQ}o9%f$ zes=0+r!S6ZqxxszRaJU~d`PmONv|n5GC6tcNp^)CmsI9vg=60Ct1ryc*0+R_@5T$ybHAu<-s4Gser)?gtp+ zn6~qNRj2!yuelY7ccA*Ls)lgN%w_#hi9Iwy?qNsc4FxhqxByQMj<3SKdbqXlD*A+| zFcH~zZmKvA^qbM~?p^xxeATA)&D{6E(aM&@;8yd>8jm`ok06s;8t_43>8*1%s1qBfG*s7C^jr!P~;zd2EDtl@B z_Nfx;vPrkd?RTudT%KAfg{Cm##StFH)q{nk52*EKW@hk-wy2tXLGoDBk)8b&*i&7O z@0&rrHa9OgI4}Uz4e@)HoWNH(BfJXfQYmN)lLf}98tc4&^IckL4Iy3aNa!d1Jl7Ks zvF^u;KCYYCK85Ply`=_l0M(Z_OFfqNO`FgLr=5^pV4PJBrd8Ay4u+n%R)=f*>Rs12B+M5ooxeuVCp2;EDDb@MyiPIMd z7W;Vz+HDJ5S0pf6m}@~hVY)vzc$g+NW2 zow@C`o3LqY;^&y;XO_W#4E(v8Dc8-cuLD<#ncIE7*Cy$}I|hrz0s^O+5;zOAd4l`p zlUNOFbfG3J9{WXT^5$6W?3@8w!vl^Q=h@2@+Qoo0tZhP4;vH>4#6RhZybRnKRYK;6 z@}a>0aJpz_vAbCa2qIg53)9p!C%j}K)0wb6lQ+J#SCDGH2`i`+lc%(({Vx&=I%3pN zZ9*m1oTMTR`>zMF5%Kw)!}us9Q{%N8qG!aS1B>mSL4x#6I>ZB@yF{`Z>>ETZkzD)F zDb~wa!za9QoS8A~mw}x`z2zHSVn!p2J_H7`*Z0)3`LIQRgmXUq)ELN8YanKThhE&SA&xme;OCA%8tP9|NlH^B4?w%3hfdU=PFbyKrSL^U`wOpGAo*Y}NPy;%PT zB3iCDBcv;XGcC4-RC;jJEg{j-yNs}}x?wN{`Ja)$Uf}b!nKJOn0inS(Zw;-i%j%T8 z_=L(EVFTr6T^#$;UqkjC{(Gm2@(*d^ewn&oWJjrmz6LKhwa2N4QD3**OTTn(1H9G- zQANOz%fF%g&VQ`JCP#VU&E79rXt}jvV4uA^JRkyl%VtHOgOR)mEbJ*>fketEs^7xw z#n?PhH#CE!z1_fZ4GujYVw*|Tw2-u&{ zcT{v$Twm1{!03!B*+dN$04S^0Bfuv#bWTU&vjSts50n-(aw{tOWe2E-R<(0nGQM>Q z+C4TuP8=rDt0R!URX~ng9$|Eb#m_A*>NdnZQkwouF&i;H0RcvFd%B;?@c9M!%myKe z>Esvn5fg5_*%`?emk2CN_o{KTMsM%Th4~pZqlk6kxPypK=md_D9#Esz?H)F|Dp5b; zP-(=S=(>l+K?^90v57`b`@0bD*Ff|V-lhuHvy{<+_w^8V?90HitoRoG(rav@*7f2_ zZ9~K?VDl0!B>OXug`M!MXFaOsAvYJf){~kQ#+nBugq~<`3<~voe)bhCPDq`fL}i?o zvF@INmxkoYeRp#a#Cg~2+*IM7c1EA{{mmM58P=oh&RjftqG@LZ_)HqsaQ1IU1J>uP z7B&Ix9pEvpN0{loN>iE-$d(FLRK@M=c?h3d1=<|OjdY-zxVLUX{oz|6e#QY83a&o(#0~Ml;s%m(lfk;P(5^*Ue zW63)Dir(z2Lt{5iDJWhyhczLIt@J;rGlKhDQr6@-Tz+#8mgdFO9Q4PqS21vq+y(nv zjllv+mGhicwtQ~0iuXHmZiK6riWr~g&~ zBrK!^qPwrJvX4wy#L2?e3lGoSVipl8dQ+^A6y|L< z_R*RX1`Li!F5Zpq0jBV?c~9Y3x}X|?wT|QfpDBBA2ok@&DqCJ;*~b0Syh$KLz(}M? zGcz5^d&0f?l{fb$_Jx7=bq4C(%>`Lm_dmb7bb4TQMAL~XEWv;54_wH+`;L{0ZzrvK z^5q{8GJF5tb=Y3DghYF5Dd6iHzn>os@3w3A;LLTW+ol6vJ>xmmiN4X``CKF8$p2TZ z^36}eK+BEeHxyEn1kSi%m*bnA=c@69Z)Ns2V*3}hfrZt~`L)*7gpb#EYwVUl*{w_v zI7^ylpE+7jzHaWn6H=Jj1-0b}NSA-Cz$18lN7{GQVw>e2PsD>s^nQXqQ|42zZwrQ{ z4CYfC2#2ayKWIyMev--@?N`bk6kbtzdal^vtMcLgg3p^1!mF*MO)l$-a5npALs^S$ zmq2W84$HRDQlJ|)1|M$|EZhkVs|mc1oIqU?ZWjM(t5Uy8&`!|6;k$`8oBA~PG3B@# zekd6XO7B;|b(`>6NsRoB$WAtYd05>f-RAB3{;YBXhgRE_DF21rE};LZZDRV-VJYnz zYD(?(qCr;>(xe13zyWG7{3WNKHz(11-$B*BSelddIxYp)3}%u?bVT_5eBoVND=F>$ zYE|Zd1j$rz?!o!UB~J6FtZBcGfE~psmRr9aY&&oW^%d1p5dOtk2m9%fFl*VpCE+?Z zuRp1`nB%A;?!ePkyo?oeJ-%o%cjQtz_%I0Zj_nLy{0+rccl`k4A51zW*e8tD{hs_azEj{ld+YAV{#pp>tttmo z;OezWO5SrKqVCf*^PDy;ab^CH)pCS$v=neOW1oAVxgHyon3?$d=>p3CipJB9wWteE z(=K^Q@UCb5L#_IRes$+}b!)3&>6`07XLw|Ev*tnDBPejCd$#sI-*tzKWx(pG)cI44Ha2i|6d19*nPUYt>l51o|&z$Z4d$z}4**9t}6O4Iraa15LeIK-H>Zmipa zHtDGXtp4?x$49OZ5E~j&fiVkeLzdDTwOJs9Cp`JXd(~nM%)W49^MD=o7xnjLx$rxm zUG`a}jyfY->9-d;4?P`&vN=x&#!@;}U^@X>ZueuB(&HxT)Aug=?^C!!o|x8jupChC z@HSm?t(X5Jq-Jt6K%jea-p75Sq37C@a|J*~1mgh5k3Y`82hKLp*w~9(Z<)KkWo9uB=oHs4+Uu4rG9OYT2-_Q2~-31H>e?wKDS)dRNM$iZOu z8L&mA*V>P0A1M%+`PWKK6AOhWhXINeS7|pa3&s&!Kr7TnSaySq{^!T~KMYvne<_Na zA9Q7Rf0rJ?wNe2X69cTfQnQ1j3IX8757yZfA04b5W!AcKJKOyl4-YtWJ;}afT-oXV zef1C6jI~DrC+~WNwL!gy<7Gqr;T|=h>kgA~Ub~KTtmW7TaIyPo2F4ETTuma-Gpk5_d;NfhqY2 z_>IYb;`;y6?>?X@Y&V$UoN}M-Je{w}GCOeTV*S9g%bXAKAD+0nw)|xS9(d0a`_G#( zq_i4)edc#uXdSn$S&e}5V6^=C$ZtwcbPMcA!Sdk8jSln_7uPk0E9$&Q9}P44geHPG zzyQs@Ewt%tZKWJzOUL8C$yf6bUuPGM62$ z5<0}44-fkBfp}af`)d7-`FN!jLudRm)5w`vBQ1#y9>WR{S3Ph*SdD< zYhB}~XKf~_TlK`pum9cfK|i&|GwqzClQIW_%4yhR+9@2CeEk2FpZGt&;EV*8`tGvh zQ2=D=2d}#QtyuWRLXOJ=9Im5!Ds{RH|Hu`DQyUH)JaU>x#b9#kE4gDW9+2E4i32&^ZW$a6M=@sqC+ivB@ z!UcUlD%mwE;*>DdFWOVI#mkND$9?Vfht1&lmpWf%v7E7L>=%QFlpNHIY=p_XRrLz> zPR9xi>QOGCrlz?O%1eX;MFX{Z%i-Q1p$}l{l5}v_7;i@x7?K^B$7d4(iHHU>`Kj)T zE&|k+&hn??^YnBm8YG!B()!!&;hsXB!kI+e%dxSi_WRZZ4SR6Ct)?fe|;gvPs@mdN-6WzQT=I#;BKbkSEJPE^wu?U}jC$rgQLzmzcJ z7Lm?=a@Y}P9N7puY=yOH4n6q{-Ua*jqT#{_RcLPU!EvKwlMb&*35-qsPSyWkzJy(8 zk{^CS8)M6Sa-&q@_vYhbE^|t!r_fWmQ6ZtLYU7Ti=%K}YBn{kGbw)IJJy$I;VB-A3tIXfXj>?^5Csu_Ji z>+z-^s^;{1Ah&oP>n6Q&N0xY{;bG#kgJZeW!LcdI2kVhe)ai(q6g=scGS7OQDu zYyrVqRH7D+RC=?c1E7Pb)BQM)jFJN9zn2jxpdDSJ>BNp8GyXVOIL=u$9>T%O9!pl@ z5iQ`O(ejPLK+2z7{LOcpvLX7t5rFK#(0k%y^-?jh>7FJLS61% z0)a&0pUM>#6*EpIxI1Sf5&X(RI+!x4Xco2K7p~pKQ6^w)m)qyS8g6BBnMP2#r|0u5 zK%4UK$I5FJ?HD@<#ZUlxmhl_(Qg^p4&pZ{$Jy*ur&Dj%P|IBy6<7P+ju&kZlb4djB zfSz+$Xggz+l0^Grbd7CY=CE_g>WrNEjhMbf-JhtkTG}+~H2OKLg`pU|gqp37urjZ) zLv^wQ;iZQ}`G~lXa;p|-PV#*~r||JDc19|T=y##ZS}I1Z1;gdt1l0$*dWU|!cj2p= z!w{Gx@rPckzN=4DHXyLmaUz^Sju{WrtNk=uFi$mG8U`^uNpz%blBkftJzZ$gmZz+t zp2JQ1Zb?t|c8}I+yuIA2BQYf&74|6%KR@6-k2{k7F@221FJ)z|5Zt4%vhq6WTDQ=hB`&{k732`9zW~C9oZ!kc%Dy1(Q7`3-D;yoiN%$s=Yv+jbh@2DCQX>Vn6_- z-I#LUhu2C_$17dnY=@fYun5u_dG$G9RYWYlPGGv4zCOd1ZYw3YlokPt` zrN|Ni4GZbV=-0+K#QMg@3yvuumSA((ZIzoFVCak5ZMCcRV-=je zhPxHAZmR)rZWE^&p>ZoZ#GsasLTphNFy+rGdiHBKFIp|d^nXr%Y zgf6(;322gAkG1MU+LQG3_F~nsC=3=cI?m(OeImVAlS0I3v<(v(U!<_}~-%!?z z5iN+DT&g6>G-cJhzw(^s^gLYl&IU;St|!wthz?X=_jx3jI?l6*m3Nry=GA&)T{W*u zoj-W_BU+CUNFJ7*94W9Tsc|b75Opo9R(OMd<6Vy{5+JhkNtCpl926IxwLgL_@o%8xn?c!2G?y0?pqf~#+>s*&Gq^kO?**QA zMylzE&Y~kBT?v7RkRTNt*#ZCmCxZjVdE5s#8hZYsTYL<(e#qz%e1%d%pXl${BwIG3#%t*FBy>^+pqIR@9OH8;5p>ard;Gxp?qABaz`#|gOf;X zeAox{!`9tf`rWz79TuNr?5kLL=PX4l=`fY)-k%1Z#8Iox(U<_G>EMf)a_wWQdxS^5 zv=7v`&?QnH7Dsi7Ijp60SgV6zzu5G33Dr1){vq!I0BW37Jv;--5o6r~i;TR=tt=+` zBFBrP9~dQNqfw{wEtVg$vQ=APvme~){z8)AQ(9@&L50WMb@T(xqT?m9z_$I*eVO93 zZ)c9WBYw!{LU|KcpN$=d;udL}(ts_TrM7u6j;%3+p-^`s)oUc1>i$9YhRG!!p zb;28G4<8Sc28K0=ahL9gN(T*;+uxeLj|>S3fpJER9M*$5%@EPmnB+UHj&I5z3=k$u zZejY&tZB=v4Vm64ng3Hl#h#7+fJnKKqC)_i4h@3<9zAL$Q z&^XU>=J~zUWz;FIgbNd%ZAQ$v={w419g-tO`j0srTA5GF!UC~uNJmFvjMED-AAv5| zmu=(I)rs;u&l>lMNYuKpul1YCs-vdy);7Y$MU8EXk3GYu;}m~U*WuCN#T8G|OL71m zs`BDP8*4-oBC9t4-%~}t>>HR^Mwa{TxJ3IaH_vp@hLL`MpGT_P5d-^ zeMZavM9)z0)8P}xH3DB^!0cUjq_%SaECL7ErBsa^D&?yLKTz2U0B%zK^FEMDqL(fP z?;}MMpbtUM{}6z42L2QkCF2RNg$#&tPvUz6;ln`#FXwUO+A5WN7v%ZU+QJt2`H)~Q zwGey+PY625>{+$Nx&^UfwIyD~(X7`$pizU4G-0|paRi*FoE?Ww+8U~~_Sx34vk;Mb z4~A|6OU#Z7m>Hii`h;+Om-*At0?OA22@PsWZjFdn<=zq|XEdH>oaf`6L1WNkXXdxB zC#jNi1Bbqqf~y(*!C!i6@I`)USwSMKBSsZ5fhj=jEWvLj{U)@~Br7sq+nJmainmFl zgL5BP=OBHSK;;ilfx5YJ0yqtbG0R!}ZDlY&>&y!PCOqA4D{Wosb@}l$bj< zjB>oTCpqb9oS=Cl>VyQ+M}p!=Ee7$JC5F`jfib-lTyw$_x}76vt><(}Ktgp48W%oy zdw4^c|0Tgm(JwV6mi1Vh`96~5MU41M`E`|S*)+x%eW-kE$>4VOuhyR|udf=yCLC>l zr-n*KY4gvXP!qk&V^@}9BTed2Na_*y#m&QgUA+z?6&-l9fV6B?O2lDY!g2pDH4Tl+ zb>kX}XwWU58}qCqJMbT{xfQ0%0XKA}G;ml}RK;w$cXL2A{JI}~q_Ldp#mhu-_BfA-8-MOc$cKeTv{d8PM}JGF8~>FQfaVrC@ljo#Z{%dbC0CR(QCv5@7= z3cLigEco^_1WdsCfR|40`Mv-?PD;!(HC4a;r4no7#`U0V0e{uFw*&;WQb66m8~=z5 z{5q3$cf#bCQ~-7km4|hGUu?s#Mc}}qpscc{_Y=%Hi#dQ9Qw+1O1^(y|BrHaQso^fT z=#kX~F`O4M^ZTvu$~Lcs_cQ!BY~hw$Sg{%>uoIix!>L4p!rvLkIRNZh@zC6E{UGY` zN3Z8=0Df9;07v9>9WG^FOv2&8ieG6za9dwI805jN_K*y;fcg4fuz|;XpD^kxH%_yl z)oEf>?Z9Me|1yu}sRPUMrY3{Zi+*bUj8-i#&EZOMJk zcr=`W3&4raC-OXha^_w7VX2{Z-&1}GcNC=qA1RsU1Z}h6Hp;&CQ$X?@Q9wD())8=3 zyoT9Mi1X5idFhirAD`sFIW4(5hAn{k@$#KN!am`sr8I>OJz_>YDwR-Q$PfGR{J%DV|gw$_qPiMD9R0!B~wb;ham6~0WkK-Q7fr%$_7~*#5KK9`j%0> z2}hDH!Gki9>-(p1IbODbIdb+|>mJJN!l*w^;Q;3kt~e&so_9h5T>1l`w2Zrh!@%05 z1}i>`l3rX$h5}`3|6=CV_(Gcx1sp1T>km%2>Ttr@dbK|q2U=tjV0I^qLioa?n|G3% zQn_^d3LyAmu2(x;xQkEiQBWWg>Q*+%i*v3`+0Or68w1cQ@eoo z!2-GwV8veA{houx%?68xz|{511G`4a}AX9Ne||%`cO_*0_LTI9H#Xf`nv_ zh7jazM(t>eZk;YBr;tGV9|;}lMBZ&UOB8pHihLc&@%USEyYJEyaE&v-$Q(8J{yj?j zDZVyE0~-z>$|vIOK)6X+ivJ#YXBGdv<^bW;g$4rVDfpQDKO1i3+8xJ&@#9$VUw3-q z1iCv@y()l0+B@|+v$Pa&k>8#k|FYWG0eMBloitv9h}6(EtI6s4oWpi8kT2X+YTn@) zihwksG(+tlf4>{f~wMl0%}_2FtkT9MhZLFQO|f z`^@FOQSy%c%8zkbuwnJ8S# ziV3gGbCtm3z}32?vbo*Xi-Mz@z5MRSmqKJeQFFI-k>SFaCdM9)JXP_h{D(@+m@(@v z!m(E!Ny>q92_&wdferjJFCRQfW3O=+#(PpnoPkFOo3RYTUJ!Ow&=1ZfhT==OH=IFG z?z(@ojYzb5Zn;!;m|?@KuAtMNq|cXjR{fMpbunpMK+ePYTu?W9l;iQ@T>YO}x5bjp z5t03jM3x515w6O%h7yA&0~2?vJcV;+^_Td(>*nQiY=&Oh16S*siq`&Cee~SA>M<}w zMO5J%h6ESVDbJusubCNyj1nu3q)^mx9fWlet9QtDB#D}TN&X^av6VGqihtY{%fQG2YO%iEAZ)?W$&!sy z#rHfDj|OCK@pkMH35V}T`JHJ?UfW4M@-surkP{8}8{eR3KZs;qJ%e0n*f_=U&=T9* z_Fpy#ajO^GpMY3f*^kwKQ_l}*>-4LF>Mf-9;NO&<@CXMo6>!ALI$?Q?HmJC+Hsf6I zlo^9CxFLwVZvr_y@-;FfVD8Cr@iuFHhyJ+I?D0Sl=dVQRC!*|MCJtN8qc%&(g3jy$ohcDhle*ATxA_D5D zlDDsKw#d_0bF(dg4|$HN-;1*a z7sXqTVJ2c6yea){VZr1KQ46nW)K>`Bs+lr=QlX|BIFidSK#n)NqvEubDbC_PfZOB0 zManr)TfpoOXA&4X`5m6+e@kdfj4OM$hh`xvfOqJbRlM_eKD;#bfzbU;!3J0MpKJg7 z-q3CqS7t{fHA14Y-@M*Q=!}GP-UOaas5=sC&WJbGF09C&!z6EMX$d696ueE=Xp8l^ z9*DZ4pWfr1D)rZOW0Cc=ke&wwm%vdqvZ3KpbjiKwr3FT3BF6b2lZRUu{>^s#2L~PA zWyw!nSM33Gww(fcKC*<2%?FQguvZHqVusq z;?mOic`bX~l$$S|rFwQH3U2SMR#F^NO6_O$H=#aBQ(1DWMaaEH$R$k%93THP!Ch_3 z-UXjh4Rz70I>$Hrp9c+yddn>&9?Mh^t(Ni>t)JC%BVJnuu9IFI6pX?aY&5H-_l}+l z3!i$nZO+*mObgVrc%1Hb4HdfPazzA->oI_z!MFa@%j9pMXiEj;9S3IqhITpSaR4je z*|Z3Kh>yEVdC@1t?ME$2uHrx_uo_!8mTOf#E*SDQejc12n)^7Gw)IUi{B+!LoR7a^ z6UI@tf?9VCDw9ZF60~WcR`mW|hLa63k3vgP@+}5euRY>GnQpE3A#iiq^z`QTUuutI z`p{*g=>eiEelTij z_p#{oJzBAi%ZhN}S|-O;DmTuI;HB?s!1^TYfW4fD5rE>@9s`<25P@5ZR77$4EwIi+ zz}c*S?cmSk!Zyf{!lT%DUG!NA{#f3V1YTX@rIQTjrV_*?)!0r29Q-tIoHsx3Rk1ZJ zR#71#=yC9cg(P@?>0PD{`UAQ>68AuL7ltkRT~sBPz*Nbj-9i=U;RclDs>yk$a&JEV zbi#PqCHXgL;KkTWF1!g!k7;@;&=F@TH`4H16gPa3kZ-ni_s$?kYWHaZEsnzRx`j!< z7t4qI8@~kbkEj~Wv)VR;y(|+kfYn^ zZ{UrzI@k+Y|D%yHTyuoV{+k1&5z^N1p4QTLL8gh{1AinT$HUZ}K^A^oW#5KA2eMUg z&RZv^h*x7^#0_Q{wO4T8>w4Vw(kZ&4dwEhVY4ejSGdIcix?GPuH)N>|K{U+$1=$Xd zw3+@%?8?SL5Jq0A&M4J=1?AG6vHRZN{jNBCi z8tyQTf+wYf&)7fTQhl7Ru8RF9t9n94){Y=vM}#H1f)9zNFJMjzty00C%mYlxC|}4| z!BVhzWCJdE=WYS_^IHQJmohUz%8comc?k4->n?=C6^Y;veaDFrK>kKzjiY)tMX7cv zqMJa-go}Yh0)9p6_ry&*g|(q`fn;*Lh-{dG-a%jK?8!to4*tm?(SJkB-VplIADwH) zlKR+WGw+_OS2+FtEpVY1lB)J=I1HC=uV3SKp7O1Wzw&!=7&j-R;xNQ(<6A0Ddsn&n zz%nqsd$GxdJOQw=g+VX*7FxduKok2fk@|{-3=y(Ft~(A=tRmL zTL!+xD+X^K0Qw9S5@evzL@0-PGf$<53|6SCtW{r|$@kf8kC8Gk#7|MZytZ4vz^p!oL{{%J4$ z`@;%MEe@P#|01HtaJe3khC$SH)&RU={}WVa_&?txBHW#u4)+}3;if=0)xUB}>J95z znET>KJI(b5M?*7VDEnXnf=2`j1P&7}^d!nzAnT{?BWFZuD*cd|M>f}Xt^Hi59k6ccsSu2#znbd z;qE4dm;U)7T*p{X6#$mrkiS=$wcTuW<^D~W8H`m@2(D+?U_DJ`=f~0y0K(~ z+@#`7{dVN{0PGNJH=^;;A>8=#wy=XytB zf;!I~r>?`|MdKw>)5|Fq&pt!V!d>0Xi#=0IkS67tprE+5$jDhahf#8PwR2BOllp<% z;)T$_1*-zS%6~3nIGSF#>Z);*<)_FJqSPz{5794@f=XldRo0@pJX{y@$Afz(J{l8` zoGjn(UJ+J)YL%&^edyL>*SDbeo-;--MNu+w*FuH4y!K(skdQW6S{DO$Y{DV)@p3@j zrEZz%9O`Jc;;%^$O8z|C@vqJ<>c>5>nFy4%PVe~XGtP;%VHhR*T1>u}&3sX%0wzCT zZPcEce?x|$$5dRFK#eo+s-)D%E7;7a1k>xEzn4C^!I`03%g1|IZ1sgziA-oLUnK}T zW^h@JY9~|Zevh`9YRyn5!i7)yOPkK~q9Po(Vu+kHCrLo5zG^l}U{*|TO}T)t7WdgP z7ZFtwaq(uViLs%h&1~4BtM~u1KeEyPV?q2c3+w;<5>R3G;@-jv`-Zy$VhKbaOk>%b ze#GK(Zee~6_@}_Ke3T<890TOH-Tu_GlfD~KlEUP7D0O$rM`TCV3wJ=l7JuDe=O@sj z%!iJ8UItv9J*~Ub&$27)HP2mth+`4x?3rs*=dtVU{YYDRv$JJx?sp)#J5%f^)8MsN zT-vnvtv*00r?lzd(^pNIh3~n_?~}~~d=`6OH&a~}3iC2U~}Fu=up#a=lP+{!mSFwjf_olX|KIO?hilA zVnT-Qd$fuK$TaL|Z~j(QJMfEm?fW^c`;c6~WH>&IXO(*|rvRF|S|jx+*ZR%(Cxqvgy zc^;D;C^K2@=%|rt?~PU9o84dIXZxMcy%+^bAfVQ_xW#AlsD(J=!?fC$n&5p5Gu5{< zz*nV^qH*Yj$q0A`=Ny&M!rTxgIgntPEUTgq{N@XGtyA8S4K)I9L%+;Op zprOUfcPhU z=YxtGt9I{Nq=!c8p&MCM1f1!DH)=$Lg=474lsPr+2Ia(kg!9?$15(Am+R`}lDM=cN zDxAH@{(um9n)V<@S29*MgYM4F$^n&9{UyPhwY~n|EU{iw_ zgHhU>nx2r1PUP-LKa9Wv#U>Ed7onv~2-Dj+bD-Ni08{73D)L|?YvI^fBk-wRK#T@F z2rzKH1LkXBp^HNy&hLcR{56pSYCgD`y{frzMb6OS;*9tiNk|DmB$?>(9u3S!PW;IXw3{MSVfa% z_0fbN4nBx2$CC%!RwZV1sW*M_`-A-KclN}z(uH_I**wJDhk=1#cXMK7X0Bxf2KG}@ zl$bX~SMNi^i<07MnmE{PlS9+yvaLt3!&emTNV>ES&B6qDPM+pZf^ka0rj-Q+o}iPU z{!(oC7W6#ij1qEkflaeXpanE<^p3i)2SgQDHAy5r5WUA1hi{RPl0J^`0745$qJDw7 zE9TTx65I}ES$}&F>;Z*-tjrSs{4=?TJZ}O5g7w>X9^*8}JL`$WR9sqIQJmInM$eSa z3BH=fE$Ge5&k2xZ)feQLQZSHN&+~q*?;}#$x^u?1>i%n%^C0Iwb4|{Er+*r5il}He z*UtPE${LN3jxz6ZNeK$L;K3hMAX zkOTwpz)oI&o?u=4?Ke}c*tg3K7Hb zWGuT7HlwD@>4H$AqS^Ow3{Ql~=#SL~keANC2k{$E6h#on8$tP8rW4YM@$mFHBl!6E*i{%rvSjn0(PLB;23_rP8Zn|2;nq_$8l2j7!HQ${ zqg?Q)Tl3zbcx8HK#W1W{M7P&xI!IwD)!!as_xMR8_=JO9Z!ro?CMRl~AB2MgfX_>; z`EJA=i%pP%ssz(_Um9<$k6o0Pnx}9BulWP0P{3)PE2Qkau%qZ2zwRzf>9%G9r|^!w z;pn*In;5%|k3dhnkbe34-kCA&IU!1CqXs8f9DX4GkT5pGs+7Of5*w|zuUn$WYGg~u z_|iw6}U)w)p?wX%DWo2=+RwkmS(z?&L?gtDI$lG^+};ZK0%co+Qc zVL{e8P49!`FRWlRzWYI)$1==gXZ+E|4D+W8p&2XCgsN40ga; z42@ENF1gT9&-KZT66q^$;$Q2I4Lsq#q_X1fgHna40#;6{9jB3V83q!v-}9HzF$&h7Ixz+OI@JSJWAhzPCc^LUlRzUhBiPaj0HcC|Gxc4&~3)f)O>~s5w+Z zH)>)tzNY!tz_APKsz#AeDyaWM(5WEkcgDG{Oi;duk?H}!!~@NXZx8m8_#vly(v3Q| z@a@1(Y-%=*fRPqxqz*Bm7PJdVBpSpgaVD*VJtU}A@0uYvB;fM0!OrgVn4wdN#C(n8 z!WFdw71!@kktC?m>!YlTI(%Fv*E40t8WO=#2^)0^#EWAe3UxhOZ1Q1_v0!Q0_RgmsOzaBT<_$3$xd@r2*AadXa_w&RZ5T1j!5MYW?*yeMz7GQ4x!GN+} zJy`?J*gCjRe<~}Z;b6U9>+%s?8pG;5NuG6<7*7W{pXYL}KVHJ=?L^3#Kk$?7Bkth( zp8hQefA7LQzAU4C0mB^OG1m+x+rji&m>LL^BD(5odn@5icXD+_x1ORHUN+dg@(qb2 z)GTd6Q^5GuZA%!4I-v$u5{VfZ(l)(wa2d>?2mDx+2y1P3wT&G1d@sLnX(h*%NC}|r zf!7fofx<&r+GT$#hc(kBg7Cnk%c7or?Z-!cbHCq-v=pzHWqf(igq+=d<+}0Pin7)k zau$j4@gO7T@s1ftyVeMrf_q<{u-zPA>8jwD5wBroU|>j?Tvn(~%V66{ z`#_gL!etKiD|?bo_!p-{juV#%`Z5GWBD>>UM^#NOu)4L{ti}loG`F zE_%BO;krobxC2v#RUwr+xU%yuZ0W~Q=}b7Y_wnHTEuU4ML^eFUc`YxqO`?+w6299a zTli?f*GG&(7eVg=Pj|uewV%(%?cJz5v5(FW$JD5~Vlr-mZiFZ59$DJgIH7qVsZ_if z<5A)g+4KFc0<-jji=>qdJB~R-Vu-5#+3! z;8hI)A_kO)C&LfI|Cq9e&dg*>y4t#af*BHCr++~YK&d==5@P1HV%TV)7lc8oZSa3< zBd>u(3i9{Wk-p`JOrW^Te+X*ox0$jreTL$hV0w90B z5y#DjHX|;dDgC{%@D}36M;N<>VjUe+j-+#jakC)7MAKx!%3_vs`wq!3{2Pw5w;;x? zvL6$uKcy^8LA)RKb?;PmABbD4?$R!-c;?HnX62NmtBV!}S92SPo#REJJSi@J!*uc$ z{Sa2P)$`rRzabftyvO?TZ)U7I!wtdYuy_{S#_j(E`PNBQuQd>VuNkEExk2kh53LB74WwXELH zmPQoAfsfY$CIzzF7H*JWf$Qo=9;KZ^5>z)m3gMalC*;1g9TR7}QMWYAxLEvrelSJO zn_P0y`7t7%i9*Yy0vd{-5Izgtr^?|JMJ~$qKbTaTB33J{mumhRsTv?MGOu+}8h*ZV z;qFL60=TDusfKUOpOBO-GjOdj)yW#?udKV4);xQ=^hSlD>gG|jpz^vF3>vA1EdHup zzX!XWZS;|uvQEO^bi(>Thi&4=X!$Gz0?W&klM795bKP-Z@iO&cjxy%wv|lPnu@>He zP8T*1&R2MCs-_z{VCXATsy(4;T;3M-(jEe<2TG7|U`x;R_Wt-GIeZpUSkPf@!w&0= z+&MwsCkPazOZR^*!Rdx`O~ZTmfmyq{|@BUD-))09#pkGB8Q_1VB3>O zq8oXsuTYo8MZ9Ca2d%4CA3eFutjz3fKl!E+5|kt<74h|0Xdhd~D+~3Acj`iXbD8U& z24oVadwz1kv9of2OaeQQL=jb!VS=TlP}!-i%^B577BHSUU>j)mP=~plUVv{xp0=>C z(C3(sm2vwX3xs1>rY=3$2Cx+X%M92SnTu*QwYCEcGehLE4e~_4fFlak2!!r?Fk)k> z`EZlW4;FzN7u|3v%oqVq^Q8HK>0iU{M~P`>Veaz*rg+(y9-AV#E)vyt~j!Xf1eSAdUjv>iIXdfxf~?PFZy=m zOx} zUPy)lXTBJwiz8q%&9^_{b7bAcE@Pq9jf3;S1i+>*$r)p7)tCPWn7LzbH8vV_xk*V$ zVS~y`R#=v$LRn~P6$Zhw%xCS1dKDC~eHVG$bCSDZ9iBow2OA)5v5SmfMxh5O3zAP* zQj|0l8DI$!D;SZHxV-;;C;ve?)Z0KP&L5Sqq0=Zb`?K!%Vpq3 zj-K_bY;c)ZGc%h2myXf=QuC%ke*sw;iw8~aKWWa0OA?2U+5$ST2Z0)xYL6Qqdao-4 zz?eGmOB!BK>mnj{WONk?Fn3{JU(0cz7Yh>YJzIu7Pb)UML*cmtauI5EPS3 zukVd6YQm(QPR*NR_s2pZ$Z2ZOb8Ric{w*J()GRZBd?zY4*ecZ@iKG=avyfX%BA4Bd z9b(Hs)ZT}qZaqXJ0n#?Er-QlklrX!ALGxDAEeSe?;1ddUP&Ct>z4C@R4)Ms@4)W$V zfmtUt<5*J=ZJj21`uGSXZAuL*1Y(?qSuLHl)$oez#rxsa?(ffD+q}YukC>Pp^M-7( z@8a!hhoGjRK%PfmUxIVi>U5i4D79Fn*UDFu)(4)?9KTAfUPhY95hGyTj`m!M8ML`@ zy^M7=-y2Yz132W%sghxE@nn-D9IfCuVObBMOnM8N9b?Y58AW1@>k?an5mwcA=l$Yk z7u#<^ikw)QEa5yO;e$CH=D*F8F2ya(n#FY+awV9ZP7kA|uBv#9!H5r?;6LR@w-Exu z*(APq6g=Gk|A2E$$hg89Cc(mN%jrg6c(D)h+F8k9c+=762aWcySls+202}~6xc_q` z@x2ijQa@67jb_o!77~cXlU68kJBQ>D){D~0e3eil!iGWPi983A-#!T83%NPpH9{%D zej`oFJp$<(ml5_sZ)?hz*fAs8zXE*2!2_87%8P(&;= zrY_$C>w@*DD-Esd-+HSs^@{+{5mUo#oU3*XqB#(QuVqLjuCbp9>HuJ4o@h>6Jl5V? znXm~da}Rc$b9bB;L@*&%+CsdFl8Io zCX?yKP*`_F%wM{@zwKOG%TbHTxn$ib^$fBQJef?H~`BP$-e4c%$kW!|umdmR3rJuT9%%Yz+x)xeXO|judg2XN_lO3O@4Uiu1x`&Z1=V9L7^Ty(4K4=davt0o8&$V zWB^a`DF9G%-KZ3K*nY=t8YknDPTp{#QUT}4tzone_MM@mgpb|b5o(N$}x&>DFq4LTkLFQ_*5fTZSMUy?_CuAF&`|knjQ5DGCDw_T_jPY@L{7#5xBnIhVE`}*G}>QGg@I|yWHMjhvioaleoIKL%>i2tHGdU;p2U4y zK?92>*JW5UjIOF!VXIfjxtP_%ic9!|+Dfz2vPs za1(Nr)jU)Em6^O_lM5a1>HZZ`E%T8_xLX45rDnfF{)T4stCO#}4bCdg$L7~O=C^^3 z3eZokKH7T$tb$z<4EdGUEbv6Pk;fK1lgjv%!wMQRO)kJ{0N=zQE9_u9TSfsRsr~0y z%VxJJOIK!B8c|224NOn+;i~8T`$AMmSL-EKxvcsOG^i^*0dj#sg8AtKBugl^bM-)&WfdDvLo6)1#%YpMbr$4hW7~ z0?)W&ICngugrh2%Z8A4+-rPC<2uS62yeZJ}9>%oTp+vwAjZXe;=RA(Vh3$~Mx9#v4 ziCe(dJ6HkHq=~xw#RbR~hrUg)&N4ygXb`~F($w_na3D>uM6yxV0mCJZcF^qIy$^wX zPy9e;9mIafA(#^ZEW%{OXoM|36wceFZ)_Y!!G@%f^{2TC*v2-ZDMD-k*B#)+>++M6 z5*PRcfV+S}VZ-=nx>Z5*HXbmp?t(XOM1Ngwa4aOt!KR_0sh)EQw z9<{9T+ar>oB8Ds1m4XuNBRRh%uNt(N3smlED~B>t3DCnWu)?~#jU?W=E#)LzRlg(f ze~>hy*>RS{au~zMKI~b~HV{4jt+~mZK$=V`kL5$mJZI9_0-3!Qc4$}^JtZ-m9C?%M zk8&ahJK5zfFhs!rT)*94;r`$P|Nr})0n)t^kQvDMJ+;{4NX+_#;m?iL5Thj-#=Qx` zoYwjaUs>&tny76xcp6?;dQ=SJ4?s0zQc)|(zNI#P~yGJx=(H=L_3`=k(Tc=w(iEKnHV-o8VUDl0Ne&lf2jxA z1>jgqlhrq`**c*)(WVFcrLK>`H4B;$J5Wayq~?&Gy3#j4z8E0iP_z@da#> z2az~oP-km8f{!25u4I(z5TeuUf=pXGRRIN~2rzMoaf&)l-y$<;mq`hiO>`Z;5}~`f zQuM%(lIL(?R{p<6x>MAE_hw)i>cwFu4VW_9%xXhroz9kv6R7!#&;yo@f?E#2-?+lh ze||9LSJ(=Yf_{sif6dNrSjtQYZ|PB8+LG{m0fN(;nX)?o2VoY(E*Drsyf#MX7oXVq zi3~|MAIsRh1AD=J#&fL3?fm@kq85OB05Y%p)qpTp?xdY5aC`kt0@3Bs zU4U%yoSYG4KTNA^eQj)JK%t6D^7($HTl4Xq(*xqIrbEqmIywKDdmET&as<-Q4_Y4Y|W{0i)-m@0b>&ALBV#G||nw@P$FmYF;^go9_T18GGw*_A)XEA_?T2!UEDA#U7Tz>ty=j6%F_VC3oGT(VE(=Sl!t5Yy~`9A!g1u#yZIBS zV14VhFlK?q?JIX)JG+fN zOe};bEXGt#A#hJ$0~R=2#DaG}+Rqfg2Nkrj{e0~*dB48r)YVYUoUy0TZeElx_$9q_E|dLYDMPo$OAK zeY!yK#TcVS!tlOwR{FPUJSrfOItFG9DNtGYQnlr zxSKk+F&M%$t3M6c?z%cif6tewEP1epB$w#RTDPH-mS@j6t0}_4ytyt z97BPZ!a=+=P^`M23tXtf%`c7lveKi#CIT=ngPkjbY8Sit0wNB}kWmRcb#L3^*A`RR zA`WdO8ts;T8+WhS0aXBU_vksM{8Z#)TM&c*7(?%!M{@2Cs$RYO4F#kx(FJ|kJCf6Is&wdMuJa*{tM|#0i*RzurM#<{KXo^VS_nI5Ob(w68=DUT?(rV;y+114+ z_nkQhdgM(Dz*}7h8V<;XFCdw_SkcpS9ew+>B1vb$k1xrez;>Q4i~@BJN@Jh-2JjN!aJffhtwFDkBT^!-zYbL^A8)GfL=%YfR+b5*-KLPepggHEUgAO9)(7|2?#E&WgR?Nj56EO%lYollO-<;Fk_4!A58LKR+ z5-^7cY2~><3tH+?TtEhL8eoqBKvaN;L^v|yG9OR-B})WgKM!6UebNF_m-_`IL5}xV zan9Ls*yAp1$)h5JgTEwXYymL@cwnXTswY7!-)?g1G5$JF3O_D|tQU-TeLVre6NYQX z)%LxkE@MAIv|?s^rb!yGPvkF^&!+|#0C1_1Xx}-`JP>RnNb1QF`EEVh(ddW9>}uCHRV_2Iv8A`lknuakziyD5Oi4F3m+*(cs6(}*w(sk?Mmb+ z)-*QK0!SlPOJ*csdd|&nS*>3RWM(fIC_e4St}wg!0)PYixEhrrYXR@4`q<&dm6D)I z|6R$LXKy>>*T}8!NAvFlO&9KHVO*r-5L{SQw5v_=qr-^|K+@I~y92n`ku|al);0Yh259e`JDTw@x{6T7~Y$GKvl~#=JoP=C6mni zd~bU%TYdoP7p{|=5qK?MCpF;Om9-{d&j32p`TPt2tXx3I=Wua;cxgB}ThuqH-{#X3 zG(cDahC}7r(8Uj@${#i&or#X}t1AJD+dl!U6v(!HJ|B27Z~+hxQ-=Z$d^CIetZtgt zsX#+#+WmfYUYwr>u_1@+?&By#5W{_Py!Rzkl8kr`CjA6JNkYjBN2xRUa6FQA0D1Zh zs2-Wa@#4znlke$#YXk&vICO?^pSg}1q*(Ai#jOCm@sPe7zzpzub0;Wp<=MrvZSN@; zz*!yg_&jF7d@#g_urdqU51nCwxS%T=# z$=_Nnj$0g^0$SFQfw>!(^!D#w-=Z)=Ubd)6sno#TqWi-6j%qe+@Dx1 zNceu;UmieXPCEc^2l`vxwwSIuAHf7HANHWvqzZRrHIF3^uRSX>?xt{h1AqZ<)drq* zB?a7>-~sk84X}Un>+jEvb|sB8hN$e8ZaV!S@Ym{_{%{k70EG{Mjm)L_Oa&X70gj?L zhLHwQUijIkvle8ozI9ikEBKD+Awa|8(qvb|4&63y(KSWpQ={wl%)A2)u55b;1_}9~ zBA}Qrm?&X~Rs-h-^a4$+{R}91w108>Sws#4)!7m2@a3us#&T42l-HNNB#>tY{0|_E zU+Rm%#f>E~<{9R5%sPTU{`x1*U$4(Zk;{SeyZ3x+w;c8*PQpD^R5JZHwMtC^pN63c zq)LlU&FbMmFjC!Z{dj%X?U|OXk`e@bR^Ik4cv|)cMfPUk-Vg6@A`3-@!I)q8-j#Q^ zTDy4N^k8wYT9&_GA8?13ZBl?`dVh9d`Rmscvnh3fo1&C}m7@F<)U>^bJGatuqk#1r z&=I^a=J^ru;#3Oh*#By@U2mMC^x)fJpgu9~rOd$rl|z0VSvt=liv9A3c>!DZOq@Vz?`6)BxB8K}5Y_1O?I@O4gDj;0`U>H05^ zm|#DR)L{9ZB+7aN)NxWgA0Si(JRF6h$ZZy^gT?E&zfeE15zs(bW8)kfPvOF7)L-|A z3Amwm(zo<#^AU0U!t^a@QH4B~V~v@C2mCnBfA0Ab%#ihAnvTVM%g3)9dNZjTg=X*E-`|$Tp7>Ovd3(3a&LbEU!lr)-R6h$`>BMDHNqHzse2s~p@Lmms!%B6s?-;fx<>sFCE0J!1f;9TaW^5DWPeBcVdgVG6=&oz> zTuCl5f@g8->r%1r0wDpn)K3Pg(uT@P9@+42*eeB88Wm4ejC>#Ib(sZa0H`xRx#(dS zMIi)|p-!1i?}F>hZ-5lTaN6FFmJa`wMx&yOBaEoT!u2*Fac9k{*UVwAbx)<_w%VNK zs<~lUAc?FgQceKMxBwE8>?w+bzpTR!1#Rx#)Py_C5Gk&jFG#WIc~4npR76lq?NKkp z3~KGJ$wKSQSaZ)=%uN{8pmi<#{TJjg52RK<^&_<*FSjia22zp8pV7=KG2}9Ih>yV5 z(EJ9T<`vI5e#nHQ{nGQ7N)#hbRT@bRuMAw}k!}a;o5P?6W2;)KHiv*5p)Xs5?*DKd zf1dgnE0|TRp}EChfdF!WNBZY-3g56pK^;#EdZ#zR&(7XH>-&qD*LX6Zw6m)U06Q%z zk{7u9CQ2p{`j*Z(e$^`6_=dlS8(?cl0sHaVsFWnaGlNYPJ8SCE8sCFtQOpw`fxLsU zm~Ke()w0RO9(pkfy+A|x7@BIK+wR2~Li$k2?gSeOoO+eS3?BvAZyA(C7Z%RPC8(fN zx1=6a#u%Lk6`L%ocGv^GU>1d&-Ez0|3yL+Wm$rL~X1=BF&?#^9kHAYJN#!cs}E^ z*F`!3f?xdv_Psvx$GkLn;`%ah+jiY?djRam$Hb=h zHaVRaQ3M(-#+P6H>(fBikQJIh4cOf3C*vl!su{L2&* zyh{)b8^0)Z0e*MMQ7_C(ArF4Oqwz7_C@9eDzH>RBN=OA(&A7c5?#RB&qJCYHnvqgA z=N_4SOis_-Jei>o5j_HK%<7)71tx@IKKk3PZlgmB?>V4muC=V27PrLttb%AZ6k=>ck#_+d_@Gz>em3$1)y;W zFU2G~elCw9A%@Qu7y@xyPz0Bb;Xq1|6Lv5zvY7z9(j{$ z;DfX0b#t5r7z`+%3Px>L*G-V_7pk)pPWuMB9rs*P*1hhcQKP{D(ZitrVh|8~DeZGJsQ2`taU7`WNqM3p)~&}<ZkY-mS3dZc@G zwsI~_>++V>$w>ZY%lcV)*l?9%!pPJW-t6TE&vAawp}qMH0Dc`ua`3R>oq#DS*q5tD zE*I=R;wqO2VI;{5tCr^4{VP3ZZ7J{a({bnn)=Nt8fy^1~IB4d4c$=#%6n5ob2 z5GT;>>$z@@GW~jk7injrl`v{SA5Zs;+fwLevhE!XqKe?wvT@hjbf@raTYxNSO@Bqa zhyB(EcHOfDt(kK%57yFD($w3v$NlN5Jy~}#@_j`2W<#yhxnp2v>ZlkWp6Qp|RRS6r z%7+)KLCGbk-UNk#Q4M>$LoMg;N=lSv+4NJx9&l3wF!({cxs|Zxjd%xBln@RKDOHOu zY5i?=P=h7{HXFiUcrdXf;S@>=HW_5=P}g}RcD38&FgO)#dn@~UseAJxzfdpR*B_ew zn*W$?#g-~Pzoc5@HA3c_{^siFj)H4#1e&Df%XFnY*UlDv_)*mYb%W693^_ZN%7}cJ z=V~82BSb8T@*BH>YwC%XATxv@qX#f7QAlB9PK;rNFEvcGZ}8Q=l$*R<_miukIiKP~ zMSqs}AV?<1J96Zd$dvNtkH!F_Q@-ITdOWfW&Tt-Qd93q^Gmu3(0CA$*2a#tbX7ueB zW>9GKIDCf!7W-vgfL5KeBZuwDJT6S)@`x0U7~hC~mByz;i*zIB1Cfyf)ENXaCgz(% z4-kgl+9bIcPS&uyq81)EO;|kv&k`JNBrH+*7(wTc@qhYyqsKv2tIH1?eyX% zvhqzy*J6yEZ2~6_HXHUBJ?%O-?&-4@grQx-J9S1cWie|Fo74H!wvEVb^Vw8o-+bI4 zNz5{cC4|2m=N~E2HbeF$OH*s2qG@tQ@97KIO7JBYmH2Bg)0Y~OsIBlL9}j+0mlPoe zyPu~CgrpxwE*1rW6DeK}>{wbci?8sJR>6c=z zvJZdhy}!+zw3A@0;URp&;l%~N7y}T}k2Ah7Mv>01f+i4lN<^2uSWrw+2@zQA zf7@Orx1dl(h}R=8&l>;99T!uq>XBH`x572DuY?UnmQ24cDq=|~=i>ffH%t%4io%z7 zKJas};>4Nfgol11va31n=7=aN!Tq22cn^iD0MyDq)1zQd0QX|Bte>@h%_BSD_ngTH zW2a%9&5vO~vw~1GgYom=U<(%jR#<+dyp*^eM91n9orh)-b zyo{Wn{w_WMR=@72$JSxHMvGrRl;e{r)np5*P3;Zaf25b5f`&LAy>~8oM~REsDa!@N z<19Z|9aEIcIWLTX%1bJT(n{=mzYAhGBPJS~Vbi=5V(X%Ivxf%f_^Jt#K735K*xhhG z`Flm2sCj+PQLOOA3TLpXUr4z6w7t@qcpe z>Fjr@MwHDk^1)T-C1uUS_TpUOdX)$or98kD-}#@#f05c_d9mKQvEK{;5^vu=5>Nqo z-YgD=pF;~a3^qMBq$y|GHT)yp^W@eK@CCM}4A9x}4-cL1p40OgRzHX?vK!lW`%F_U zj?ziCLS=OIS=5l&;F}3m)#qLxc2Ftji?&O_3#lOQBGJjJ_Qh_vdc#F>*id$3p`2|L zS5p^-1I_5N-qo*5b#{89aMwIdpD25^n?2-n4K$Pz$F9at#JA2MrkV;>GdS}NQHCGC zzk{3T`G6dvxh;-RFJ!2?`y>vU%gtSLW8u5)brnyHHAjaq*1Vdnf0p$0;+TmPJq9}8 zqc+TmuMoq9b!h1kD5~fWlMzj?PmfKm28l6}u0zvC=gbVnT+Ir}PV)hVPkH7b{6g37S+wMXI{Bt87n& z{@F!5RjXIe%2Es?fNv#gzrzXhak#+6_PUKF#_D3DeSa|k zFj=$>XE81-j|FfnS33UEjOBsy+nDvdlFN7(08x&;nJ5$jQ^xIg09M#kHMRethKp;E z!!X6TuC5`fyN^2p@Uj=pb0>4dfrN=W*K*(D|%a>KeGuy-(t4?D9NlK66k8ToQW z8#dcLF)4(60BLVv6kZ3wJlCJ}muRG%F>n1@FfWen*Oge)t z6Q2DgKgx%zG~qj1FN|!8RF(~CTIbH(&|G`U8Lk>nr;{grv$GeZrA!AbIv=WZO0>n5 zc&)V9*0x;115my}8$UkzU+^1{Z{W4=_Qksh1xdvs*72P@Zr@% za#s=(la;nq4hl;s42SnJmA5d~Feo^k?94R>HAAhdSKFUM6kr1eU|@^Z&kaF6F$P*Q z=g7L{(qoC>FO#DmVYUc?+gEkq^$6;%x zE}9-G2SN;*_5XW#127oXM?zdEP+{@QTz|IPLdcOdpetQuy9X!CF;y^7#Hb5XtFJLe zX%+G`1&|K`EEui!*FE(OKp{#pFEM}gJ700c`#N7`|qn$k8aHHcOJ=G$*>i|k5 zK~;bym|)2pe;gmoE@rv#5vvGI5WSh*3`>K}jjFJNJKnix-z-sjL%SynN5&?45A_Z`9}evf76X9w z+-oKlgG-Hi4{sd$tZ$H^?CS^@0|cBA8%6iK5ytAmFnbE!R2_@sVddd>{u@qK4PrLd z)~$x!0k~*W06s`;PI$zwYKPMJ)^jwQ=Eh$D`6)~by%H?8{J|`AD`3m-yh8new7*sE zE6O+-y&w?O&GwU}y^a}FXFQq;IQ-Q?3aB>HcJXU&y@k_Lb+j_E(A}^2esw6oJeW*r zh6h)iH>dU_I$@XaQeVSv;jQ4=4VOd(kxupMw<7SAxD1k@aTh z@ZvR(pU=pCkJ)_v&XE~T4I;Rx*BW&CzWBu0E{bfuj=`o)VP$32hKgdv<=(IgplSle zer@TM2r<>iAiVVm4Pe8brx3~03@w4)2f!Iy7bNrPCMbcP2!2OV(XOf@v|SseYJO$^ z%%Os)7^`@7j_e0rY{26?P{CcF+~=k%GSeK6bNh@MQD=3EN?3(5r)sUE32Fxs7VQY1 z-cELzl(nMf1Y%}!U3;)dZmx33?t8cc816e_KWT~FuDm_l7 zQ`0tfx=V25Gjddv4$9YX(+RQ*M@iNcrN|TA_+S#;Adj2SjGrucMV-Yuq5w}+ONwX- zL~gi_{c~e27b;KB#po(%6*U;MUVRZUw_EU{2!2UsrBWa1?toPo#@d%DQ}EW0Gmq%f z@mFO>c%#hEud^qmy+jIGRYL}bghEcHHMYatT+z&}g6-R_K4VAs8p|2lqN}U(Nn`ah z+MMo(@~jP=Sw1%Sp5(yLR!(G%*uvrmU9rM681h=! z_4^TFsOvh~+OKZCi>bT-IT%J-Grn7q@iDg3q-60DWzBZ*TezH1#GktmMPO0Wa|C;w znhVb;k95=fbSKh7eUVfiNeir3VWj)vSMTe%y#fm-v9bsd5wmK1_V@I>O?jX@-LiuwbX<* ziJsIbG)RJaOBGv=SKlvTw{w;o83uGC-V*6f$w$b)O$Yd-pv~Ys*L$)`qiSio;v5T* zX?@TM0%BlJh}Mc5|LCRz-=e_)1GiPuNGxx}cK1;QZy!L}MiQ8Cg&Qx(Xj?>*toaxR z7+vVj;H>lU;*)htd45NSxp{dtuQKtk?02-*$FCZj?d@q#x#&(UL>?HYZoRdGKV1Tc z1vR_7^W%PmvdbgJypV>?_iN@*J)Gf_1HXZd26EAB*X|uEEwzi_Tf^6#52(4`bM4k3 z1VINnF4rU>HSadfa|lFutj0x&URszmnFG^#Gqa)8@8j=3PW>7P?Q|}((+Uq#1Nx*8 zDH6sU5ISqKPMoZ#Pfva&1br5oZS~#Wa*9{Bz|2gkc)3x)TEwL$-;CZ@{Pl8D3 zb}V*oI?;z$7>r5Da*=vaYcN7oc^g+ILFU1PlD@Wtf!M=^c9D_YX+;KhYGmL-+6@Hi z8#d)#WBb?7=&_=1Hj)*59$IfryG7DZ)Il#JxMflJw%xx#{NVBGlP~oI$W9*TFsY;I+P0zGs*V(j1yGxBc}T;V~w5?=V{DvlHe)klA?E)(}+Ge zEBvU<==(7a@NvbMj92Ec{dR<59bpvq_Hs;l-He@;EfAh6tI#(@*xwgX&MBxnYV6Wm zm!VSw7(#}x^--O}Imf6J#1Yo?C#C+nE-9FikrBYK(!6+DxJ-~fd6?qHgr2UnJQbv? zr_~IqrKM(mGa1Pj6u3`H?s-cX#)sU%zy8Y9W>+C?91FE1@Ov_@AMDO#t-JXAx_k|L z8i!_|K4UH}m+P^L==$Qr4>N7(PeBO@ z$GOwz+3CDDJwV-|E~MtY@Gy5GGZ#nBi;FD$ylw($P`_gbd%P_%(rv-dzUd15~%Id%U5gslNc)pLY@nu z4b}cFzodO7%QnecR-_B?;>@59lN15uKbm6a6~L;<*At>|yo#YHqURs&H^RjM3L;vle^pZTSQk|*JP zA0qWa4!I?J8p~zG`0kX6k>gGQu3DwNJ=_B0 zL1@)v4SFr!y9+R59;oHE= z$Q;~ON$OeppNsYc%3g1NbSc&4x+^JGPyH#@cR$=|&}!60N=#h!Onld+iU3I~ruE=x zd*QrvXjYoEghv`_y=jVZDT&yO?)1P}7u4LdzC$Tck8e?#z4 zDzg9E%u~)_YW_{HEAp6|WJOGumFB(Q|7j*kN z{!bKbSleHM$bb5MH19|kgb{74KhSqd72Qqm0LACuhlgo`lpU?Du@*jEkNUlqM^dVP zwD!Gj;tzX!o|A68H89#x7H}ArU17?Gt5AccF3rj7G>aB+zIhM}1dTXJoLuyn#rj3{ z=in%RwxPy!@w2u$Ep2}h_^RQL}B?)FQT~y6#~3IaBk6>bxlW(xe?rWr!=F6J2*H9ggfSZL(|I2YR6#W z(^SoSP&M0ta}-HglMM!`Jrg$e`)ta!1`73@v6-uDdHID(5%GWaczGgo-CPL0oB3YW zOobIbF(f56LbmqT^pH#z_0J;WTh%^F@aFL#zA%z31*~JsJRc_^F$L_`;i%OQO##{` z*VT*IL;DdZ3Tcn3Z~|h5kKez4KRP-BKE&~b1@9QkwcBt@pT6@IpR7PWY2&-Z9{|5g z=saPd^-)iJpf>1rg$uQ;*ZS_>dCj7vq@*5^KfY^)qk5Ix%y(%RM!VkDq5)4Ph1`?s zU>u0h*i7=no5XF* zO_K7EKrlwU{9)z?ThoCmzR(UQxdhuSV#mwVZ2kgycAqDh3rM$-yZUC&u0~O{sk+v)J z4Ubbp6N&WH>j*b z3myl!yX5A5Q&%%vIMQu8;gR!^G4Fh4|r9iQo+2fWn($@fb3ytIHG{3U=lf^7x(d-rRnIlZfAe2yP=q z@YiDojU!&H_dCSxoT0&`1ALd{^8?Qz35k&R_QGreOra!a`Vg@h{y)`XNqJ z$rsXtCV`Yc&47fGFW}&Y_c*DVZcE>hA;cGPj8N$-c!{FmeY7;m;f#f%skxsC$$Iwk zx?+mBSX(-liR7sCE)CZE_$MC~I3?r;ZrQbc8R%?KL5#wuop!|_(mn{+UZN^v#mPd| z;q)?>K@Hl_$#f!xcd249pmji-r2CPZg(YZvVyurW*lQc9`K=3kAu-Ay=mu{V2`^5^ zOiiV`L7lUYxdQ`sNbc}|NE##xAAaAKIurdL?UT&>BHa z4NE(*wLVgQsEM(%??rDRBmmN)&u0CSJ8jRX(ot*$`g?(ibHHiSvQ>n7KTw5d^y&V| z`O!Qpq|5x8u8;9%;_sTy`}H<^DYy?Yrko#pA5A_yd5y!&a^65Dn62{Hg}H@c%v@uj z=NH80$2E57~e+eac zAdL24t1lnY33s_crsUo{zU>r-^$YZrkOBPYw3mqD?RIgbX@gec5Jd@^W8y?PC*Ef@JqkUxJD>6 zA-wDFy>>_&D*SkeY3Aaz>Qy3h7nvo`pMi6S;4g1&k>*0&l~4dXqjvI9Y}Mlu6?_|d zTBs1~Uk6&<%~iL+AlmTi$cIN(7kUu|_H1_wRC}j9w!G}%!r>V)f5HbctxTX-eS(?* z+YI50!~E^h6rOJzR{c3kZ`=pHim}RCRR#t`ag~lAzZeR` zRM?fU$VK#(B9Mv^NF$%J;om3P1kvmBGu`%s8F3-cm?29)7XUMRlpT23F!e6g@hWDl zEh?h3cgo%}AN{Bd{4q7@;+0IZhc z4#-tDGmG1JfZ&jG=j&lCYceM?cdD^4wI2vz9v3g-klVpo{{5Wqjw;ElBdU!(@*#59 zeUL|1=inUsY@Je)RyExte(6XFM?1p$x(fZ?G~Wl%IzPf}eSt-co+Hv?@2;v6;;5pg z?NpHfE)Hvgbeq8zz$V*s4!uhLPuO9cH|>}Na&P-|t0e)eQi@Oqj!Bh2w%8LS%-}uUTjpm%0mBRQF7vLw>KB9ncYEG)<(KWjH62vf zJEDGU%lY#fh?5+36CQ#V8muykQ+ei?P;ul6>s0wxZes_((*f|n?p5Y8^tV2}PJ=O8 z7HojKb8cvJ12AJhG7bp#0mZ2BJikrJ*NR_MA&aAc(oh&bF)SXp%ZvvSI}FR_Txg~i zOu)*%{Sp93*pdmEIMiR8*OP0&J|p&m?`;37$pI|5w`sml9d(LJw5qth z*=x@CKb^)4+8>Ri0Z)NdKwez5dxjPKC{88Sm%qrF_3^bYD)UY04I)@5GOUoHbI^+E zcbAkHG7*tYG(UmxA+Or10$%%_-loGzr^;N)xw*NS2Anh%%uWqA9qId2uJ0Wh<7!~o zd$S^B$eQxuJZ&V32m3rxtPmd+&fD49*(m-tjLar(0(2SYR?TUwv+Ti=z-nBcRg~sEX6{mZxk>{)!m5K{ytUE^EO?59bdXj7vl1fIwNmb zBC(#AS4|_OQL)#y&<@|04HlBjzw}VNWyFN|j$%~DdD)fpjfG*YTOy+XZg5;a>R%!s z4&-V>4QK;E)J>K*y+34?K_3N_QYul%V=dp7iOLFVf%s;Zepvv1cU4SGOi)lzQt~dh z!6k6 zkeP~eHK6qNsVzpjR*&$u5!jO>guji;<=dhQ_siC zQcyJQ<7A|gK65uBRWlRiyxQ}LqiqsLWvJI5t|cJc)$ake5!< za|qEVuF^1@+ptM|+ec96g&OS09yWRGlQb4>UELiuB9%*IXK+X=Pzjltney>?H4MQe zK^OfB)h#VddBI!!CG?&M5E<2oC@^j-xec~~rPP6R9pXX}It#$3SV5Ny;f;!$Z*Wbr zoMvz{mE)uzgU&T_p-cErC;WH6EQk1Rt$MedUjB^t=(gO8&EcGvShla)A|@qUYt&if zZ%;|JDzI$H49$Sf$oBU3S3*S%@Srd(P5MwE7G|lbz8Bok&`0^l(O9=0F}m!?IxWM6 zVN}UP3T0umOL7iv<(gZeEG`Cy$p+rE{|;fG#aoVb-pg!X*3r=^e868MB<3Ky&IXgk zI{JkW?X0QMj{`U&)+qp%1vM-I&fE?j1K4SJi0#`|Z}<@_On*@dw$*ZRz5+9AhQ2-( znG(SQx_p+S)$o}@M1f*5GZ)ByzFJ?p-BD6H)8V~L6nx40yPNqF5w9X5>VdfXdCXX# znH?ZgHen)y?Yb=eytjUYfhY!mWJ=MK?ar5CprMg3d-Jc5!cCq*#2(FG567mYk9YKV zk;k>z>;oQ_85i!T+JU_ogQSPu&})kwmp-}lAwrwf@#jwTLD^4a>K}8 zU?4Z<0no=7ZD3Cqx|VWb=YxTHVc{PmCBCZ3PNZP^NJe$!fGzgg+*@HS39(WwdEq?@ zN5sSMJKCzbVNGA+ffHhl<9~mj;s#&3{6C^#9{_y}Ksv|4&I93LH5AZw0&GVz5OrHJ zr!zlDgZI`Qzj?Cl>sWzV2)jUgOC<2XE-w1$O@rDR)0qq=_Q7S{! zBL>F~_BaQsO-QxL0qbCEDgiw`jWl~CGDQvi7@IfOz*5ea%AIj<9b95zJ0XLYS zZg^7eZ`azp7mwF+{?RN}CR&Bf;Z=`6Cz1#`6(bY*a@d7tj?9+hO>MowL*fseH=JCt z5}IpZf5h^N`QI^*b%25TpP&ag*+v!Tq<24y0PvjKGFXBHHHxX&zxVpQHyo`7FOXJh zWkSyOk?3k`565hlc!*Q|9N7L@$!mFftZtC~`uaN}g_ZE+-HaCW0>Ha82Yru(0*%2~ zv1DRo2mCF1aO~E~nIzOC>mpB07_)V-+SA9kic7L;o#~vLL0MfSQ{ZsA3O;7R|CnD{ z5e1+A-newo?US|2A%68r6d)cT5oWJW_r2Z-K-Tm}mfKRPu7garMIu3g2PFlj^z$L|)mTE5b; zzK?C#YW4$}N-;5hHeH?JsBr-cf|I(~G-tbjx zib5_tP=Zvg?g{<#X(%{wiq?LgTna-UtST<${w3s?i2P-6F59%dm!`l3`E~Pa{?-Tx z7d2oh2*ZHu@<*mah(a8t!1$CtHDFNFR)LvHo|_ZbwNh(f;SFiQOj`SJOV0;xg1 zVXb}^g?i&D>Mnx4oK;1QC)({>}^1F|5q0+urQ8Y@@ci zx1@ir$)=H9Ld&Lv)JO(@fe$gS;NqB91rUhc+hx74iuumZ!`GInLY^F}3sG?UnY%3FnXU*78Nu(9Xi_bz+E zrDhwHI&}KVyTZKX+;tO@hXrcv<0kc6GDyZ)Zh2T`cx8tSxj8r(cd(3T^+^_87utz%X#nK+WccJ~F&3DN_ zbj4t$%R02urg46?Wu0B)-W%}bR51)3!aOwrJ~2$=X#?&3+DTH^b(CMNQJo zb6eyOQ(-&z7Tc<*U6@nxSnwqN%4KO~5nHmCxwSJrB6-L-VHK^iSau>J^>db2!A4}g z_w=KssiF^2*RDEJj;1p&5?zU?xgY)nFL#%1w~tcRdn-jORzsHCt@UfbgFZVkCEThO zM(O5Jz}*igVfB@VTjR zoAw=H>Ba4BAHimthnsB>>noQ?pFgRSa$YcDFk_CsY@l7uqr@AT$fQmArmG6CZ!SqO z?j6yKWrhb9CvVP`E?Low`iji^2ik&pt~tmI##2 zFpWd9pF-l{c$Jaf$%DgpiCY~*id?JfeA2jf(w!6^nMMzzQd(7{b?&ff@I+$PVNv-K zhlHKJQ~>!$-e~FD@G8B60hXFJ7_kaT@Ub8T!4IfWd2i)g6h3M6jz{byibkwcbVEZr z;Ll#tt(@m3xS_P z-fSc#*ZeZU#;-0S$^%;2`xm{BuwSW=j$f8hIHF9{a3lN`{-NTi8b7=RD*lP}!b@76 zqbf?4R)12G@uqzfdx!Q(cr43m{pAuKnovNh739D#(ncA&^$iRBr=g;&{94gE^#1{=Q0V6X literal 0 HcmV?d00001 diff --git a/docs/image/yocto/tasks_do_fetch.png b/docs/image/yocto/tasks_do_fetch.png new file mode 100755 index 0000000000000000000000000000000000000000..bfbe509d28706ecb1ce0935fff42aa0868619284 GIT binary patch literal 55487 zcmZsC1yqz>)UMKkbPCeaB_JUwT@piw4BaI?w9<`$NQ0Ep-3$yJ(nt>_-3%aI_vQP( z|E_!Qx~w(KnltmB_r%`MdG@pS8=&`Q*tHYz28~^(Rk|GJzL52GWx!PZ^Zo z%>!RNbyb&>d{RF0atHW;VkMz0@#INW9M-J~D)9N)M|nNhCr@y?9$!!UoC?jKJek#0 zke1MdfcG=eKM=`L^a}9r^PLlEyczE%vm;P4Eygy8X6z-3;XdPyhyYcw8RrxdRR!td zNj${|z4Jbz1nsvn+U}qEcvuO3+xR5h7$ofV0PAa+1O77oF6KPX@l+rmLUKC9{h^TK zRj<>{Z#2{IK}BB}9Z1+yM$=v(`686Qv1f?~EJ3|o&kq+VC@EY0@0w#M1P~9hj!qK5Hy%|JVRhmbx6otOhGjzB`lAz(id#JWx7?qgWotdH?g$% zBKb?S%T5rpVm{}kDJdyaB|24#U6dlVkgAPu9O>LHC;?NfOfN-CtcG=8xVY#?V9n0Y z|LX14*DA8k(?%18Fa~4MH#9WBo88$;Oonx@cBkyf-kQd)2nz`n23FVxxhAKkIv=n0 zoNkReEjIToFH>(>U!7REZjEp+bXb|2ublne`7NmU+_+5;=a`d$nv9Uu!NK7*>nBi^ zqD=b2!UruqhAv8IL&Hq9MSWveQQ%94HYcOd1ERAk$PbAQ!){8?X+0A5v95+-(Ae{U}* zf4%zn-HLeHmad-nuRTm*w0|4?e0|5Z@;6OK+l7w6iB6p*bqB9FMW9@5OQJMwyPquw zFKWzI1`Bd3I_v_~oKU!S!cTC-8ZbC+?^zs))f@^5C`615KO6sSrWUbozM%%Q2KpK> zIyoJM;ZmPW5o351CwC-&0-B~)`fBYnNsPsEb3Uj$Zy*r-d;spAHU?-|QCgM$Oje_@Mm#50d8R!_~wj8>6g8LvZ&rWfn=&gJ4;B$fodo5i*vkMCTGeZFee(eQvcm=L%@!Z^d){>{fQvvIz zTAeFS3ymFdg-9JLYzLt~)dzwe${otG20O0;Rk*)*Flh;*abF(58;oH7qE))9#}#XC z7g;1X1cY6|IKO+#vGGgt7Q1Jp?_i4hfz z#XM*gsK>{vsS|knwa|E-lGWZK?X>4h-T4-jJEsJMiTd1GuOt0;33B!KciE^I-vH>vx*gY<<|YL5^fi8Vr|SIrXe_z+g{OI9rGw&G57@d`x6 zC7avnrgCj6uT_06xV*`A>-+Fxizo3Jrh*SIfHzyC*`BAHWpg!FCeLkbY$PNk>}JZV zY7GADwbdjojuq#>yjE#NlIFCgBmSZvxG%qcB|=BP>4_rs z^6@Fie^v7s>3y{#Dk_SItSi>B29^er^f*Lv5j3dPsN>6xa>JI~yu7ZiE= z&_nPtVjZ?T8mkWOLUXd@m(oJ+%EJb0@mX4~R%DnWipdMDbtaacql!VMxGto0p#cwB z&>w{)?3WI`(L3koSim}qLTK(UNWEfe1*AUXf{$B9(zf?1#6gqRboIi>62CjpQ6Npt zLbvB|QmIfVx68VLQNZ0XbwD(QVC8A0$s#>Ha%t&MrR}=>hPF(PhZW6N(GyI+>m7I` zd7WtsFPe`sQTlvtOD_fR@^?Cx9@nqI+alG>@xbyE?XQ@;%$c8zO63PjjMvQ<-g_`V}nz0cB zhe%9}p}l=U?o9`qe-4bUKyY|%iT{738ngcVb(0U0Qo(;Px-jN zCGYRE9m(M?h}9s&Q|G`jExckg&~5rt8+h@vPHHX;yH%HJSB)R2mV7UF=RbB^Dx<;p z#h93!Ps3#;!x$@$S?|85cRXTZ)1l6U5zdohGh<-pd_g+5n0n3t9N#84pE_s08LIbL zEG>PLcu1mqyTJWM`qtqD$yfb2L9e9lvhNAnd$PBsW`sKz!-Tzc611#r9X&4Vzh_@+ z8J5vkF+03EiIsZEMs~Qe$b_x5#FxzVwbxTPL627dRtdA9lIg(-ecK-q&>M4URI6(} zd3&|QvG;w<*w|=Fzh|XE9wzgAQR^WYxq4T?Zpy}SY=%oSN^dDhX9s7Ws1PSKrcBd~ z#H*p7-u_k)<6dboq-r7i{O{P5uf&XI=ZY4Lw}PP8XkkU`mASbf>OtA^tfs!=hdUD~ z?jDRYbf@qx9-dsy3d$brwxdw!PrFv1E05;Jk4&wJQ#o?gKQZ}&W?uI6)4HjjtiaE& z^sWt_X7I=C!q1A6Ig@V6qT`naC7pw~QeCjYb+p~GI5w9zYrj1hP6(JdJG}_l9AXIq z%BYf`7)+x4J67yh*QJ{b?%PABtTsH5b5A5$r^ud?u|pl`VN_h*0T?&PQM<&^=|+BX z+Z@55F|m>!>!+&4$vTV%B(`W{n1;IVB01?)1jCrp@e~ z!AL2@3@d)nuwNX3Pga~rt_Gi`xAE5PfCYZdG-)rkfi+tEXX>?GN^jEeht15)maDK- zWA(+Wy(oWgj`G{iym{+^4)6BuYvYUxRJL_jyZik4j=QQv^!CBlD4T<|UFGwCfSm02 z3?@<`Ua9f@Uyqo>RxMaXgSCsF)OkH+_B}h@E0ql+8(X=mI89Fa^yvwBf=ud#?*L33 z+|YXpeMLas{QFN(uj_kRjZ8+|S~xdznWNf{IZlefiaRJxENGDm>oEAbpIG<7Kj3t^&W`4PU= z{3{Tu1;aE9TzBTU@{Cm?xrs4HgM`T z((8O*uP=@|E-Fgc`!9m_nK*2bpMRQthylH=QR%0(U(si|pu$3Cdolt79;=akK09qL z1IwtMTtm=Gl$77f;Ex34?1Y5Cng0Ip_4V~Uxi~uc#w;9avC?Z-de$WJOCV}02e)F< zK1ME$;}#_NL%Gz7I zvF{^6=&;XP)?K?{*n6=u0RgI$&nc!4PDgL590%Ef!EOs8o;|~FYI;Gz&ptS!a(6mf z(b;+KIA2RJBjM{SIPLA@B*Bhv9Q-m08Qmibi0P*9?{AVDvGad2&Cd??0*8Cg`N4># zWukVOe(7$LeQrBxSS+%W_2c`G#Fm6q@rQtY>9`lalXdVzl_geOV~xDjd*tN%$70r= zJAB1Sjg z4Hb3Cx|^243XN(6w3XK2eykw!}=!U=B8zwHT&&E6~9q@`r!TkOdoXs zbXHI=bJQ-;vQ2ObT+Vk@`QF&q?XggL@M9Ex>vMxUxv)X>SATYFt4?fR;Fb_2^1Q>tY8pR~u zc>(3+?!lJ7+w;SD=`>O-uB}a~c7rsS!*J+mc+5mSWqVX@O6Ap7TxKGL4q<-#Po}L+ z6|AAaUEfu948HW}dDb)5+{bC2oR|_)`#YM~mVnC)4tC#0lye&}#Q~8hl6bAVRNIIk zuqJLLTr3DxD*OC)8l;L#soo8uBh8!k8YgCEoC}36g6isTZF&N1Jy=n9c36y4!MJ-f zvR>+N{g|apHjF9M9IYb;TD<`{h~D9qsj2BnnVgHI_BW%nOTHI+da2A&%USXG%w?nA zquf7CN}MTHYto)C3ZA5*6?(Nupx4{NXB?_|=)2Vel`OwfHYc2O`aeZ)zAm<)Jf`5! zuUoa#o<^TI&aVk6EzM#xg|JZbs~b0dKDxC(`(d`ccV^46r|Dc3O2ZDn(e9(Zp+VKX zIkOclgu??oQ}7L}2^p7cxIY_FIBSCPOjfd=&&o?Ax!zuf=Q&;(-E`Cf`b-PK?Sl2Y zgwZPK(A>$VzB>9-~12SRj!*+BvLX%@qRDq3dLL*=6_g%LqVWRfVix+$?@8f^f z@g#WAXyq&vHD6*rMzLZPuV3o+OCN452HZB@uNc1NZ>^wu*2ycnOQj&>%W=1vw6^aw zC1r$qJ6NvSh-=p+hkRDbeNv*illN3lkPtYz<& zWAtsPzC>T(>d00_av4mgR59%gGvqL~mVI0CczV)e+AWCNXIBR1cM!Y9583eBQ<_Ta zl*KGwC~GSe5fPb9#;I~Ln!p0>dC_L0wjBc!1U3bKMpX$rMX@nGDiP!WnYzZNgX(yc z*&}1)!4R&$1cS|PY*poGFU~3=hs6+y48*xcE)xIb5%lj^l7`~=7N8oK?_VA$gL#Z+ z<)5Oq(I6&BJ#FL=*UNDC8>EoS?rwphi>U*rsFUB><*L!A-=>-TC#ud)K0)>z-9fQ2 zQ8=+KSf}pqt}-`FCcN?alQ*%v0sOKixJ+8Ky;%H0dhc)waM-Ax!G_;XnV7OU7KO#UKd#Guc+2gZSxXW={PJ3$n~i*E*FG>% zLwB`(YBkijD-`>>Kff#Zw<7)B4z011<$!u-y zA}>1pFfJy}jIHwWR`qyXSTB{Y<`7J3G5xOalnU&_g&Y5EwXCcRAEG_|);|9`52X{0 zi>IfRQEA`kFd;St%lCGTl_ucS2;oL;Q1RNJu7+zc)F0KI#&qZcf=gDH5A);vwpimHn-a5M(;D1*b>VpQNBM2S( zYHfQw5BR@8%ok?Z!xDa-DeSp9oNho>RsPP+?W<{$_Q@%HSlIh^c49)ZN}J8F)jKH{ z{8bW^&2_VCkx@-R5`~GatMde;Q#z%1QplxmUZh)+#Jp<@B0Njw9kv`w$x8NQW@UA` za9qZwm~LuuQc_gJ#Kx|wuaAt0Nfq`~F*ip6BO{$RH43Jub9HMIxzkH3Pg)J9MYL~i zZ2bA!)a>{H3IRz=2gk&mNoQu#*#)8v!|a7^YEyTiJ1z)BAxjC+up%p zeV8V)SwC`kPi-9Xl}0%?b`M#A0L32Qy^UTpM&GNSg8**Y^2)_|vAHf>Xg?O!$LD5c z#aKoOxJoh7TUVD%q}F9avHO{T7FJXU#!_z#XZUYG)r&_;8BA4-6`B@$TPBSWPhT01 zk@KUFFO|7sFFheQD=RBj*jH2YYeR#;rYAGC&{xk(gvtAjN`6{eiKWK%LOX^!klaJ# zrly1L@I-;qI^TP3ZKbNnB$i!U7M5K$ZT3Dk$De``m5rH;m5j*EdcxD{R7X%Ig^ z)Nf2Q^TtT7ft2dic+c?|5UItnJ@fgz<17qv$mQQ{)G~%0A0Jy<@}3{zN{W`t7%dy> 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