summaryrefslogtreecommitdiffstats
path: root/bsp/meta-boundary
diff options
context:
space:
mode:
authorToshikazuOhiwa <toshikazu_ohiwa@mail.toyota.co.jp>2020-03-30 09:24:26 +0900
committerToshikazuOhiwa <toshikazu_ohiwa@mail.toyota.co.jp>2020-03-30 09:24:26 +0900
commit5b80bfd7bffd4c20d80b7c70a7130529e9a755dd (patch)
treeb4bb18dcd1487dbf1ea8127e5671b7bb2eded033 /bsp/meta-boundary
parent706ad73eb02caf8532deaf5d38995bd258725cb8 (diff)
agl-basesystem
Diffstat (limited to 'bsp/meta-boundary')
-rw-r--r--bsp/meta-boundary/classes/image_types_boundary.bbclass117
-rw-r--r--bsp/meta-boundary/conf/distro/boundary-wayland.conf16
-rw-r--r--bsp/meta-boundary/conf/layer.conf22
-rw-r--r--bsp/meta-boundary/conf/machine/imx6-acl.conf52
-rw-r--r--bsp/meta-boundary/conf/machine/nitrogen8mm.conf43
-rw-r--r--bsp/meta-boundary/dynamic-layers/qt5-layer/recipes-qtbrowser/qtbrowser-qt5/qtbrowser-qt5_git.bb24
-rw-r--r--bsp/meta-boundary/dynamic-layers/xfce-layer/recipes-xfce/images/boundary-eval-image-xfce.bb47
-rw-r--r--bsp/meta-boundary/licenses/boundary2
-rw-r--r--bsp/meta-boundary/recipes-boundary/app-startup/app-startup.bb27
-rwxr-xr-xbsp/meta-boundary/recipes-boundary/app-startup/files/app46
-rw-r--r--bsp/meta-boundary/recipes-boundary/app-startup/files/root.profile5
-rw-r--r--bsp/meta-boundary/recipes-boundary/daemonize/daemonize.bb16
-rw-r--r--bsp/meta-boundary/recipes-boundary/devregs/devregs.bb22
-rw-r--r--bsp/meta-boundary/recipes-boundary/images/boundary-image-multimedia-full.bb16
-rw-r--r--bsp/meta-boundary/recipes-boundary/libmdi2300/libmdi2300_git.bb30
-rw-r--r--bsp/meta-boundary/recipes-boundary/printer-tools/printer-tools_git.bb30
-rw-r--r--bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/COPYING282
-rw-r--r--bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/syslogd4
-rw-r--r--bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/sysklogd-config-remote.bb23
-rw-r--r--bsp/meta-boundary/recipes-boundary/video-input-icon/files/COPYING12
-rw-r--r--bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5640-MIPI-Test.desktop9
-rw-r--r--bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5642.desktop9
-rwxr-xr-xbsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input1
-rw-r--r--bsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input.desktop9
-rwxr-xr-xbsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5640-mipi-test1
-rwxr-xr-xbsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5642-test1
-rw-r--r--bsp/meta-boundary/recipes-boundary/video-input-icon/video-input-icon.bb60
-rw-r--r--bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state.bbappend6
-rw-r--r--bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx6/asound.state1878
-rw-r--r--bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx7/asound.state1374
-rw-r--r--bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-boot_%.bbappend45
-rw-r--r--bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-mkimage%.bbappend5
-rw-r--r--bsp/meta-boundary/recipes-bsp/u-boot/boundary/fw_env.config1
-rw-r--r--bsp/meta-boundary/recipes-bsp/u-boot/u-boot-boundary_%.bbappend4
-rw-r--r--bsp/meta-boundary/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend11
-rw-r--r--bsp/meta-boundary/recipes-bsp/u-boot/u-boot-script-boundary_%.bbappend6
-rw-r--r--bsp/meta-boundary/recipes-connectivity/bluez5/bluez5/0001-hciattach-add-QCA9377-Tuffello-support.patch2379
-rw-r--r--bsp/meta-boundary/recipes-connectivity/bluez5/bluez5_%.bbappend12
-rw-r--r--bsp/meta-boundary/recipes-core/busybox/busybox/custom-ash.cfg3
-rw-r--r--bsp/meta-boundary/recipes-core/busybox/busybox_%.bbappend8
-rw-r--r--bsp/meta-boundary/recipes-core/init-ifupdown/boundary/interfaces27
-rw-r--r--bsp/meta-boundary/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend3
-rw-r--r--bsp/meta-boundary/recipes-core/microcom/microcom_git.bb15
-rw-r--r--bsp/meta-boundary/recipes-core/psplash/files/boundary-logo-img.h1776
-rw-r--r--bsp/meta-boundary/recipes-core/psplash/psplash_git.bbappend3
-rw-r--r--bsp/meta-boundary/recipes-graphics/xinput-calibrator/xinput-calibrator_git.bbappend8
-rw-r--r--bsp/meta-boundary/recipes-kernel/kernel-iio/kernel-iio.bb51
-rw-r--r--bsp/meta-boundary/recipes-kernel/kernel-modules/kernel-module-qcacld_git.bb18
-rw-r--r--bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-bdsdmac_git.bb35
-rw-r--r--bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-gslx680_1.0.bb29
-rw-r--r--bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware_git.bbappend16
-rw-r--r--bsp/meta-boundary/recipes-kernel/linux/files/arm64/defconfig591
-rw-r--r--bsp/meta-boundary/recipes-kernel/linux/linux-boundary_%.bbappend10
-rw-r--r--bsp/meta-boundary/recipes-sato/images/boundary-eval-image.bb48
-rw-r--r--bsp/meta-boundary/recipes-sato/packagegroups/packagegroup-core-x11-sato.bbappend2
55 files changed, 9290 insertions, 0 deletions
diff --git a/bsp/meta-boundary/classes/image_types_boundary.bbclass b/bsp/meta-boundary/classes/image_types_boundary.bbclass
new file mode 100644
index 00000000..57916bad
--- /dev/null
+++ b/bsp/meta-boundary/classes/image_types_boundary.bbclass
@@ -0,0 +1,117 @@
+inherit image_types
+
+BOOT_START = "4"
+BOOT_SIZE = "32"
+BOOT_END = "36"
+ROOTFS_START = "36"
+ROOTFS_SIZE = "700"
+ROOTFS_END = "736"
+APPFS_START = "740"
+APPFS_SIZE = "2856"
+APPFS_END = "3596"
+SDCARD_SIZE = "3600"
+SDCARD = "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.sdcard"
+IMAGE_BOOTLOADER = "u-boot"
+
+IMAGE_DEPENDS_boundary = "parted-native:do_populate_sysroot \
+ dosfstools-native:do_populate_sysroot \
+ mtools-native:do_populate_sysroot \
+ virtual/kernel:do_deploy \
+ ${@d.getVar('IMAGE_BOOTLOADER', True) and d.getVar('IMAGE_BOOTLOADER', True) + ':do_deploy' or ''}"
+
+create_blank_sdcard_file () {
+ # Initialize a sparse file
+ dd if=/dev/zero of=${SDCARD} bs=1M count=0 seek=${SDCARD_SIZE}
+ # Create partition table
+ parted -s ${SDCARD} mklabel msdos
+}
+
+create_and_burn_boot () {
+ # create boot partition
+ parted -s ${SDCARD} unit MiB mkpart primary fat32 ${BOOT_START} ${BOOT_END}
+
+ # Create boot partition image
+ [ -e ${WORKDIR}/boot.img ] && rm ${WORKDIR}/boot.img
+ dd if=/dev/zero of=${WORKDIR}/boot.img bs=1M count=0 seek=${BOOT_SIZE}
+ mkfs.vfat -n "BOOT" -S 512 ${WORKDIR}/boot.img
+ mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin ::/${KERNEL_IMAGETYPE}
+
+ # Copy boot scripts
+ for item in ${BOOT_SCRIPTS}; do
+ src=`echo $item | awk -F':' '{ print $1 }'`
+ dst=`echo $item | awk -F':' '{ print $2 }'`
+
+ mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/$src ::/$dst
+ ## FIXME in the class code ---------^
+ done
+
+ # Copy device tree file
+ for DTS_FILE in ${KERNEL_DEVICETREE}; do
+ DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
+ if [ -e "${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb" ]; then
+ kernel_bin="`readlink ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin`"
+ kernel_bin_for_dtb="`readlink ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb | sed "s,$DTS_BASE_NAME,${MACHINE},g;s,\.dtb$,.bin,g"`"
+ if [ $kernel_bin = $kernel_bin_for_dtb ]; then
+ mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ::/${DTS_BASE_NAME}.dtb
+ fi
+ fi
+ done
+
+ # Burn Partition
+ dd if=${WORKDIR}/boot.img of=${SDCARD} conv=notrunc seek=${BOOT_START} bs=1M
+}
+
+create_and_burn_rootfs () {
+ # Create Partition
+ parted -s ${SDCARD} unit MiB mkpart primary ${ROOTFS_START} ${ROOTFS_END}
+
+ # Temporarily move the app&boot folders away and leave empty mount point for partition creation
+
+ [ -d ${IMAGE_ROOTFS}/../app ] && rm -rf ${IMAGE_ROOTFS}/../app
+ mv ${IMAGE_ROOTFS}/app ${IMAGE_ROOTFS}/../
+ mkdir ${IMAGE_ROOTFS}/app
+ [ -d ${IMAGE_ROOTFS}/../boot ] && rm -rf ${IMAGE_ROOTFS}/../boot
+ mv ${IMAGE_ROOTFS}/boot ${IMAGE_ROOTFS}/../
+ mkdir ${IMAGE_ROOTFS}/boot
+ # Create rootfs image
+ rootfs=`mktemp`
+ dd if=/dev/zero of=$rootfs seek=${ROOTFS_SIZE} count=0 bs=1M
+ mkfs.ext4 -F -i 4096 -L "rootfs" ${rootfs} -d ${IMAGE_ROOTFS}
+ dd if=${rootfs} of=${SDCARD} conv=notrunc seek=${ROOTFS_START} bs=1M
+ rm $rootfs
+ rm -rf ${IMAGE_ROOTFS}/app
+ mv ${IMAGE_ROOTFS}/../app ${IMAGE_ROOTFS}/app
+ rm -rf ${IMAGE_ROOTFS}/boot
+ mv ${IMAGE_ROOTFS}/../boot ${IMAGE_ROOTFS}/boot
+}
+
+create_and_burn_appfs () {
+ # Create Partition
+ parted -s ${SDCARD} unit MiB mkpart primary ${APPFS_START} ${APPFS_END}
+
+ # write the application partition
+ appfs=`mktemp`
+ dd if=/dev/zero of=$appfs bs=1M count=0 seek=${APPFS_SIZE}
+ mkfs.ext4 -L "app" -F -i 4096 ${appfs} -d ${IMAGE_ROOTFS}/app
+ dd if=${appfs} of=${SDCARD} conv=notrunc seek=${APPFS_START} bs=1M
+ rm $appfs
+}
+
+create_sdcard_symlink() {
+ SDCARD_LINK=`echo ${IMAGE_NAME} | awk -F "-${MACHINE}" '{ print $1 }'`
+ [ -e ${DEPLOY_DIR_IMAGE}/${SDCARD_LINK}.sdcard ] && rm ${DEPLOY_DIR_IMAGE}/${SDCARD_LINK}.sdcard
+ ln -s ${SDCARD} ${DEPLOY_DIR_IMAGE}/${SDCARD_LINK}.sdcard
+}
+
+IMAGE_CMD_boundary () {
+ if [ -z "${SDCARD_ROOTFS}" ]; then
+ bberror "SDCARD_ROOTFS is undefined. To use sdcard image from Freescale's BSP it needs to be defined."
+ exit 1
+ fi
+
+ create_blank_sdcard_file
+ create_and_burn_boot
+ create_and_burn_rootfs
+ create_and_burn_appfs
+ create_sdcard_symlink
+}
diff --git a/bsp/meta-boundary/conf/distro/boundary-wayland.conf b/bsp/meta-boundary/conf/distro/boundary-wayland.conf
new file mode 100644
index 00000000..0816b144
--- /dev/null
+++ b/bsp/meta-boundary/conf/distro/boundary-wayland.conf
@@ -0,0 +1,16 @@
+# Boundary Distro for Wayland.
+
+require conf/distro/fslc-wayland.conf
+
+DISTRO = "boundary-wayland"
+DISTRO_NAME = "Boundary Wayland"
+
+# Use fsl version of GStreamer for now as there's no gstreamer-imx for imx8m yet
+MACHINE_GSTREAMER_1_0_PLUGIN_mx8mq = "imx-gst1.0-plugin"
+PREFERRED_VERSION_gstreamer1.0_mx8mq = "1.14.imx"
+PREFERRED_VERSION_gstreamer1.0-plugins-base_mx8mq = "1.14.imx"
+PREFERRED_VERSION_gstreamer1.0-plugins-good_mx8mq = "1.14.imx"
+PREFERRED_VERSION_gstreamer1.0-plugins-bad_mx8mq = "1.14.imx"
+
+# Use i.MX libdrm Version
+PREFERRED_VERSION_libdrm = "2.4.84.imx"
diff --git a/bsp/meta-boundary/conf/layer.conf b/bsp/meta-boundary/conf/layer.conf
new file mode 100644
index 00000000..bbedc134
--- /dev/null
+++ b/bsp/meta-boundary/conf/layer.conf
@@ -0,0 +1,22 @@
+# We have a conf and classes directory, append to BBPATH
+BBPATH .= ":${LAYERDIR}"
+
+# We have a recipes directory, add to BBFILES
+BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend"
+
+BBFILE_COLLECTIONS += "boundary-layer"
+BBFILE_PATTERN_boundary-layer := "^${LAYERDIR}/"
+BBFILE_PRIORITY_boundary-layer = "8"
+LAYERSERIES_COMPAT_boundary-layer = "sumo thud"
+
+LICENSE_PATH += "${LAYERDIR}/licenses"
+
+# The dynamic-layers directory hosts the extensions and layer specific
+# modifications related to Boundary Devices products.
+#
+# The .bbappend and .bb files are included (only) 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())}"
diff --git a/bsp/meta-boundary/conf/machine/imx6-acl.conf b/bsp/meta-boundary/conf/machine/imx6-acl.conf
new file mode 100644
index 00000000..a1a32a3d
--- /dev/null
+++ b/bsp/meta-boundary/conf/machine/imx6-acl.conf
@@ -0,0 +1,52 @@
+#@TYPE: Machine
+#@NAME: Boundary Devices ACL
+#@SOC: i.MX6 Q/DL
+#@DESCRIPTION: Machine configuration for Boundary Devices ACL
+#@MAINTAINER: Gary Bisson <gary.bisson@boundarydevices.com>
+#
+# By default, this machine will build for the standard Solo, 512M
+# option. To build U-Boot for other CPU or memory combinations,
+# you can set the UBOOT_MACHINE variable in your local.conf
+# according to the following table:
+#
+# Processor Memory Configuration
+# -------------- ------ --------------------
+# i.MX6Quad 2GB acl_q2g_defconfig
+# i.MX6Solo 512MB acl_s512m_defconfig
+#
+
+MACHINEOVERRIDES =. "mx6:mx6dl:mx6q:"
+
+include conf/machine/include/imx-base.inc
+include conf/machine/include/tune-cortexa9.inc
+
+KERNEL_DEVICETREE = "imx6dl-acl.dtb \
+ imx6q-acl.dtb \
+"
+KERNEL_IMAGETYPE = "zImage"
+
+PREFERRED_PROVIDER_u-boot = "u-boot-boundary"
+PREFERRED_PROVIDER_virtual/kernel ?= "linux-boundary"
+
+# Use SPI NOR U-Boot by default
+IMAGE_BOOTLOADER ?= ""
+
+IMAGE_FSTYPES = "sdcard.gz"
+
+# Shorten boot volume ID (FAT limitation)
+BOOTDD_VOLUME_ID = "Boot"
+
+# Ensure boot scripts will be available at rootfs time
+do_rootfs[depends] += "u-boot-script-boundary:do_deploy"
+
+# Boot scripts to install
+BOOT_SCRIPTS = "6x_bootscript-${MACHINE}:6x_bootscript"
+
+UBOOT_MACHINE ?= "acl_512m_defconfig"
+
+SERIAL_CONSOLE = "115200 ttymxc1"
+
+MACHINE_EXTRA_RRECOMMENDS += " linux-firmware-gslx680 \
+ libiio libiio-iiod libiio-tests \
+ libmdi2300 libmdi2300-examples \
+ printer-tools kernel-iio "
diff --git a/bsp/meta-boundary/conf/machine/nitrogen8mm.conf b/bsp/meta-boundary/conf/machine/nitrogen8mm.conf
new file mode 100644
index 00000000..446fe9db
--- /dev/null
+++ b/bsp/meta-boundary/conf/machine/nitrogen8mm.conf
@@ -0,0 +1,43 @@
+#@TYPE: Machine
+#@NAME: Boundary Devices Nitrogen8M
+#@SOC: i.MX8 MQ
+#@DESCRIPTION: Machine configuration for Boundary Devices Nitrogen8M
+#@MAINTAINER: Chris Dimich <chris.dimich@boundarydevices.com>
+
+MACHINEOVERRIDES =. "mx8:mx8mm:mx8m:mx8mq:"
+
+require conf/machine/include/imx-base.inc
+require conf/machine/include/arm/arch-arm64.inc
+
+# Kernel configuration
+PREFERRED_PROVIDER_virtual/kernel ??= "linux-boundary"
+KERNEL_DEVICETREE = "freescale/imx8mq-nitrogen8m.dtb \
+ freescale/imx8mq-nitrogen8m-m4.dtb \
+ freescale/imx8mm-nitrogen8mm.dtb \
+"
+KERNEL_IMAGETYPE = "Image"
+RDEPENDS_${KERNEL_PACKAGE_NAME}-base = ""
+
+# U-Boot configuration
+PREFERRED_PROVIDER_u-boot ??= "u-boot-boundary"
+PREFERRED_PROVIDER_virtual/bootloader ??= "u-boot-boundary"
+SPL_BINARY = "spl/u-boot-spl.bin"
+UBOOT_DTB_NAME ?= "imx8mm-nitrogen8mm.dtb"
+UBOOT_MACHINE ?= "nitrogen8mm_2g_defconfig"
+UBOOT_MAKE_TARGET = ""
+UBOOT_SUFFIX = "bin"
+
+# wic support
+WKS_FILE = "sdimage-bootpart.wks"
+IMAGE_BOOT_FILES_append = " \
+ boot.scr-${MACHINE};boot.scr \
+"
+WKS_FILE_DEPENDS_mx8 += " \
+ u-boot-script-boundary \
+ e2fsprogs-native \
+ bmap-tools-native \
+"
+
+SERIAL_CONSOLE ?= "115200 ttymxc0"
+
+MACHINE_FEATURES += " pci wifi bluetooth"
diff --git a/bsp/meta-boundary/dynamic-layers/qt5-layer/recipes-qtbrowser/qtbrowser-qt5/qtbrowser-qt5_git.bb b/bsp/meta-boundary/dynamic-layers/qt5-layer/recipes-qtbrowser/qtbrowser-qt5/qtbrowser-qt5_git.bb
new file mode 100644
index 00000000..902aa8e8
--- /dev/null
+++ b/bsp/meta-boundary/dynamic-layers/qt5-layer/recipes-qtbrowser/qtbrowser-qt5/qtbrowser-qt5_git.bb
@@ -0,0 +1,24 @@
+require recipes-qt/qt5/qt5.inc
+
+DESCRIPTION = "QT Browser"
+PR = "r0"
+LICENSE = "CLOSED"
+
+DEPENDS = "qtbase qtwebkit"
+
+SRCREV = "57ac373f948498810c3f276fe712e67f5ec0d4aa"
+SRC_URI = "git://github.com/boundarydevices/qtbrowser;branch=qt5"
+
+S = "${WORKDIR}/git"
+
+PARALLEL_MAKE = ""
+
+
+do_install() {
+ export INSTALL_ROOT=${D}
+ make install
+}
+
+FILES_${PN} = " \
+ /usr/bin/* \
+"
diff --git a/bsp/meta-boundary/dynamic-layers/xfce-layer/recipes-xfce/images/boundary-eval-image-xfce.bb b/bsp/meta-boundary/dynamic-layers/xfce-layer/recipes-xfce/images/boundary-eval-image-xfce.bb
new file mode 100644
index 00000000..af83840a
--- /dev/null
+++ b/bsp/meta-boundary/dynamic-layers/xfce-layer/recipes-xfce/images/boundary-eval-image-xfce.bb
@@ -0,0 +1,47 @@
+DESCRIPTION = "A XFCE desktop demo image."
+
+IMAGE_FEATURES += "splash package-management ssh-server-dropbear hwcodecs dev-pkgs"
+
+LICENSE = "MIT"
+
+inherit core-image distro_features_check
+
+REQUIRED_DISTRO_FEATURES = "x11"
+
+CORE_IMAGE_BASE_INSTALL += "\
+ packagegroup-core-boot \
+ ${ROOTFS_PKGMANAGE_BOOTSTRAP} \
+ packagegroup-core-x11 \
+ packagegroup-xfce-base \
+ kernel-modules \
+ \
+ nodejs \
+ packagegroup-fsl-gstreamer1.0-full \
+ \
+ flex \
+ gcc \
+ git \
+ m4 \
+ make \
+ iperf3 \
+ libtool \
+ nano \
+ python-compiler \
+ strace \
+ screen \
+ minicom \
+ openssl \
+ cryptodev-module \
+"
+
+# For silex module support uncomment the line below and register your ssh key on our webserver to get access.
+# Silex requires some terms and conditions to be accepted before you can build
+# Please fill out the form located here for access: https://boundarydevices.com/private-git-access/
+#CORE_IMAGE_BASE_INSTALL += "kernel-module-silex linux-firmware-silex"
+
+# Video input demos only on nitrogen6x/sx/7 platform
+# Chromium not on nitrogen7
+CORE_IMAGE_BASE_INSTALL_append_nitrogen6x += "video-input-icon chromium firefox qt5everywheredemo cinematicexperience"
+CORE_IMAGE_BASE_INSTALL_append_nitrogen6x-lite += "chromium firefox"
+CORE_IMAGE_BASE_INSTALL_append_nitrogen6sx += "video-input-icon chromium firefox"
+CORE_IMAGE_BASE_INSTALL_append_nitrogen7 += "video-input-icon"
diff --git a/bsp/meta-boundary/licenses/boundary b/bsp/meta-boundary/licenses/boundary
new file mode 100644
index 00000000..678c7be5
--- /dev/null
+++ b/bsp/meta-boundary/licenses/boundary
@@ -0,0 +1,2 @@
+This file is proprietary to Boundary Devices and should not
+be shared, except by authorized customers.
diff --git a/bsp/meta-boundary/recipes-boundary/app-startup/app-startup.bb b/bsp/meta-boundary/recipes-boundary/app-startup/app-startup.bb
new file mode 100644
index 00000000..1e2e9c8e
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/app-startup/app-startup.bb
@@ -0,0 +1,27 @@
+# Copyright (C) 2014 Boundary Devices
+
+SUMMARY = "app-startup"
+SECTION = "base"
+LICENSE = "LGPLv3"
+LIC_FILES_CHKSUM = "file://app;beginline=11;endline=11;md5=1c2ccc7e2f30e48720e36f0c0e5d1b79"
+
+S = "${WORKDIR}"
+
+SRC_URI = " \
+ file://app \
+ file://root.profile \
+"
+
+do_install_append() {
+ install -d ${D}${sysconfdir}/init.d/
+ install -d ${D}/home/root/
+ install -m 755 ${S}/app ${D}${sysconfdir}/init.d/
+ install ${S}/root.profile ${D}/home/root/.profile
+ update-rc.d -r ${D} app start 80 5 .
+}
+
+FILES_${PN} += " \
+ ${sysconfdir}/init.d/app \
+ /home/root/.profile \
+"
+
diff --git a/bsp/meta-boundary/recipes-boundary/app-startup/files/app b/bsp/meta-boundary/recipes-boundary/app-startup/files/app
new file mode 100755
index 00000000..32f7ae4a
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/app-startup/files/app
@@ -0,0 +1,46 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides: app
+# Required-Start: wifi
+# Required-Stop: wifi
+# Default-Start: S
+# Default-Stop:
+#
+# install with update-rc.d app start 80 5 .
+#
+# SPDX-License-Identifier: LGPL-3.0+
+#
+### END INIT INFO
+
+case "$1" in
+ start)
+ echo -n "Starting application"
+ daemonize /app/run-app
+ echo "done"
+ ;;
+ stop)
+ echo -n "Stopping application"
+ /app/stop-app
+ echo "done"
+ ;;
+ restart)
+ $0 stop
+ $0 start
+ ;;
+ status)
+ pid=`pidof -x run-app`
+ if [ -n "$pid" ]; then
+ echo "run-app (pid $pid) is running ..."
+ exit 2
+ else
+ echo "run-app is stopped"
+ fi
+ ;;
+ *)
+ echo "Usage: app { start | stop | restart | status }" >&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
diff --git a/bsp/meta-boundary/recipes-boundary/app-startup/files/root.profile b/bsp/meta-boundary/recipes-boundary/app-startup/files/root.profile
new file mode 100644
index 00000000..aaa98dd0
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/app-startup/files/root.profile
@@ -0,0 +1,5 @@
+killem() { /etc/init.d/app stop ; }
+startem() { /etc/init.d/app start ; }
+if [ -e /app/app.profile ]; then
+ . /app/app.profile
+fi
diff --git a/bsp/meta-boundary/recipes-boundary/daemonize/daemonize.bb b/bsp/meta-boundary/recipes-boundary/daemonize/daemonize.bb
new file mode 100644
index 00000000..525fc0e6
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/daemonize/daemonize.bb
@@ -0,0 +1,16 @@
+# Copyright (C) 2014 Boundary Devices
+
+SUMMARY = "Daemonize"
+SECTION = "base"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://COPYING;md5=5003fa041d799dd5dd5f646b74e36924"
+
+S = "${WORKDIR}/git"
+
+SRC_URI = "git://github.com/boundarydevices/daemonize.git;branch=${SRCBRANCH}"
+SRCBRANCH = "master"
+SRCREV = "9c08934f6cbf3cf4bfbdeb92d411072e5d2f7ad0"
+
+inherit autotools-brokensep
+
+
diff --git a/bsp/meta-boundary/recipes-boundary/devregs/devregs.bb b/bsp/meta-boundary/recipes-boundary/devregs/devregs.bb
new file mode 100644
index 00000000..f964f3c4
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/devregs/devregs.bb
@@ -0,0 +1,22 @@
+# Copyright (C) 2014 Boundary Devices
+
+SUMMARY = "Devregs"
+SECTION = "base"
+LICENSE = "GPL"
+LIC_FILES_CHKSUM = "file://COPYING;md5=5003fa041d799dd5dd5f646b74e36924"
+
+S = "${WORKDIR}/git"
+
+SRC_URI = "git://github.com/boundarydevices/devregs.git;branch=${SRCBRANCH}"
+SRCBRANCH = "master"
+SRCREV = "8e2537cec400a4cedd1e37a9cc823cea458732e9"
+
+inherit autotools-brokensep
+
+do_install_append() {
+ cp -fv ${S}/dat/devregs_imx* ${D}${sysconfdir}/
+}
+
+FILES_${PN} += " \
+ ${sysconfdir}/devregs_imx*.dat \
+"
diff --git a/bsp/meta-boundary/recipes-boundary/images/boundary-image-multimedia-full.bb b/bsp/meta-boundary/recipes-boundary/images/boundary-image-multimedia-full.bb
new file mode 100644
index 00000000..42cfaa87
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/images/boundary-image-multimedia-full.bb
@@ -0,0 +1,16 @@
+# This image extends fsl-image-multimedia-full with additional
+# Boundary Devices packages
+
+require recipes-fsl/images/fsl-image-multimedia-full.bb
+
+CORE_IMAGE_EXTRA_INSTALL += " \
+ i2c-tools \
+ iperf3 \
+ imx-gpu-viv-demos \
+ kernel-module-qcacld \
+ linux-firmware-bdsdmac \
+ mmc-utils \
+ openssh \
+ spitools \
+ connman \
+"
diff --git a/bsp/meta-boundary/recipes-boundary/libmdi2300/libmdi2300_git.bb b/bsp/meta-boundary/recipes-boundary/libmdi2300/libmdi2300_git.bb
new file mode 100644
index 00000000..31b08c04
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/libmdi2300/libmdi2300_git.bb
@@ -0,0 +1,30 @@
+SUMMARY = "Library for Opticon MDI-2300 Barcode scanner."
+HOMEPAGE = "https://github.com/boundarydevices/libmdi2300"
+LICENSE = "LGPLv2.1+"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e8d8feac5daeb0b39a13e1c1535e1f20"
+SECTION = "libs"
+
+SRCREV = "dce5071fc8e1ac1e87cce0920b975a8cf33cdecc"
+SRC_URI = "git://github.com/boundarydevices/libmdi2300.git;protocol=git;"
+
+S = "${WORKDIR}/git/"
+
+PACKAGES = "${PN} ${PN}-dbg ${PN}-examples"
+
+EXTRA_OEMAKE = " 'CC=${CC}' "
+
+do_compile () {
+ oe_runmake all
+ oe_runmake examples
+}
+
+do_install () {
+ oe_runmake install DESTDIR=${D}/usr/
+ oe_runmake install_examples DESTDIR=${D}/usr/
+}
+
+FILES_${PN} += "/usr/lib/ /usr/include"
+FILES_${PN}-dbg += "/usr/src/"
+FILES_${PN}-examples += "/usr/bin/"
+
+BBCLASSEXTEND = "native"
diff --git a/bsp/meta-boundary/recipes-boundary/printer-tools/printer-tools_git.bb b/bsp/meta-boundary/recipes-boundary/printer-tools/printer-tools_git.bb
new file mode 100644
index 00000000..661a3fe6
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/printer-tools/printer-tools_git.bb
@@ -0,0 +1,30 @@
+SUMMARY = "Test/Debug tools for thermal printers."
+HOMEPAGE = "https://github.com/boundarydevices/printer-tools"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4bc53cea4911b2abe17c307d0f49a5d8"
+SECTION = "base"
+
+SRCREV = "e219aea844d720e7b03da495862cc1586132e7dd"
+SRCBRANCH = "ftp628"
+SRC_URI = "git://github.com/boundarydevices/printer-tools.git;protocol=git;branch=${SRCBRANCH}"
+
+S = "${WORKDIR}/git/"
+
+DEPENDS += " libpng "
+
+EXTRA_OEMAKE = " 'CC=${CC}' 'CFLAGS=-I${STAGING_INCDIR}' \
+ 'LDFLAGS=-L${STAGING_LIBDIR}' "
+
+do_compile () {
+ oe_runmake all
+}
+
+do_install () {
+ oe_runmake install DESTDIR=${D}/usr/
+}
+
+FILES_${PN} += "/usr/bin"
+
+INSANE_SKIP_${PN} = "ldflags"
+
+BBCLASSEXTEND = "native"
diff --git a/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/COPYING b/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/COPYING
new file mode 100644
index 00000000..6f195d36
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/COPYING
@@ -0,0 +1,282 @@
+=======================================================================
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/syslogd b/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/syslogd
new file mode 100644
index 00000000..6fb0b987
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/syslogd
@@ -0,0 +1,4 @@
+#
+# For remote UDP logging use SYSLOGD="-r"
+#
+SYSLOGD="-r"
diff --git a/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/sysklogd-config-remote.bb b/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/sysklogd-config-remote.bb
new file mode 100644
index 00000000..67ea6c0e
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/sysklogd-config-remote.bb
@@ -0,0 +1,23 @@
+# Copyright (C) 2015 Boundary Devices
+
+SUMMARY = "sysklogd-config-remote"
+SECTION = "base"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://COPYING;md5=5003fa041d799dd5dd5f646b74e36924"
+
+S = "${WORKDIR}"
+
+SRC_URI = " \
+ file://syslogd \
+ file://COPYING \
+"
+
+do_install_append() {
+ install -d ${D}${sysconfdir}/default
+ install ${S}/syslogd ${D}${sysconfdir}/default/
+}
+
+FILES_${PN} += " \
+ ${sysconfdir}/default/syslogd \
+"
+
diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/files/COPYING b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/COPYING
new file mode 100644
index 00000000..90978d50
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/COPYING
@@ -0,0 +1,12 @@
+Copyright (C) 2015 by Boundary Devices
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, 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/bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5640-MIPI-Test.desktop b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5640-MIPI-Test.desktop
new file mode 100644
index 00000000..677e9bbc
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5640-MIPI-Test.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Name=OV5640 MIPI Test
+Comment=Launches gst-launch to show ov5640-mipi input on screen.
+Exec=/usr/bin/ov5640-mipi-test
+Icon=video-player
+Terminal=true
+Type=Application
+StartupNotify=true
+Categories=GTK;AudioVideo;Audio;Player;
diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5642.desktop b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5642.desktop
new file mode 100644
index 00000000..947f8b98
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5642.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Name=OV5642 Test
+Comment=Launches gst-launch to show ov5642 input on screen.
+Exec=/usr/bin/ov5642-test
+Icon=video-player
+Terminal=true
+Type=Application
+StartupNotify=true
+Categories=GTK;AudioVideo;Audio;Player;
diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input
new file mode 100755
index 00000000..f1fc27ea
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input
@@ -0,0 +1 @@
+gst-launch-1.0 imxv4l2videosrc device=/dev/video3 ! autovideosink;
diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input.desktop b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input.desktop
new file mode 100644
index 00000000..89ed7565
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Name=HDMI Input Test
+Comment=Launches gst-launch to show hdmi input on screen.
+Exec=/usr/bin/hdmi-input
+Icon=video-player
+Terminal=true
+Type=Application
+StartupNotify=true
+Categories=GTK;AudioVideo;Audio;Player;
diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5640-mipi-test b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5640-mipi-test
new file mode 100755
index 00000000..d1358fed
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5640-mipi-test
@@ -0,0 +1 @@
+gst-launch-1.0 imxv4l2videosrc device=/dev/video1 ! autovideosink;
diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5642-test b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5642-test
new file mode 100755
index 00000000..f9ce12c1
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5642-test
@@ -0,0 +1 @@
+gst-launch-1.0 imxv4l2videosrc device=/dev/video0 ! autovideosink;
diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/video-input-icon.bb b/bsp/meta-boundary/recipes-boundary/video-input-icon/video-input-icon.bb
new file mode 100644
index 00000000..98fdf136
--- /dev/null
+++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/video-input-icon.bb
@@ -0,0 +1,60 @@
+# Simple recipe to add desktop icon and executable to run gstreamer
+# command to display video input on screen in media player.
+
+DESCRIPTION = "Video Input Desktop Icon/Executable"
+LICENSE = "BSD"
+LIC_FILES_CHKSUM = "file://COPYING;md5=b7a244440f5854ed05acee9962562ba4"
+
+PR = "r0"
+
+SRC_URI = " \
+ file://hdmi-input \
+ file://hdmi-input.desktop \
+ file://OV5640-MIPI-Test.desktop \
+ file://ov5640-mipi-test \
+ file://OV5642.desktop \
+ file://ov5642-test \
+ file://COPYING \
+"
+
+S = "${WORKDIR}"
+
+do_install_nitrogen6x() {
+ mkdir -p ${D}/usr/bin/
+ mkdir -p ${D}/usr/share/applications/
+ cp ${S}/hdmi-input ${D}/usr/bin/
+ cp ${S}/hdmi-input.desktop ${D}/usr/share/applications/
+ cp ${S}/ov5640-mipi-test ${D}/usr/bin/
+ cp ${S}/OV5640-MIPI-Test.desktop ${D}/usr/share/applications/
+ cp ${S}/OV5642.desktop ${D}/usr/share/applications/
+ cp ${S}/ov5642-test ${D}/usr/bin/
+}
+
+do_install_nitrogen6sx() {
+ mkdir -p ${D}/usr/bin/
+ mkdir -p ${D}/usr/share/applications/
+ cp ${S}/OV5642.desktop ${D}/usr/share/applications/
+ cp ${S}/ov5642-test ${D}/usr/bin/
+}
+
+do_install_nitrogen7() {
+ mkdir -p ${D}/usr/bin/
+ mkdir -p ${D}/usr/share/applications/
+ cp ${S}/ov5640-mipi-test ${D}/usr/bin/
+ cp ${S}/OV5640-MIPI-Test.desktop ${D}/usr/share/applications/
+}
+
+FILES_${PN}_nitrogen6x = " \
+ /usr/bin/* \
+ /usr/share/applications/* \
+"
+
+FILES_${PN}_nitrogen6sx = " \
+ /usr/bin/ov5642-test \
+ /usr/share/applications/OV5642.desktop \
+"
+
+FILES_${PN}_nitrogen7 = " \
+ /usr/bin/ov5640-mipi-test \
+ /usr/share/applications/OV5640-MIPI-Test.desktop \
+"
diff --git a/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state.bbappend b/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state.bbappend
new file mode 100644
index 00000000..39db7823
--- /dev/null
+++ b/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state.bbappend
@@ -0,0 +1,6 @@
+# Append path for boundarydevices layer to include alsa-state
+# Includes default 75% volume setting
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
+PACKAGE_ARCH_mx7 = "${MACHINE_ARCH}"
+PACKAGE_ARCH_mx6 = "${MACHINE_ARCH}"
diff --git a/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx6/asound.state b/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx6/asound.state
new file mode 100644
index 00000000..27c7165a
--- /dev/null
+++ b/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx6/asound.state
@@ -0,0 +1,1878 @@
+state.wm8962audio {
+ control.1 {
+ iface MIXER
+ name 'Input Mixer Switch'
+ value.0 true
+ value.1 true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.2 {
+ iface MIXER
+ name 'MIXINL IN2L Volume'
+ value 5
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 0
+ }
+ }
+ control.3 {
+ iface MIXER
+ name 'MIXINL PGA Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin 0
+ dbmax 3000
+ dbvalue.0 0
+ }
+ }
+ control.4 {
+ iface MIXER
+ name 'MIXINL IN3L Volume'
+ value 5
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 0
+ }
+ }
+ control.5 {
+ iface MIXER
+ name 'MIXINR IN2R Volume'
+ value 5
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 0
+ }
+ }
+ control.6 {
+ iface MIXER
+ name 'MIXINR PGA Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin 0
+ dbmax 3000
+ dbvalue.0 0
+ }
+ }
+ control.7 {
+ iface MIXER
+ name 'MIXINR IN3R Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.8 {
+ iface MIXER
+ name 'Digital Capture Volume'
+ value.0 108
+ value.1 108
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 127'
+ dbmin -9999999
+ dbmax 2325
+ dbvalue.0 900
+ dbvalue.1 900
+ }
+ }
+ control.9 {
+ iface MIXER
+ name 'Capture Volume'
+ value.0 63
+ value.1 63
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 63'
+ dbmin -2325
+ dbmax 2400
+ dbvalue.0 2400
+ dbvalue.1 2400
+ }
+ }
+ control.10 {
+ iface MIXER
+ name 'Capture Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.11 {
+ iface MIXER
+ name 'Capture ZC Switch'
+ value.0 true
+ value.1 true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.12 {
+ iface MIXER
+ name 'Capture HPF Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.13 {
+ iface MIXER
+ name 'Capture HPF Mode'
+ value Hi-fi
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 Hi-fi
+ item.1 Application
+ }
+ }
+ control.14 {
+ iface MIXER
+ name 'Capture HPF Cutoff'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ }
+ }
+ control.15 {
+ iface MIXER
+ name 'Capture LHPF Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.16 {
+ iface MIXER
+ name 'Capture LHPF Mode'
+ value LPF
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 LPF
+ item.1 HPF
+ }
+ }
+ control.17 {
+ iface MIXER
+ name 'Sidetone Volume'
+ value.0 0
+ value.1 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 12'
+ dbmin -3600
+ dbmax 0
+ dbvalue.0 -3600
+ dbvalue.1 -3600
+ }
+ }
+ control.18 {
+ iface MIXER
+ name 'Digital Playback Volume'
+ value.0 96
+ value.1 96
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 127'
+ dbmin -9999999
+ dbmax 2325
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.19 {
+ iface MIXER
+ name 'DAC High Performance Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.20 {
+ iface MIXER
+ name 'DAC L/R Swap Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.21 {
+ iface MIXER
+ name 'ADC L/R Swap Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.22 {
+ iface MIXER
+ name 'ADC High Performance Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.23 {
+ iface MIXER
+ name 'Beep Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 15'
+ dbmin -9999999
+ dbmax -600
+ dbvalue.0 -9999999
+ }
+ }
+ control.24 {
+ iface MIXER
+ name 'Headphone Volume'
+ value.0 93
+ value.1 93
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 127'
+ dbmin -9999999
+ dbmax 600
+ dbvalue.0 -2800
+ dbvalue.1 -2800
+ }
+ }
+ control.25 {
+ iface MIXER
+ name 'Headphone Switch'
+ value.0 true
+ value.1 true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.26 {
+ iface MIXER
+ name 'Headphone ZC Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.27 {
+ iface MIXER
+ name 'Headphone Aux Volume'
+ value.0 7
+ value.1 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 7'
+ dbmin -700
+ dbmax 0
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.28 {
+ iface MIXER
+ name 'Headphone Mixer Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.29 {
+ iface MIXER
+ name 'HPMIXL IN4L Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.30 {
+ iface MIXER
+ name 'HPMIXL IN4R Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.31 {
+ iface MIXER
+ name 'HPMIXL MIXINL Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.32 {
+ iface MIXER
+ name 'HPMIXL MIXINR Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.33 {
+ iface MIXER
+ name 'HPMIXR IN4L Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.34 {
+ iface MIXER
+ name 'HPMIXR IN4R Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.35 {
+ iface MIXER
+ name 'HPMIXR MIXINL Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.36 {
+ iface MIXER
+ name 'HPMIXR MIXINR Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.37 {
+ iface MIXER
+ name 'Speaker Boost Volume'
+ value 3
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin 0
+ dbmax 1200
+ dbvalue.0 450
+ }
+ }
+ control.38 {
+ iface MIXER
+ name 'EQ Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.39 {
+ iface MIXER
+ name 'EQ1 Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1200
+ dbmax 1900
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.40 {
+ iface MIXER
+ name 'EQ2 Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1200
+ dbmax 1900
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.41 {
+ iface MIXER
+ name 'EQ3 Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1200
+ dbmax 1900
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.42 {
+ iface MIXER
+ name 'EQ4 Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1200
+ dbmax 1900
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.43 {
+ iface MIXER
+ name 'EQ5 Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1200
+ dbmax 1900
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.44 {
+ iface MIXER
+ name '3D Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.45 {
+ iface MIXER
+ name '3D Coefficients'
+ value '0040000000000000'
+ comment {
+ access 'read write'
+ type BYTES
+ count 8
+ }
+ }
+ control.46 {
+ iface MIXER
+ name 'DF1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.47 {
+ iface MIXER
+ name 'DF1 Coefficients'
+ value '0000000000000000000000000000'
+ comment {
+ access 'read write'
+ type BYTES
+ count 14
+ }
+ }
+ control.48 {
+ iface MIXER
+ name 'DRC Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.49 {
+ iface MIXER
+ name 'DRC Coefficients'
+ value '000c0925000000000000'
+ comment {
+ access 'read write'
+ type BYTES
+ count 10
+ }
+ }
+ control.50 {
+ iface MIXER
+ name 'VSS Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.51 {
+ iface MIXER
+ name 'VSS Coefficients'
+ value '008c020000350700003a4100008b7d00003a4100008cfee800780000003fb260002d18180020000000f1834000fb830000eeaec000fbac4000f17f8000f43b4000f5fb0000ea10c000fcc58000e275c00004b48000d4f9800004914000d8a48000023dc000cf7a8000dc060000f2dac000baf340000a7940001c068000fd2d00001ce840000ddc4000fc9d000009558000fe7e80000eab4000f99880000987c000fd2c400009480000035f400000870000fae4c000000b400004e18000011f4000f8b00000fbcbc00004f3800007df4000ff070000efd70000fbaf4000108a80001107c000e0080000d276000020cf400030234000fd69c0002835000006330000d9f6c000f33340000f420000040c8000fb3f8000f757c0000354000000c6c0000312c000fd8580'
+ comment {
+ access 'read write'
+ type BYTES
+ count 296
+ }
+ }
+ control.52 {
+ iface MIXER
+ name 'HPF1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.53 {
+ iface MIXER
+ name 'HPF2 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.54 {
+ iface MIXER
+ name 'HPF Coefficients'
+ value '0000'
+ comment {
+ access 'read write'
+ type BYTES
+ count 2
+ }
+ }
+ control.55 {
+ iface MIXER
+ name 'HD Bass Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.56 {
+ iface MIXER
+ name 'HD Bass Coefficients'
+ value '0002bd12007c586c00538121003f8bd80032f52d0065ac8c006be08700721483007214830043352500066a4a0043607900080000000100000059999a'
+ comment {
+ access 'read write'
+ type BYTES
+ count 60
+ }
+ }
+ control.57 {
+ iface MIXER
+ name 'Speaker Volume'
+ value.0 114
+ value.1 114
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 127'
+ dbmin -9999999
+ dbmax 600
+ dbvalue.0 -700
+ dbvalue.1 -700
+ }
+ }
+ control.58 {
+ iface MIXER
+ name 'Speaker Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.59 {
+ iface MIXER
+ name 'Speaker ZC Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.60 {
+ iface MIXER
+ name 'Speaker Mixer Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.61 {
+ iface MIXER
+ name 'SPKOUTL Mixer IN4L Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.62 {
+ iface MIXER
+ name 'SPKOUTL Mixer IN4R Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.63 {
+ iface MIXER
+ name 'SPKOUTL Mixer MIXINL Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.64 {
+ iface MIXER
+ name 'SPKOUTL Mixer MIXINR Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.65 {
+ iface MIXER
+ name 'SPKOUTL Mixer DACL Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 -600
+ }
+ }
+ control.66 {
+ iface MIXER
+ name 'SPKOUTL Mixer DACR Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 -600
+ }
+ }
+ control.67 {
+ iface MIXER
+ name 'SPKOUTR Mixer IN4L Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.68 {
+ iface MIXER
+ name 'SPKOUTR Mixer IN4R Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.69 {
+ iface MIXER
+ name 'SPKOUTR Mixer MIXINL Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.70 {
+ iface MIXER
+ name 'SPKOUTR Mixer MIXINR Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.71 {
+ iface MIXER
+ name 'SPKOUTR Mixer DACL Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 -600
+ }
+ }
+ control.72 {
+ iface MIXER
+ name 'SPKOUTR Mixer DACR Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 -600
+ }
+ }
+ control.73 {
+ iface MIXER
+ name 'SPKOUTR PGA'
+ value DAC
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 DAC
+ item.1 Mixer
+ }
+ }
+ control.74 {
+ iface MIXER
+ name 'SPKOUTL PGA'
+ value DAC
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 DAC
+ item.1 Mixer
+ }
+ }
+ control.75 {
+ iface MIXER
+ name 'SPKOUTR Mixer DACL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.76 {
+ iface MIXER
+ name 'SPKOUTR Mixer DACR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.77 {
+ iface MIXER
+ name 'SPKOUTR Mixer MIXINL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.78 {
+ iface MIXER
+ name 'SPKOUTR Mixer MIXINR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.79 {
+ iface MIXER
+ name 'SPKOUTR Mixer IN4L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.80 {
+ iface MIXER
+ name 'SPKOUTR Mixer IN4R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.81 {
+ iface MIXER
+ name 'SPKOUTL Mixer DACL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.82 {
+ iface MIXER
+ name 'SPKOUTL Mixer DACR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.83 {
+ iface MIXER
+ name 'SPKOUTL Mixer MIXINL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.84 {
+ iface MIXER
+ name 'SPKOUTL Mixer MIXINR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.85 {
+ iface MIXER
+ name 'SPKOUTL Mixer IN4L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.86 {
+ iface MIXER
+ name 'SPKOUTL Mixer IN4R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.87 {
+ iface MIXER
+ name 'HPOUTR PGA'
+ value DAC
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 DAC
+ item.1 Mixer
+ }
+ }
+ control.88 {
+ iface MIXER
+ name 'HPOUTL PGA'
+ value DAC
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 DAC
+ item.1 Mixer
+ }
+ }
+ control.89 {
+ iface MIXER
+ name 'HPMIXR DACL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.90 {
+ iface MIXER
+ name 'HPMIXR DACR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.91 {
+ iface MIXER
+ name 'HPMIXR MIXINL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.92 {
+ iface MIXER
+ name 'HPMIXR MIXINR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.93 {
+ iface MIXER
+ name 'HPMIXR IN4L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.94 {
+ iface MIXER
+ name 'HPMIXR IN4R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.95 {
+ iface MIXER
+ name 'HPMIXL DACL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.96 {
+ iface MIXER
+ name 'HPMIXL DACR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.97 {
+ iface MIXER
+ name 'HPMIXL MIXINL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.98 {
+ iface MIXER
+ name 'HPMIXL MIXINR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.99 {
+ iface MIXER
+ name 'HPMIXL IN4L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.100 {
+ iface MIXER
+ name 'HPMIXL IN4R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.101 {
+ iface MIXER
+ name STR
+ value None
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 None
+ item.1 Left
+ item.2 Right
+ }
+ }
+ control.102 {
+ iface MIXER
+ name STL
+ value None
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 None
+ item.1 Left
+ item.2 Right
+ }
+ }
+ control.103 {
+ iface MIXER
+ name 'MIXINR IN2R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.104 {
+ iface MIXER
+ name 'MIXINR IN3R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.105 {
+ iface MIXER
+ name 'MIXINR PGA Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.106 {
+ iface MIXER
+ name 'MIXINL IN2L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.107 {
+ iface MIXER
+ name 'MIXINL IN3L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.108 {
+ iface MIXER
+ name 'MIXINL PGA Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.109 {
+ iface MIXER
+ name 'INPGAR IN1R Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.110 {
+ iface MIXER
+ name 'INPGAR IN2R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.111 {
+ iface MIXER
+ name 'INPGAR IN3R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.112 {
+ iface MIXER
+ name 'INPGAR IN4R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.113 {
+ iface MIXER
+ name 'INPGAL IN1L Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.114 {
+ iface MIXER
+ name 'INPGAL IN2L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.115 {
+ iface MIXER
+ name 'INPGAL IN3L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.116 {
+ iface MIXER
+ name 'INPGAL IN4L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+}
+state.imx6qnitrogen6x {
+ control.1 {
+ iface MIXER
+ name 'PCM Playback Volume'
+ value.0 144
+ value.1 144
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 192'
+ }
+ }
+ control.2 {
+ iface MIXER
+ name 'Capture Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 15'
+ }
+ }
+ control.3 {
+ iface MIXER
+ name 'Capture Attenuate Switch (-6dB)'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.4 {
+ iface MIXER
+ name 'Capture ZC Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.5 {
+ iface MIXER
+ name 'Headphone Playback Volume'
+ value.0 127
+ value.1 127
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 127'
+ dbmin -5150
+ dbmax 1200
+ dbvalue.0 1200
+ dbvalue.1 1200
+ }
+ }
+ control.6 {
+ iface MIXER
+ name 'Headphone Playback ZC Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.7 {
+ iface MIXER
+ name 'Lineout Playback Volume'
+ value.0 27
+ value.1 27
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1250
+ dbmax 300
+ dbvalue.0 100
+ dbvalue.1 100
+ }
+ }
+ control.8 {
+ iface MIXER
+ name 'Mic Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 3'
+ dbmin 0
+ dbmax 4000
+ dbvalue.0 0
+ }
+ }
+ control.9 {
+ iface MIXER
+ name 'Headphone Mux'
+ value DAC
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 DAC
+ item.1 LINE_IN
+ }
+ }
+ control.10 {
+ iface MIXER
+ name 'Capture Mux'
+ value MIC_IN
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 MIC_IN
+ item.1 LINE_IN
+ }
+ }
+}
+state.imx6dlnit6xlite {
+ control.1 {
+ iface MIXER
+ name 'PCM Playback Volume'
+ value.0 144
+ value.1 144
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 192'
+ }
+ }
+ control.2 {
+ iface MIXER
+ name 'Capture Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 15'
+ }
+ }
+ control.3 {
+ iface MIXER
+ name 'Capture Attenuate Switch (-6dB)'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.4 {
+ iface MIXER
+ name 'Capture ZC Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.5 {
+ iface MIXER
+ name 'Headphone Playback Volume'
+ value.0 127
+ value.1 127
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 127'
+ dbmin -5150
+ dbmax 1200
+ dbvalue.0 1200
+ dbvalue.1 1200
+ }
+ }
+ control.6 {
+ iface MIXER
+ name 'Headphone Playback ZC Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.7 {
+ iface MIXER
+ name 'Lineout Playback Volume'
+ value.0 27
+ value.1 27
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1250
+ dbmax 300
+ dbvalue.0 100
+ dbvalue.1 100
+ }
+ }
+ control.8 {
+ iface MIXER
+ name 'Mic Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 3'
+ dbmin 0
+ dbmax 4000
+ dbvalue.0 0
+ }
+ }
+ control.9 {
+ iface MIXER
+ name 'Headphone Mux'
+ value DAC
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 DAC
+ item.1 LINE_IN
+ }
+ }
+ control.10 {
+ iface MIXER
+ name 'Capture Mux'
+ value MIC_IN
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 MIC_IN
+ item.1 LINE_IN
+ }
+ }
+}
+state.imx6qnitrogen6m {
+ control.1 {
+ iface MIXER
+ name 'PCM Playback Volume'
+ value.0 144
+ value.1 144
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 192'
+ }
+ }
+ control.2 {
+ iface MIXER
+ name 'Capture Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 15'
+ }
+ }
+ control.3 {
+ iface MIXER
+ name 'Capture Attenuate Switch (-6dB)'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.4 {
+ iface MIXER
+ name 'Capture ZC Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.5 {
+ iface MIXER
+ name 'Headphone Playback Volume'
+ value.0 127
+ value.1 127
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 127'
+ dbmin -5150
+ dbmax 1200
+ dbvalue.0 1200
+ dbvalue.1 1200
+ }
+ }
+ control.6 {
+ iface MIXER
+ name 'Headphone Playback ZC Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.7 {
+ iface MIXER
+ name 'Lineout Playback Volume'
+ value.0 27
+ value.1 27
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1250
+ dbmax 300
+ dbvalue.0 100
+ dbvalue.1 100
+ }
+ }
+ control.8 {
+ iface MIXER
+ name 'Mic Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 3'
+ dbmin 0
+ dbmax 4000
+ dbvalue.0 0
+ }
+ }
+ control.9 {
+ iface MIXER
+ name 'Headphone Mux'
+ value DAC
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 DAC
+ item.1 LINE_IN
+ }
+ }
+ control.10 {
+ iface MIXER
+ name 'Capture Mux'
+ value MIC_IN
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 MIC_IN
+ item.1 LINE_IN
+ }
+ }
+}
+state.imx6sxnitrogen6 {
+ control.1 {
+ iface MIXER
+ name 'PCM Playback Volume'
+ value.0 144
+ value.1 144
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 192'
+ }
+ }
+ control.2 {
+ iface MIXER
+ name 'Capture Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 15'
+ }
+ }
+ control.3 {
+ iface MIXER
+ name 'Capture Attenuate Switch (-6dB)'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.4 {
+ iface MIXER
+ name 'Capture ZC Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.5 {
+ iface MIXER
+ name 'Headphone Playback Volume'
+ value.0 127
+ value.1 127
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 127'
+ dbmin -5150
+ dbmax 1200
+ dbvalue.0 1200
+ dbvalue.1 1200
+ }
+ }
+ control.6 {
+ iface MIXER
+ name 'Headphone Playback ZC Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.7 {
+ iface MIXER
+ name 'Lineout Playback Volume'
+ value.0 27
+ value.1 27
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1250
+ dbmax 300
+ dbvalue.0 100
+ dbvalue.1 100
+ }
+ }
+ control.8 {
+ iface MIXER
+ name 'Mic Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 3'
+ dbmin 0
+ dbmax 4000
+ dbvalue.0 0
+ }
+ }
+ control.9 {
+ iface MIXER
+ name 'Headphone Mux'
+ value DAC
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 DAC
+ item.1 LINE_IN
+ }
+ }
+ control.10 {
+ iface MIXER
+ name 'Capture Mux'
+ value MIC_IN
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 MIC_IN
+ item.1 LINE_IN
+ }
+ }
+}
diff --git a/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx7/asound.state b/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx7/asound.state
new file mode 100644
index 00000000..552f763d
--- /dev/null
+++ b/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx7/asound.state
@@ -0,0 +1,1374 @@
+state.wm8962audio {
+ control.1 {
+ iface MIXER
+ name 'Input Mixer Switch'
+ value.0 true
+ value.1 true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.2 {
+ iface MIXER
+ name 'MIXINL IN2L Volume'
+ value 5
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 0
+ }
+ }
+ control.3 {
+ iface MIXER
+ name 'MIXINL PGA Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin 0
+ dbmax 3000
+ dbvalue.0 0
+ }
+ }
+ control.4 {
+ iface MIXER
+ name 'MIXINL IN3L Volume'
+ value 5
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 0
+ }
+ }
+ control.5 {
+ iface MIXER
+ name 'MIXINR IN2R Volume'
+ value 5
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 0
+ }
+ }
+ control.6 {
+ iface MIXER
+ name 'MIXINR PGA Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin 0
+ dbmax 3000
+ dbvalue.0 0
+ }
+ }
+ control.7 {
+ iface MIXER
+ name 'MIXINR IN3R Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.8 {
+ iface MIXER
+ name 'Digital Capture Volume'
+ value.0 108
+ value.1 108
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 127'
+ dbmin -9999999
+ dbmax 2325
+ dbvalue.0 900
+ dbvalue.1 900
+ }
+ }
+ control.9 {
+ iface MIXER
+ name 'Capture Volume'
+ value.0 63
+ value.1 63
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 63'
+ dbmin -2325
+ dbmax 2400
+ dbvalue.0 2400
+ dbvalue.1 2400
+ }
+ }
+ control.10 {
+ iface MIXER
+ name 'Capture Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.11 {
+ iface MIXER
+ name 'Capture ZC Switch'
+ value.0 true
+ value.1 true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.12 {
+ iface MIXER
+ name 'Capture HPF Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.13 {
+ iface MIXER
+ name 'Capture HPF Mode'
+ value Hi-fi
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 Hi-fi
+ item.1 Application
+ }
+ }
+ control.14 {
+ iface MIXER
+ name 'Capture HPF Cutoff'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ }
+ }
+ control.15 {
+ iface MIXER
+ name 'Capture LHPF Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.16 {
+ iface MIXER
+ name 'Capture LHPF Mode'
+ value LPF
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 LPF
+ item.1 HPF
+ }
+ }
+ control.17 {
+ iface MIXER
+ name 'Sidetone Volume'
+ value.0 0
+ value.1 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 12'
+ dbmin -3600
+ dbmax 0
+ dbvalue.0 -3600
+ dbvalue.1 -3600
+ }
+ }
+ control.18 {
+ iface MIXER
+ name 'Digital Playback Volume'
+ value.0 96
+ value.1 96
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 127'
+ dbmin -9999999
+ dbmax 2325
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.19 {
+ iface MIXER
+ name 'DAC High Performance Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.20 {
+ iface MIXER
+ name 'DAC L/R Swap Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.21 {
+ iface MIXER
+ name 'ADC L/R Swap Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.22 {
+ iface MIXER
+ name 'ADC High Performance Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.23 {
+ iface MIXER
+ name 'Beep Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 15'
+ dbmin -9999999
+ dbmax -600
+ dbvalue.0 -9999999
+ }
+ }
+ control.24 {
+ iface MIXER
+ name 'Headphone Volume'
+ value.0 93
+ value.1 93
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 127'
+ dbmin -9999999
+ dbmax 600
+ dbvalue.0 -2800
+ dbvalue.1 -2800
+ }
+ }
+ control.25 {
+ iface MIXER
+ name 'Headphone Switch'
+ value.0 true
+ value.1 true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.26 {
+ iface MIXER
+ name 'Headphone ZC Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.27 {
+ iface MIXER
+ name 'Headphone Aux Volume'
+ value.0 7
+ value.1 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 7'
+ dbmin -700
+ dbmax 0
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.28 {
+ iface MIXER
+ name 'Headphone Mixer Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.29 {
+ iface MIXER
+ name 'HPMIXL IN4L Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.30 {
+ iface MIXER
+ name 'HPMIXL IN4R Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.31 {
+ iface MIXER
+ name 'HPMIXL MIXINL Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.32 {
+ iface MIXER
+ name 'HPMIXL MIXINR Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.33 {
+ iface MIXER
+ name 'HPMIXR IN4L Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.34 {
+ iface MIXER
+ name 'HPMIXR IN4R Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.35 {
+ iface MIXER
+ name 'HPMIXR MIXINL Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.36 {
+ iface MIXER
+ name 'HPMIXR MIXINR Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.37 {
+ iface MIXER
+ name 'Speaker Boost Volume'
+ value 3
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin 0
+ dbmax 1200
+ dbvalue.0 450
+ }
+ }
+ control.38 {
+ iface MIXER
+ name 'EQ Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.39 {
+ iface MIXER
+ name 'EQ1 Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1200
+ dbmax 1900
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.40 {
+ iface MIXER
+ name 'EQ2 Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1200
+ dbmax 1900
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.41 {
+ iface MIXER
+ name 'EQ3 Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1200
+ dbmax 1900
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.42 {
+ iface MIXER
+ name 'EQ4 Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1200
+ dbmax 1900
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.43 {
+ iface MIXER
+ name 'EQ5 Volume'
+ value.0 12
+ value.1 12
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -1200
+ dbmax 1900
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.44 {
+ iface MIXER
+ name '3D Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.45 {
+ iface MIXER
+ name '3D Coefficients'
+ value '0040000000000000'
+ comment {
+ access 'read write'
+ type BYTES
+ count 8
+ }
+ }
+ control.46 {
+ iface MIXER
+ name 'DF1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.47 {
+ iface MIXER
+ name 'DF1 Coefficients'
+ value '0000000000000000000000000000'
+ comment {
+ access 'read write'
+ type BYTES
+ count 14
+ }
+ }
+ control.48 {
+ iface MIXER
+ name 'DRC Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.49 {
+ iface MIXER
+ name 'DRC Coefficients'
+ value '000c0925000000000000'
+ comment {
+ access 'read write'
+ type BYTES
+ count 10
+ }
+ }
+ control.50 {
+ iface MIXER
+ name 'VSS Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.51 {
+ iface MIXER
+ name 'VSS Coefficients'
+ value '008c020000350700003a4100008b7d00003a4100008cfee800780000003fb260002d18180020000000f1834000fb830000eeaec000fbac4000f17f8000f43b4000f5fb0000ea10c000fcc58000e275c00004b48000d4f9800004914000d8a48000023dc000cf7a8000dc060000f2dac000baf340000a7940001c068000fd2d00001ce840000ddc4000fc9d000009558000fe7e80000eab4000f99880000987c000fd2c400009480000035f400000870000fae4c000000b400004e18000011f4000f8b00000fbcbc00004f3800007df4000ff070000efd70000fbaf4000108a80001107c000e0080000d276000020cf400030234000fd69c0002835000006330000d9f6c000f33340000f420000040c8000fb3f8000f757c0000354000000c6c0000312c000fd8580'
+ comment {
+ access 'read write'
+ type BYTES
+ count 296
+ }
+ }
+ control.52 {
+ iface MIXER
+ name 'HPF1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.53 {
+ iface MIXER
+ name 'HPF2 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.54 {
+ iface MIXER
+ name 'HPF Coefficients'
+ value '0000'
+ comment {
+ access 'read write'
+ type BYTES
+ count 2
+ }
+ }
+ control.55 {
+ iface MIXER
+ name 'HD Bass Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.56 {
+ iface MIXER
+ name 'HD Bass Coefficients'
+ value '0002bd12007c586c00538121003f8bd80032f52d0065ac8c006be08700721483007214830043352500066a4a0043607900080000000100000059999a'
+ comment {
+ access 'read write'
+ type BYTES
+ count 60
+ }
+ }
+ control.57 {
+ iface MIXER
+ name 'Speaker Volume'
+ value.0 114
+ value.1 114
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 127'
+ dbmin -9999999
+ dbmax 600
+ dbvalue.0 -700
+ dbvalue.1 -700
+ }
+ }
+ control.58 {
+ iface MIXER
+ name 'Speaker Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.59 {
+ iface MIXER
+ name 'Speaker ZC Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.60 {
+ iface MIXER
+ name 'Speaker Mixer Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.61 {
+ iface MIXER
+ name 'SPKOUTL Mixer IN4L Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.62 {
+ iface MIXER
+ name 'SPKOUTL Mixer IN4R Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.63 {
+ iface MIXER
+ name 'SPKOUTL Mixer MIXINL Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.64 {
+ iface MIXER
+ name 'SPKOUTL Mixer MIXINR Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.65 {
+ iface MIXER
+ name 'SPKOUTL Mixer DACL Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 -600
+ }
+ }
+ control.66 {
+ iface MIXER
+ name 'SPKOUTL Mixer DACR Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 -600
+ }
+ }
+ control.67 {
+ iface MIXER
+ name 'SPKOUTR Mixer IN4L Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.68 {
+ iface MIXER
+ name 'SPKOUTR Mixer IN4R Volume'
+ value 7
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 7'
+ dbmin -1500
+ dbmax 600
+ dbvalue.0 600
+ }
+ }
+ control.69 {
+ iface MIXER
+ name 'SPKOUTR Mixer MIXINL Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.70 {
+ iface MIXER
+ name 'SPKOUTR Mixer MIXINR Volume'
+ value 1
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 0
+ }
+ }
+ control.71 {
+ iface MIXER
+ name 'SPKOUTR Mixer DACL Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 -600
+ }
+ }
+ control.72 {
+ iface MIXER
+ name 'SPKOUTR Mixer DACR Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 1'
+ dbmin -600
+ dbmax 0
+ dbvalue.0 -600
+ }
+ }
+ control.73 {
+ iface MIXER
+ name 'SPKOUTR PGA'
+ value DAC
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 DAC
+ item.1 Mixer
+ }
+ }
+ control.74 {
+ iface MIXER
+ name 'SPKOUTL PGA'
+ value DAC
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 DAC
+ item.1 Mixer
+ }
+ }
+ control.75 {
+ iface MIXER
+ name 'SPKOUTR Mixer DACL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.76 {
+ iface MIXER
+ name 'SPKOUTR Mixer DACR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.77 {
+ iface MIXER
+ name 'SPKOUTR Mixer MIXINL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.78 {
+ iface MIXER
+ name 'SPKOUTR Mixer MIXINR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.79 {
+ iface MIXER
+ name 'SPKOUTR Mixer IN4L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.80 {
+ iface MIXER
+ name 'SPKOUTR Mixer IN4R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.81 {
+ iface MIXER
+ name 'SPKOUTL Mixer DACL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.82 {
+ iface MIXER
+ name 'SPKOUTL Mixer DACR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.83 {
+ iface MIXER
+ name 'SPKOUTL Mixer MIXINL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.84 {
+ iface MIXER
+ name 'SPKOUTL Mixer MIXINR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.85 {
+ iface MIXER
+ name 'SPKOUTL Mixer IN4L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.86 {
+ iface MIXER
+ name 'SPKOUTL Mixer IN4R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.87 {
+ iface MIXER
+ name 'HPOUTR PGA'
+ value DAC
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 DAC
+ item.1 Mixer
+ }
+ }
+ control.88 {
+ iface MIXER
+ name 'HPOUTL PGA'
+ value DAC
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 DAC
+ item.1 Mixer
+ }
+ }
+ control.89 {
+ iface MIXER
+ name 'HPMIXR DACL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.90 {
+ iface MIXER
+ name 'HPMIXR DACR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.91 {
+ iface MIXER
+ name 'HPMIXR MIXINL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.92 {
+ iface MIXER
+ name 'HPMIXR MIXINR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.93 {
+ iface MIXER
+ name 'HPMIXR IN4L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.94 {
+ iface MIXER
+ name 'HPMIXR IN4R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.95 {
+ iface MIXER
+ name 'HPMIXL DACL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.96 {
+ iface MIXER
+ name 'HPMIXL DACR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.97 {
+ iface MIXER
+ name 'HPMIXL MIXINL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.98 {
+ iface MIXER
+ name 'HPMIXL MIXINR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.99 {
+ iface MIXER
+ name 'HPMIXL IN4L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.100 {
+ iface MIXER
+ name 'HPMIXL IN4R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.101 {
+ iface MIXER
+ name STR
+ value None
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 None
+ item.1 Left
+ item.2 Right
+ }
+ }
+ control.102 {
+ iface MIXER
+ name STL
+ value None
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 None
+ item.1 Left
+ item.2 Right
+ }
+ }
+ control.103 {
+ iface MIXER
+ name 'MIXINR IN2R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.104 {
+ iface MIXER
+ name 'MIXINR IN3R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.105 {
+ iface MIXER
+ name 'MIXINR PGA Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.106 {
+ iface MIXER
+ name 'MIXINL IN2L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.107 {
+ iface MIXER
+ name 'MIXINL IN3L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.108 {
+ iface MIXER
+ name 'MIXINL PGA Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.109 {
+ iface MIXER
+ name 'INPGAR IN1R Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.110 {
+ iface MIXER
+ name 'INPGAR IN2R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.111 {
+ iface MIXER
+ name 'INPGAR IN3R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.112 {
+ iface MIXER
+ name 'INPGAR IN4R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.113 {
+ iface MIXER
+ name 'INPGAL IN1L Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.114 {
+ iface MIXER
+ name 'INPGAL IN2L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.115 {
+ iface MIXER
+ name 'INPGAL IN3L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.116 {
+ iface MIXER
+ name 'INPGAL IN4L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+}
diff --git a/bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-boot_%.bbappend b/bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-boot_%.bbappend
new file mode 100644
index 00000000..9d0f2fec
--- /dev/null
+++ b/bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-boot_%.bbappend
@@ -0,0 +1,45 @@
+SRCBRANCH = "boundary-imx_4.9.123_imx8mm_ga"
+SRC_URI = "git://github.com/boundarydevices/imx-mkimage.git;branch=${SRCBRANCH}"
+SRCREV = "${AUTOREV}"
+PV = "1.0+git${SRCPV}"
+
+IMXBOOT_TARGETS = "${@bb.utils.contains('MACHINE', 'nitrogen8mm', "u-boot-lpddr4-iMX8MM-2g.nohdmibin", "u-boot-lpddr4-iMX8M-2g.hdmibin", d)}"
+UBOOT_NAME = "u-boot-${MACHINE}.bin"
+BOOT_CONFIG_MACHINE = "${BOOT_NAME}-${MACHINE}.bin"
+
+compile_mx8m() {
+ bbnote 8MQ/8MM boot binary build
+ for ddr_firmware in ${DDR_FIRMWARE_NAME}; do
+ bbnote "Copy ddr_firmware: ${ddr_firmware} from ${DEPLOY_DIR_IMAGE} -> ${BOOT_STAGING} "
+ cp ${DEPLOY_DIR_IMAGE}/${ddr_firmware} ${BOOT_STAGING}
+ done
+ cp ${DEPLOY_DIR_IMAGE}/signed_*_imx8m.bin ${BOOT_STAGING}
+ cp ${DEPLOY_DIR_IMAGE}/u-boot-spl.bin-${MACHINE} ${BOOT_STAGING}/u-boot-spl.bin
+ cp ${DEPLOY_DIR_IMAGE}/${BOOT_TOOLS}/${UBOOT_DTB_NAME} ${BOOT_STAGING}
+ cp ${DEPLOY_DIR_IMAGE}/${BOOT_TOOLS}/u-boot-nodtb.bin ${BOOT_STAGING}
+ cp ${DEPLOY_DIR_IMAGE}/${BOOT_TOOLS}/mkimage_uboot ${BOOT_STAGING}
+ cp ${DEPLOY_DIR_IMAGE}/${UBOOT_NAME} ${BOOT_STAGING}/u-boot.bin
+}
+
+do_compile() {
+ compile_${SOC_FAMILY}
+ # mkimage for i.MX8
+ for target in ${IMXBOOT_TARGETS}; do
+ bbnote "building ${SOC_TARGET} - ${target}"
+ make SOC=${SOC_TARGET} DTBS=${UBOOT_DTB_NAME} ${target}
+ if [ -e "${BOOT_STAGING}/${target}" ]; then
+ cp ${BOOT_STAGING}/${target} ${S}/${BOOT_CONFIG_MACHINE}-${target}
+ fi
+ done
+}
+
+deploy_mx8m() {
+ install -d ${DEPLOYDIR}/${BOOT_TOOLS}
+ install -m 0644 ${DEPLOY_DIR_IMAGE}/u-boot-spl.bin-${MACHINE} ${DEPLOYDIR}/${BOOT_TOOLS}
+ for ddr_firmware in ${DDR_FIRMWARE_NAME}; do
+ install -m 0644 ${DEPLOY_DIR_IMAGE}/${ddr_firmware} ${DEPLOYDIR}/${BOOT_TOOLS}
+ done
+ install -m 0644 ${DEPLOY_DIR_IMAGE}/signed_hdmi*.bin ${DEPLOYDIR}/${BOOT_TOOLS}
+ install -m 0755 ${BOOT_STAGING}/${TOOLS_NAME} ${DEPLOYDIR}/${BOOT_TOOLS}
+ install -m 0755 ${BOOT_STAGING}/mkimage_fit_atf.sh ${DEPLOYDIR}/${BOOT_TOOLS}
+}
diff --git a/bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-mkimage%.bbappend b/bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-mkimage%.bbappend
new file mode 100644
index 00000000..ea406e5e
--- /dev/null
+++ b/bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-mkimage%.bbappend
@@ -0,0 +1,5 @@
+SRCBRANCH = "boundary-imx_4.9.123_imx8mm_ga"
+SRC_URI = "git://github.com/boundarydevices/imx-mkimage.git;branch=${SRCBRANCH}"
+SRCREV = "${AUTOREV}"
+PV = "1.0+git${SRCPV}"
+
diff --git a/bsp/meta-boundary/recipes-bsp/u-boot/boundary/fw_env.config b/bsp/meta-boundary/recipes-bsp/u-boot/boundary/fw_env.config
new file mode 100644
index 00000000..571e829c
--- /dev/null
+++ b/bsp/meta-boundary/recipes-bsp/u-boot/boundary/fw_env.config
@@ -0,0 +1 @@
+/dev/mtd1 0x00000 0x2000 0x1000 2
diff --git a/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-boundary_%.bbappend b/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-boundary_%.bbappend
new file mode 100644
index 00000000..9e62e546
--- /dev/null
+++ b/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-boundary_%.bbappend
@@ -0,0 +1,4 @@
+SRCREV = "62132ae8ca90f821ae23bad8a70dfe50e1eaa62c"
+SRCBRANCH = "boundary-v2018.07"
+PV = "v2018.07+git${SRCPV}"
+COMPATIBLE_MACHINE = "(nitrogen6x|nitrogen6x-lite|nitrogen6sx|nitrogen7|nitrogen8m|nitrogen8mm|imx6-acl)"
diff --git a/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend b/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend
new file mode 100644
index 00000000..9f78d65b
--- /dev/null
+++ b/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend
@@ -0,0 +1,11 @@
+FILESEXTRAPATHS_prepend_mx6 := "${THISDIR}/boundary:"
+FILESEXTRAPATHS_prepend_mx7 := "${THISDIR}/boundary:"
+
+SRC_URI += "\
+ file://fw_env.config \
+"
+
+do_install_append () {
+ rm ${D}${sysconfdir}/fw_env.config
+ install -m 0644 ${WORKDIR}/fw_env.config ${D}${sysconfdir}/fw_env.config
+}
diff --git a/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-script-boundary_%.bbappend b/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-script-boundary_%.bbappend
new file mode 100644
index 00000000..62735957
--- /dev/null
+++ b/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-script-boundary_%.bbappend
@@ -0,0 +1,6 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+LIC_FILES_CHKSUM = "file://Licenses/README;md5=30503fd321432fc713238f582193b78e"
+SRCREV = "62132ae8ca90f821ae23bad8a70dfe50e1eaa62c"
+SRCBRANCH = "boundary-v2018.07"
+PV = "v2018.07+git${SRCPV}"
+COMPATIBLE_MACHINE = "(nitrogen6x|nitrogen6x-lite|nitrogen6sx|nitrogen7|nitrogen8m|nitrogen8mm|imx6-acl)"
diff --git a/bsp/meta-boundary/recipes-connectivity/bluez5/bluez5/0001-hciattach-add-QCA9377-Tuffello-support.patch b/bsp/meta-boundary/recipes-connectivity/bluez5/bluez5/0001-hciattach-add-QCA9377-Tuffello-support.patch
new file mode 100644
index 00000000..92ed1f61
--- /dev/null
+++ b/bsp/meta-boundary/recipes-connectivity/bluez5/bluez5/0001-hciattach-add-QCA9377-Tuffello-support.patch
@@ -0,0 +1,2379 @@
+From 97c6fcba2a45533c4a00f85c235fcdccc5e87fb7 Mon Sep 17 00:00:00 2001
+From: Gary Bisson <gary.bisson@boundarydevices.com>
+Date: Wed, 17 Aug 2016 11:36:28 +0200
+Subject: [PATCH] hciattach: add QCA9377 Tuffello support
+
+From CodeAurora repository:
+https://source.codeaurora.org/quic/la/platform/external/bluetooth/bluez/
+
+Modifications:
+- code indentation
+- remove verbose traces
+- use H4 protocol instead of IBS
+
+Also squashed:
+hciattach_rome: simplify baudrate setting
+hciattach_rome: do not override module internal MAC address
+hciattach_rome: force IBS to disabled in NVM
+hciattach_rome: display ROM and TLV info by default
+
+Signed-off-by: Gary Bisson <gary.bisson@boundarydevices.com>
+---
+ Makefile.tools | 1 +
+ android/Android.mk | 1 +
+ tools/hciattach.c | 12 +
+ tools/hciattach.h | 1 +
+ tools/hciattach_rome.c | 1872 ++++++++++++++++++++++++++++++++++++++++++++++++
+ tools/hciattach_rome.h | 388 ++++++++++
+ 6 files changed, 2275 insertions(+)
+ create mode 100644 tools/hciattach_rome.c
+ create mode 100644 tools/hciattach_rome.h
+
+diff --git a/Makefile.tools b/Makefile.tools
+index 0fd6dec87..984d6d212 100644
+--- a/Makefile.tools
++++ b/Makefile.tools
+@@ -281,6 +281,7 @@ tools_hciattach_SOURCES = tools/hciattach.c tools/hciattach.h \
+ tools/hciattach_ti.c \
+ tools/hciattach_tialt.c \
+ tools/hciattach_ath3k.c \
++ tools/hciattach_rome.c \
+ tools/hciattach_qualcomm.c \
+ tools/hciattach_intel.c \
+ tools/hciattach_bcm43xx.c
+diff --git a/android/Android.mk b/android/Android.mk
+index 38ef4aa97..d5045dacd 100644
+--- a/android/Android.mk
++++ b/android/Android.mk
+@@ -695,6 +695,7 @@ LOCAL_SRC_FILES := \
+ bluez/tools/hciattach_ti.c \
+ bluez/tools/hciattach_tialt.c \
+ bluez/tools/hciattach_ath3k.c \
++ bluez/tools/hciattach_rome.c \
+ bluez/tools/hciattach_qualcomm.c \
+ bluez/tools/hciattach_intel.c \
+ bluez/tools/hciattach_bcm43xx.c \
+diff --git a/tools/hciattach.c b/tools/hciattach.c
+index fad176c9b..02a65c692 100644
+--- a/tools/hciattach.c
++++ b/tools/hciattach.c
+@@ -263,6 +263,11 @@ static int ath3k_pm(int fd, struct uart_t *u, struct termios *ti)
+ return ath3k_post(fd, u->pm);
+ }
+
++static int qca(int fd, struct uart_t *u, struct termios *ti)
++{
++ return qca_soc_init(fd, u->speed, u->bdaddr);
++}
++
+ static int qualcomm(int fd, struct uart_t *u, struct termios *ti)
+ {
+ return qualcomm_init(fd, u->speed, ti, u->bdaddr);
+@@ -1093,6 +1098,10 @@ struct uart_t uart[] = {
+ { "ath3k", 0x0000, 0x0000, HCI_UART_ATH3K, 115200, 115200,
+ FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm },
+
++ /* QCA ROME */
++ { "qca", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200,
++ FLOW_CTL, DISABLE_PM, NULL, qca, NULL },
++
+ /* QUALCOMM BTS */
+ { "qualcomm", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200,
+ FLOW_CTL, DISABLE_PM, NULL, qualcomm, NULL },
+@@ -1145,6 +1154,9 @@ static int init_uart(char *dev, struct uart_t *u, int send_break, int raw)
+ if (u->flags & AMP_DEV)
+ flags |= 1 << HCI_UART_CREATE_AMP;
+
++ if (!strncmp(u->type, "qca", 3))
++ flags |= 1 << HCI_UART_RESET_ON_INIT;
++
+ fd = open(dev, O_RDWR | O_NOCTTY);
+ if (fd < 0) {
+ perror("Can't open serial port");
+diff --git a/tools/hciattach.h b/tools/hciattach.h
+index 249aab49e..85c801ccf 100644
+--- a/tools/hciattach.h
++++ b/tools/hciattach.h
+@@ -65,6 +65,7 @@ int bgb2xx_init(int dd, bdaddr_t *bdaddr);
+ int ath3k_init(int fd, int speed, int init_speed, char *bdaddr,
+ struct termios *ti);
+ int ath3k_post(int fd, int pm);
++int qca_soc_init(int fd, int speed, char *bdaddr);
+ int qualcomm_init(int fd, int speed, struct termios *ti, const char *bdaddr);
+ int intel_init(int fd, int init_speed, int *speed, struct termios *ti);
+ int bcm43xx_init(int fd, int def_speed, int speed, struct termios *ti,
+diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c
+new file mode 100644
+index 000000000..9a7f222c4
+--- /dev/null
++++ b/tools/hciattach_rome.c
+@@ -0,0 +1,1872 @@
++/*
++ *
++ * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
++ * Not a Contribution.
++ *
++ * Copyright 2012 The Android Open Source Project
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License"); you
++ * may not use this file except in compliance with the License. You may
++ * obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * permissions and limitations under the License.
++ *
++ */
++
++/******************************************************************************
++ *
++ * Filename: hciattach_rome.c
++ *
++ * Description: Contains controller-specific functions, like
++ * firmware patch download
++ * low power mode operations
++ *
++ ******************************************************************************/
++
++#define MODULE_HAS_MAC_ADDR
++#define LOG_TAG "bt_vendor"
++#include <stdio.h>
++#include <unistd.h>
++#include <sys/socket.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <sys/ioctl.h>
++#include <signal.h>
++#include <time.h>
++#include <errno.h>
++#include <fcntl.h>
++#include <dirent.h>
++#include <ctype.h>
++#include <stdlib.h>
++#include <string.h>
++#include <termios.h>
++#include <bluetooth/bluetooth.h>
++#include "hciattach_rome.h"
++#include "hciattach.h"
++
++/******************************************************************************
++ ** Variables
++ ******************************************************************************/
++FILE *file;
++unsigned char *phdr_buffer;
++unsigned char *pdata_buffer = NULL;
++patch_info rampatch_patch_info;
++int rome_ver = ROME_VER_UNKNOWN;
++unsigned char gTlv_type;
++unsigned char gtlv_dwndcfg;
++char *rampatch_file_path;
++char *nvm_file_path;
++vnd_userial_cb_t vnd_userial;
++unsigned char wait_vsc_evt = TRUE;
++
++/*****************************************************************************
++ ** Functions
++ *****************************************************************************/
++
++/*******************************************************************************
++ **
++ ** Function userial_to_tcio_baud
++ **
++ ** Description helper function converts USERIAL baud rates into TCIO
++ ** conforming baud rates
++ **
++ ** Returns TRUE/FALSE
++ **
++ *******************************************************************************/
++unsigned char userial_to_tcio_baud(unsigned char cfg_baud, unsigned int *baud)
++{
++ if (cfg_baud == USERIAL_BAUD_115200)
++ *baud = B115200;
++ else if (cfg_baud == USERIAL_BAUD_4M)
++ *baud = B4000000;
++ else if (cfg_baud == USERIAL_BAUD_3M)
++ *baud = B3000000;
++ else if (cfg_baud == USERIAL_BAUD_2M)
++ *baud = B2000000;
++ else if (cfg_baud == USERIAL_BAUD_1M)
++ *baud = B1000000;
++ else if (cfg_baud == USERIAL_BAUD_921600)
++ *baud = B921600;
++ else if (cfg_baud == USERIAL_BAUD_460800)
++ *baud = B460800;
++ else if (cfg_baud == USERIAL_BAUD_230400)
++ *baud = B230400;
++ else if (cfg_baud == USERIAL_BAUD_57600)
++ *baud = B57600;
++ else if (cfg_baud == USERIAL_BAUD_19200)
++ *baud = B19200;
++ else if (cfg_baud == USERIAL_BAUD_9600)
++ *baud = B9600;
++ else if (cfg_baud == USERIAL_BAUD_1200)
++ *baud = B1200;
++ else if (cfg_baud == USERIAL_BAUD_600)
++ *baud = B600;
++ else {
++ fprintf(stderr, "userial vendor open: unsupported baud idx %i\n", cfg_baud);
++ *baud = B115200;
++ return FALSE;
++ }
++
++ return TRUE;
++}
++
++
++/*******************************************************************************
++ **
++ ** Function userial_vendor_set_baud
++ **
++ ** Description Set new baud rate
++ **
++ ** Returns None
++ **
++ *******************************************************************************/
++void userial_vendor_set_baud(unsigned char userial_baud)
++{
++ unsigned int tcio_baud;
++
++ if (tcgetattr(vnd_userial.fd, &vnd_userial.termios) < 0) {
++ perror("Can't get port settings");
++ return;
++ }
++ cfmakeraw(&vnd_userial.termios);
++ vnd_userial.termios.c_cflag |= CLOCAL;
++ vnd_userial.termios.c_cflag |= CREAD;
++ vnd_userial.termios.c_cflag |= CS8;
++ tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios);
++
++ userial_to_tcio_baud(userial_baud, &tcio_baud);
++
++ cfsetospeed(&vnd_userial.termios, tcio_baud);
++ cfsetispeed(&vnd_userial.termios, tcio_baud);
++ tcsetattr(vnd_userial.fd, TCSADRAIN, &vnd_userial.termios); /* don't change speed until last write done */
++
++}
++
++
++/*******************************************************************************
++ **
++ ** Function userial_vendor_ioctl
++ **
++ ** Description ioctl inteface
++ **
++ ** Returns None
++ **
++ *******************************************************************************/
++int userial_vendor_ioctl(int fd, userial_vendor_ioctl_op_t op, int *p_data)
++{
++ int err = -1;
++ struct termios ti;
++
++ if (tcgetattr(fd, &ti) < 0) {
++ perror("Can't get port settings");
++ return -1;
++ }
++ cfmakeraw(&ti);
++ ti.c_cflag |= CLOCAL;
++ ti.c_cflag |= CREAD;
++ ti.c_cflag |= CS8;
++
++ switch(op) {
++#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
++ case USERIAL_OP_ASSERT_BT_WAKE:
++ VNDUSERIALDBG("## userial_vendor_ioctl: Asserting BT_Wake ##");
++ err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL);
++ break;
++
++ case USERIAL_OP_DEASSERT_BT_WAKE:
++ VNDUSERIALDBG("## userial_vendor_ioctl: De-asserting BT_Wake ##");
++ err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL);
++ break;
++
++ case USERIAL_OP_GET_BT_WAKE_STATE:
++ err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_GET_ST, p_data);
++ break;
++#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
++ case USERIAL_OP_FLOW_ON:
++ ti.c_cflag |= CRTSCTS;
++ if (err = tcsetattr(fd, TCSANOW, &ti) < 0) {
++ perror("Can't set port settings");
++ return -1;
++ }
++
++ break;
++
++ case USERIAL_OP_FLOW_OFF:
++ ti.c_cflag &= ~CRTSCTS;
++ if (err = tcsetattr(fd, TCSANOW, &ti) < 0) {
++ fprintf(stderr, "Can't set port settings");
++ return -1;
++ }
++ break;
++
++ default:
++ break;
++ }
++
++ return err;
++}
++
++
++int get_vs_hci_event(unsigned char *rsp)
++{
++ int err = 0, soc_id =0;
++ unsigned char paramlen = 0;
++
++ if ( (rsp[EVENTCODE_OFFSET] == VSEVENT_CODE) || (rsp[EVENTCODE_OFFSET] == EVT_CMD_COMPLETE))
++ PR_DBG("%s: Received HCI-Vendor Specific event\n", __FUNCTION__);
++ else {
++ fprintf(stderr, "%s: Failed to receive HCI-Vendor Specific event\n", __FUNCTION__);
++ err = -EIO;
++ goto failed;
++ }
++
++ /* Check the status of the operation */
++ switch ( rsp[CMD_RSP_OFFSET] ) {
++ case EDL_CMD_REQ_RES_EVT:
++ switch(rsp[RSP_TYPE_OFFSET]) {
++ case EDL_PATCH_VER_RES_EVT:
++ case EDL_APP_VER_RES_EVT:
++ PR_INFO("Current Product ID\t\t: 0x%08x\n",
++ (unsigned int)(rsp[PATCH_PROD_ID_OFFSET +3] << 24 |
++ rsp[PATCH_PROD_ID_OFFSET+2] << 16 |
++ rsp[PATCH_PROD_ID_OFFSET+1] << 8 |
++ rsp[PATCH_PROD_ID_OFFSET] ));
++
++ /* Patch Version indicates FW patch version */
++ PR_INFO("Current Patch Version\t\t: 0x%04x\n",
++ (unsigned short)(rsp[PATCH_PATCH_VER_OFFSET + 1] << 8 |
++ rsp[PATCH_PATCH_VER_OFFSET] ));
++
++ /* ROM Build Version indicates ROM build version like 1.0/1.1/2.0 */
++ rome_ver = (int)(rsp[PATCH_ROM_BUILD_VER_OFFSET + 1] << 8 |
++ rsp[PATCH_ROM_BUILD_VER_OFFSET]);
++ PR_INFO("Current ROM Build Version\t: 0x%04x\n", rome_ver);
++
++ /* In case rome 1.0/1.1, there is no SOC ID version available */
++ if (paramlen - 10) {
++ soc_id = (unsigned int)(rsp[PATCH_SOC_VER_OFFSET +3] << 24 |
++ rsp[PATCH_SOC_VER_OFFSET+2] << 16 |
++ rsp[PATCH_SOC_VER_OFFSET+1] << 8 |
++ rsp[PATCH_SOC_VER_OFFSET]);
++ PR_INFO("Current SOC Version\t\t: 0x%08x\n", soc_id);
++ }
++
++ /* Rome Chipset Version can be decided by Patch version and SOC version,
++ Upper 2 bytes will be used for Patch version and Lower 2 bytes will be
++ used for SOC as combination for BT host driver */
++ rome_ver = (rome_ver << 16) | (soc_id & 0x0000ffff);
++ break;
++ case EDL_TVL_DNLD_RES_EVT:
++ case EDL_CMD_EXE_STATUS_EVT:
++ switch (err = rsp[CMD_STATUS_OFFSET]) {
++ case HCI_CMD_SUCCESS:
++ PR_DBG("%s: Download Packet successfully!\n", __FUNCTION__);
++ break;
++ case PATCH_LEN_ERROR:
++ fprintf(stderr, "%s: Invalid patch length argument passed for EDL PATCH "
++ "SET REQ cmd\n", __FUNCTION__);
++ break;
++ case PATCH_VER_ERROR:
++ fprintf(stderr, "%s: Invalid patch version argument passed for EDL PATCH "
++ "SET REQ cmd\n", __FUNCTION__);
++ break;
++ case PATCH_CRC_ERROR:
++ fprintf(stderr, "%s: CRC check of patch failed!!!\n", __FUNCTION__);
++ break;
++ case PATCH_NOT_FOUND:
++ fprintf(stderr, "%s: Invalid patch data!!!\n", __FUNCTION__);
++ break;
++ case TLV_TYPE_ERROR:
++ fprintf(stderr, "%s: TLV Type Error !!!\n", __FUNCTION__);
++ break;
++ default:
++ fprintf(stderr, "%s: Undefined error (0x%x)", __FUNCTION__, err);
++ break;
++ }
++ break;
++ }
++ break;
++
++ case NVM_ACCESS_CODE:
++ PR_DBG("%s: NVM Access Code!!!\n", __FUNCTION__);
++ err = HCI_CMD_SUCCESS;
++ break;
++ case EDL_SET_BAUDRATE_RSP_EVT:
++ /* Rome 1.1 has bug with the response, so it should ignore it. */
++ if (rsp[BAUDRATE_RSP_STATUS_OFFSET] != BAUDRATE_CHANGE_SUCCESS) {
++ fprintf(stderr, "%s: Set Baudrate request failed - 0x%x\n", __FUNCTION__,
++ rsp[CMD_STATUS_OFFSET]);
++ err = -1;
++ }
++ break;
++ default:
++ fprintf(stderr, "%s: Not a valid status!!!\n", __FUNCTION__);
++ err = -1;
++ break;
++ }
++
++failed:
++ return err;
++}
++
++
++int wait_for_data(int fd, int maxTimeOut)
++{
++ fd_set infids;
++ struct timeval timeout;
++
++ if (maxTimeOut <= 0) {
++ fprintf(stderr, "%s: Invalid timeout value specified", __func__);
++ return -EINVAL;
++ }
++
++ FD_ZERO (&infids);
++ FD_SET (fd, &infids);
++ timeout.tv_sec = maxTimeOut;
++ timeout.tv_usec = 0;
++
++ /* Check whether data is available in TTY buffer before calling read() */
++ if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) {
++ fprintf(stderr, "%s: Timing out on select for %d secs.\n", __FUNCTION__, maxTimeOut);
++ return -1;
++ }
++
++ return 1;
++}
++
++/*
++ * Read an VS HCI event from the given file descriptor.
++ */
++int read_vs_hci_event(int fd, unsigned char* buf, int size)
++{
++ int remain, r, retry = 0;
++ int count = 0;
++
++ if (size <= 0) {
++ fprintf(stderr, "Invalid size arguement!\n");
++ return -1;
++ }
++
++ /* Check whether data is available in TTY buffer before calling read() */
++ if (wait_for_data(fd, SELECT_TIMEOUT) < 1)
++ return -1;
++
++ /* The first byte identifies the packet type. For HCI event packets, it
++ * should be 0x04, so we read until we get to the 0x04. */
++ /* It will keep reading until find 0x04 byte */
++ while (1) {
++ /* Read UART Buffer for HCI-DATA */
++ r = read(fd, buf, 1);
++ if (r <= 0) {
++ fprintf(stderr, "%s: read() failed. error: %d\n",
++ __FUNCTION__, r);
++ return -1;
++ }
++
++ /* Check if received data is HCI-DATA or not.
++ * If not HCI-DATA, then retry reading the UART Buffer once.
++ * Sometimes there could be corruption on the UART lines and to
++ * avoid that retry once reading the UART Buffer for HCI-DATA.
++ */
++ if (buf[0] == 0x04) { /* Recvd. HCI DATA */
++ retry = 0;
++ break;
++ }
++ else if (retry < MAX_RETRY_CNT) { /* Retry mechanism */
++ retry++;
++ fprintf(stderr, "%s: Not an HCI-VS-Event! buf[0]: %d",
++ __FUNCTION__, buf[0]);
++ if (wait_for_data(fd, SELECT_TIMEOUT) < 1)
++ return -1;
++ else /* Data available in UART Buffer: Continue to read */
++ continue;
++ }
++ else { /* RETRY failed : Exiting with failure */
++ fprintf(stderr, "%s: RETRY failed!", __FUNCTION__);
++ return -1;
++ }
++ }
++ count++;
++
++ /* The next two bytes are the event code and parameter total length. */
++ while (count < 3) {
++ r = read(fd, buf + count, 3 - count);
++ if ((r <= 0) || (buf[1] != 0xFF )) {
++ fprintf(stderr, "It is not VS event !!\n");
++ return -1;
++ }
++ count += r;
++ }
++
++ /* Now we read the parameters. */
++ if (buf[2] < (size - 3))
++ remain = buf[2];
++ else
++ remain = size - 3;
++
++ while ((count - 3) < remain) {
++ r = read(fd, buf + count, remain - (count - 3));
++ if (r <= 0)
++ return -1;
++ count += r;
++ }
++
++ /* Check if the set patch command is successful or not */
++ if (get_vs_hci_event(buf) != HCI_CMD_SUCCESS)
++ return -1;
++
++ return count;
++}
++
++
++int hci_send_vs_cmd(int fd, unsigned char *cmd, unsigned char *rsp, int size)
++{
++ int ret = 0;
++
++ /* Send the HCI command packet to UART for transmission */
++ ret = write(fd, cmd, size);
++ if (ret != size) {
++ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, ret);
++ goto failed;
++ }
++
++ if (wait_vsc_evt) {
++ /* Check for response from the Controller */
++ if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) {
++ ret = -ETIMEDOUT;
++ fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__);
++ goto failed;
++ }
++ }
++
++failed:
++ return ret;
++}
++
++void frame_hci_cmd_pkt(
++ unsigned char *cmd,
++ int edl_cmd, unsigned int p_base_addr,
++ int segtNo, int size
++ )
++{
++ int offset = 0;
++ hci_command_hdr *cmd_hdr;
++
++ memset(cmd, 0x0, HCI_MAX_CMD_SIZE);
++
++ cmd_hdr = (void *) (cmd + 1);
++
++ cmd[0] = HCI_COMMAND_PKT;
++ cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, HCI_PATCH_CMD_OCF);
++ cmd_hdr->plen = size;
++ cmd[4] = edl_cmd;
++
++ switch (edl_cmd) {
++ case EDL_PATCH_SET_REQ_CMD:
++ /* Copy the patch header info as CMD params */
++ memcpy(&cmd[5], phdr_buffer, PATCH_HDR_LEN);
++ PR_DBG("%s: Sending EDL_PATCH_SET_REQ_CMD\n", __FUNCTION__);
++ PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n",
++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]);
++ break;
++ case EDL_PATCH_DLD_REQ_CMD:
++ offset = ((segtNo - 1) * MAX_DATA_PER_SEGMENT);
++ p_base_addr += offset;
++ cmd_hdr->plen = (size + 6);
++ cmd[5] = (size + 4);
++ cmd[6] = EXTRACT_BYTE(p_base_addr, 0);
++ cmd[7] = EXTRACT_BYTE(p_base_addr, 1);
++ cmd[8] = EXTRACT_BYTE(p_base_addr, 2);
++ cmd[9] = EXTRACT_BYTE(p_base_addr, 3);
++ memcpy(&cmd[10], (pdata_buffer + offset), size);
++
++ PR_DBG("%s: Sending EDL_PATCH_DLD_REQ_CMD: size: %d bytes\n",
++ __FUNCTION__, size);
++ PR_DBG("HCI-CMD %d:\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t"
++ "0x%x\t0x%x\t0x%x\t\n", segtNo, cmd[0], cmd[1], cmd[2],
++ cmd[3], cmd[4], cmd[5], cmd[6], cmd[7], cmd[8], cmd[9]);
++ break;
++ case EDL_PATCH_ATCH_REQ_CMD:
++ PR_DBG("%s: Sending EDL_PATCH_ATTACH_REQ_CMD\n", __FUNCTION__);
++ PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n",
++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]);
++ break;
++ case EDL_PATCH_RST_REQ_CMD:
++ PR_DBG("%s: Sending EDL_PATCH_RESET_REQ_CMD\n", __FUNCTION__);
++ PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n",
++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]);
++ break;
++ case EDL_PATCH_VER_REQ_CMD:
++ PR_DBG("%s: Sending EDL_PATCH_VER_REQ_CMD\n", __FUNCTION__);
++ PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n",
++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]);
++ break;
++ case EDL_PATCH_TLV_REQ_CMD:
++ PR_DBG("%s: Sending EDL_PATCH_TLV_REQ_CMD\n", __FUNCTION__);
++ /* Parameter Total Length */
++ cmd[3] = size +2;
++
++ /* TLV Segment Length */
++ cmd[5] = size;
++ PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n",
++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], cmd[5]);
++ offset = (segtNo * MAX_SIZE_PER_TLV_SEGMENT);
++ memcpy(&cmd[6], (pdata_buffer + offset), size);
++ break;
++ default:
++ fprintf(stderr, "%s: Unknown EDL CMD !!!\n", __FUNCTION__);
++ }
++}
++
++void rome_extract_patch_header_info(unsigned char *buf)
++{
++ int index;
++
++ /* Extract patch id */
++ for (index = 0; index < 4; index++)
++ rampatch_patch_info.patch_id |=
++ (LSH(buf[index + P_ID_OFFSET], (index * 8)));
++
++ /* Extract (ROM and BUILD) version information */
++ for (index = 0; index < 2; index++)
++ rampatch_patch_info.patch_ver.rom_version |=
++ (LSH(buf[index + P_ROME_VER_OFFSET], (index * 8)));
++
++ for (index = 0; index < 2; index++)
++ rampatch_patch_info.patch_ver.build_version |=
++ (LSH(buf[index + P_BUILD_VER_OFFSET], (index * 8)));
++
++ /* Extract patch base and entry addresses */
++ for (index = 0; index < 4; index++)
++ rampatch_patch_info.patch_base_addr |=
++ (LSH(buf[index + P_BASE_ADDR_OFFSET], (index * 8)));
++
++ /* Patch BASE & ENTRY addresses are same */
++ rampatch_patch_info.patch_entry_addr = rampatch_patch_info.patch_base_addr;
++
++ /* Extract total length of the patch payload */
++ for (index = 0; index < 4; index++)
++ rampatch_patch_info.patch_length |=
++ (LSH(buf[index + P_LEN_OFFSET], (index * 8)));
++
++ /* Extract the CRC checksum of the patch payload */
++ for (index = 0; index < 4; index++)
++ rampatch_patch_info.patch_crc |=
++ (LSH(buf[index + P_CRC_OFFSET], (index * 8)));
++
++ /* Extract patch control value */
++ for (index = 0; index < 4; index++)
++ rampatch_patch_info.patch_ctrl |=
++ (LSH(buf[index + P_CONTROL_OFFSET], (index * 8)));
++
++ fprintf(stderr, "PATCH_ID\t : 0x%x\n", rampatch_patch_info.patch_id);
++ fprintf(stderr, "ROM_VERSION\t : 0x%x\n", rampatch_patch_info.patch_ver.rom_version);
++ fprintf(stderr, "BUILD_VERSION\t : 0x%x\n", rampatch_patch_info.patch_ver.build_version);
++ fprintf(stderr, "PATCH_LENGTH\t : 0x%x\n", rampatch_patch_info.patch_length);
++ fprintf(stderr, "PATCH_CRC\t : 0x%x\n", rampatch_patch_info.patch_crc);
++ fprintf(stderr, "PATCH_CONTROL\t : 0x%x\n", rampatch_patch_info.patch_ctrl);
++ fprintf(stderr, "PATCH_BASE_ADDR\t : 0x%x\n", rampatch_patch_info.patch_base_addr);
++
++}
++
++int rome_edl_set_patch_request(int fd)
++{
++ int size, err;
++ unsigned char cmd[HCI_MAX_CMD_SIZE];
++ unsigned char rsp[HCI_MAX_EVENT_SIZE];
++
++ /* Frame the HCI CMD to be sent to the Controller */
++ frame_hci_cmd_pkt(cmd, EDL_PATCH_SET_REQ_CMD, 0,
++ -1, PATCH_HDR_LEN + 1);
++
++ /* Total length of the packet to be sent to the Controller */
++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]);
++
++ /* Send HCI Command packet to Controller */
++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size);
++ if (err != size) {
++ fprintf(stderr, "Failed to set the patch info to the Controller!\n");
++ goto error;
++ }
++
++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE);
++ if (err < 0) {
++ fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__);
++ goto error;
++ }
++error:
++ return err;
++}
++
++int rome_edl_patch_download_request(int fd)
++{
++ int no_of_patch_segment;
++ int index = 1, err = 0, size = 0;
++ unsigned int p_base_addr;
++ unsigned char cmd[HCI_MAX_CMD_SIZE];
++ unsigned char rsp[HCI_MAX_EVENT_SIZE];
++
++ no_of_patch_segment = (rampatch_patch_info.patch_length /
++ MAX_DATA_PER_SEGMENT);
++
++ /* Initialize the patch base address from the one read from bin file */
++ p_base_addr = rampatch_patch_info.patch_base_addr;
++
++ /*
++ * Depending upon size of the patch payload, download the patches in
++ * segments with a max. size of 239 bytes
++ */
++ for (index = 1; index <= no_of_patch_segment; index++) {
++ /* Frame the HCI CMD PKT to be sent to Controller*/
++ frame_hci_cmd_pkt(cmd, EDL_PATCH_DLD_REQ_CMD, p_base_addr,
++ index, MAX_DATA_PER_SEGMENT);
++
++ /* Total length of the packet to be sent to the Controller */
++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]);
++
++ /* Initialize the RSP packet everytime to 0 */
++ memset(rsp, 0x0, HCI_MAX_EVENT_SIZE);
++
++ /* Send HCI Command packet to Controller */
++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size);
++ if (err != size) {
++ fprintf(stderr, "Failed to send the patch payload to the Controller!\n");
++ goto error;
++ }
++
++ /* Read Command Complete Event */
++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE);
++ if (err < 0) {
++ fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n",
++ __FUNCTION__, index);
++ goto error;
++ }
++ }
++
++ /* Check if any pending patch data to be sent */
++ size = (rampatch_patch_info.patch_length < MAX_DATA_PER_SEGMENT) ?
++ rampatch_patch_info.patch_length :
++ (rampatch_patch_info.patch_length % MAX_DATA_PER_SEGMENT);
++
++ if (size) {
++ /* Frame the HCI CMD PKT to be sent to Controller*/
++ frame_hci_cmd_pkt(cmd, EDL_PATCH_DLD_REQ_CMD, p_base_addr, index, size);
++
++ /* Initialize the RSP packet everytime to 0 */
++ memset(rsp, 0x0, HCI_MAX_EVENT_SIZE);
++
++ /* Total length of the packet to be sent to the Controller */
++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]);
++
++ /* Send HCI Command packet to Controller */
++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size);
++ if (err != size) {
++ fprintf(stderr, "Failed to send the patch payload to the Controller!\n");
++ goto error;
++ }
++
++ /* Read Command Complete Event */
++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE);
++ if (err < 0) {
++ fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n",
++ __FUNCTION__, index);
++ goto error;
++ }
++ }
++
++error:
++ return err;
++}
++
++static int rome_download_rampatch(int fd)
++{
++ int c, size, index, ret = -1;
++
++ /* Get handle to the RAMPATCH binary file */
++ fprintf(stderr, "%s: Getting handle to the RAMPATCH binary file from %s\n", __FUNCTION__, ROME_FW_PATH);
++ file = fopen(ROME_FW_PATH, "r");
++ if (file == NULL) {
++ fprintf(stderr, "%s: Failed to get handle to the RAMPATCH bin file!\n",
++ __FUNCTION__);
++ return -ENFILE;
++ }
++
++ /* Allocate memory for the patch headder info */
++ fprintf(stderr, "%s: Allocating memory for the patch header\n", __FUNCTION__);
++ phdr_buffer = (unsigned char *) malloc(PATCH_HDR_LEN + 1);
++ if (phdr_buffer == NULL) {
++ fprintf(stderr, "%s: Failed to allocate memory for patch header\n",
++ __FUNCTION__);
++ goto phdr_alloc_failed;
++ }
++ for (index = 0; index < PATCH_HDR_LEN + 1; index++)
++ phdr_buffer[index] = 0x0;
++
++ /* Read 28 bytes of patch header information */
++ fprintf(stderr, "%s: Reading patch header info\n", __FUNCTION__);
++ index = 0;
++ do {
++ c = fgetc (file);
++ phdr_buffer[index++] = (unsigned char)c;
++ } while (index != PATCH_HDR_LEN);
++
++ /* Save the patch header info into local structure */
++ fprintf(stderr, "%s: Saving patch hdr. info\n", __FUNCTION__);
++ rome_extract_patch_header_info((unsigned char *)phdr_buffer);
++
++ /* Set the patch header info onto the Controller */
++ ret = rome_edl_set_patch_request(fd);
++ if (ret < 0) {
++ fprintf(stderr, "%s: Error setting the patchheader info!\n", __FUNCTION__);
++ goto pdata_alloc_failed;
++ }
++
++ /* Allocate memory for the patch payload */
++ fprintf(stderr, "%s: Allocating memory for patch payload\n", __FUNCTION__);
++ size = rampatch_patch_info.patch_length;
++ pdata_buffer = (unsigned char *) malloc(size+1);
++ if (pdata_buffer == NULL) {
++ fprintf(stderr, "%s: Failed to allocate memory for patch payload\n",
++ __FUNCTION__);
++ goto pdata_alloc_failed;
++ }
++ for (index = 0; index < size+1; index++)
++ pdata_buffer[index] = 0x0;
++
++ /* Read the patch data from Rampatch binary image */
++ fprintf(stderr, "%s: Reading patch payload from RAMPATCH file\n", __FUNCTION__);
++ index = 0;
++ do {
++ c = fgetc (file);
++ pdata_buffer[index++] = (unsigned char)c;
++ } while (c != EOF);
++
++ /* Downloading patches in segments to controller */
++ ret = rome_edl_patch_download_request(fd);
++ if (ret < 0) {
++ fprintf(stderr, "%s: Error downloading patch segments!\n", __FUNCTION__);
++ goto cleanup;
++ }
++cleanup:
++ free(pdata_buffer);
++pdata_alloc_failed:
++ free(phdr_buffer);
++phdr_alloc_failed:
++ fclose(file);
++
++ return ret;
++}
++
++int rome_attach_rampatch(int fd)
++{
++ int size, err;
++ unsigned char cmd[HCI_MAX_CMD_SIZE];
++ unsigned char rsp[HCI_MAX_EVENT_SIZE];
++
++ /* Frame the HCI CMD to be sent to the Controller */
++ frame_hci_cmd_pkt(cmd, EDL_PATCH_ATCH_REQ_CMD, 0,
++ -1, EDL_PATCH_CMD_LEN);
++
++ /* Total length of the packet to be sent to the Controller */
++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]);
++
++ /* Send HCI Command packet to Controller */
++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size);
++ if (err != size) {
++ fprintf(stderr, "Failed to attach the patch payload to the Controller!\n");
++ goto error;
++ }
++
++ /* Read Command Complete Event */
++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE);
++ if (err < 0) {
++ fprintf(stderr, "%s: Failed to attach the patch segment(s)\n", __FUNCTION__);
++ goto error;
++ }
++error:
++ return err;
++}
++
++int rome_rampatch_reset(int fd)
++{
++ int size, err = 0;
++ unsigned char cmd[HCI_MAX_CMD_SIZE];
++ struct timespec tm = { 0, 100*1000*1000 }; /* 100 ms */
++
++ /* Frame the HCI CMD to be sent to the Controller */
++ frame_hci_cmd_pkt(cmd, EDL_PATCH_RST_REQ_CMD, 0,
++ -1, EDL_PATCH_CMD_LEN);
++
++ /* Total length of the packet to be sent to the Controller */
++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN);
++
++ /* Send HCI Command packet to Controller */
++ err = write(fd, cmd, size);
++ if (err != size) {
++ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err);
++ goto error;
++ }
++
++ /*
++ * Controller doesn't sends any response for the patch reset
++ * command. HOST has to wait for 100ms before proceeding.
++ */
++ nanosleep(&tm, NULL);
++
++error:
++ return err;
++}
++
++int get_value_from_config(char *file_path,char *param)
++{
++ FILE *pfile = NULL;
++ char *line = NULL;
++ char *pch = NULL;
++ char param_str[20];
++ int bytes_read = 0, position;
++ int ret = -1;
++
++ if (!file_path || !param) {
++ fprintf(stderr,"Invalid arguments\n");
++ return -EINVAL;
++ }
++
++ pfile = fopen(file_path, "r" );
++ if (!pfile) {
++ fprintf(stderr, "Failed to open %s\n", file_path);
++ return ret;
++ }
++
++ while (getline(&line, &bytes_read, pfile) > 0 ) {
++ if (line[0] != '#' && line[0] != '\n') {
++ pch = memchr(line, '=', strlen(line));
++ if (pch != NULL) {
++ position = pch - line;
++ strncpy(param_str, line, position);
++ if (strncmp(param_str, param, position) == 0) {
++ ret = atoi(pch + 1);
++ break;
++ }
++ }
++ }
++ }
++ free(line);
++ fclose(pfile);
++ return ret;
++}
++
++int read_bd_address(unsigned char *bdaddr)
++{
++ int fd = -1;
++ int readPtr = 0;
++ unsigned char data[BD_ADDR_LEN];
++
++ /* Open the persist file for reading device address*/
++ fd = open("/etc/bluetooth/.bt_nv.bin", O_RDONLY);
++ if (fd < 0) {
++ fprintf(stderr, "%s: Open failed: Programming default BD ADDR\n", __func__);
++ return -1;
++ }
++
++ /* Read the NVM Header : fp will be advanced by readPtr number of bytes */
++ readPtr = read(fd, data, PERSIST_HEADER_LEN);
++ if (readPtr > 0)
++ fprintf(stderr, "%s: Persist header data: %02x \t %02x \t %02x\n", __func__,
++ data[NVITEM], data[RDWR_PROT], data[NVITEM_SIZE]);
++ else {
++ fprintf(stderr, "%s: Read from persist memory failed : Programming default"
++ " BD ADDR\n");
++ close(fd);
++ return -1;
++ }
++
++ /* Check for BD ADDR length before programming */
++ if (data[NVITEM_SIZE] != BD_ADDR_LEN) {
++ fprintf(stderr, "Invalid BD ADDR: Programming default BD ADDR!\n");
++ close(fd);
++ return -1;
++ }
++
++ /* Read the BD ADDR info */
++ readPtr = read(fd, data, BD_ADDR_LEN);
++ if (readPtr > 0)
++ fprintf(stderr, "BD-ADDR: ==> %02x:%02x:%02x:%02x:%02x:%02x\n", data[0],
++ data[1], data[2], data[3], data[4], data[5]);
++ else {
++ fprintf(stderr, "%s: Read from persist memory failed : Programming default"
++ " BD ADDR\n");
++ close(fd);
++ return -1;
++ }
++ memcpy(bdaddr, data, BD_ADDR_LEN);
++ close(fd);
++ return 0;
++}
++
++int isSpeedValid(int speed, unsigned char *baud_rate)
++{
++ switch(speed) {
++ case 9600:
++ *baud_rate = BAUDRATE_9600;
++ break;
++ case 19200:
++ *baud_rate = BAUDRATE_19200;
++ break;
++ case 57600:
++ *baud_rate = BAUDRATE_57600;
++ break;
++ case 115200:
++ *baud_rate = BAUDRATE_115200;
++ break;
++ case 230400:
++ *baud_rate = BAUDRATE_230400;
++ break;
++ case 460800:
++ *baud_rate = BAUDRATE_460800;
++ break;
++ case 921600:
++ *baud_rate = BAUDRATE_921600;
++ break;
++ case 1000000:
++ *baud_rate = BAUDRATE_1000000;
++ break;
++ case 2000000:
++ *baud_rate = BAUDRATE_2000000;
++ break;
++ case 3000000:
++ *baud_rate = BAUDRATE_3000000;
++ break;
++ case 4000000:
++ *baud_rate = BAUDRATE_4000000;
++ break;
++ case 300:
++ case 600:
++ case 1200:
++ case 2400:
++ default:
++ fprintf(stderr, "Invalid baudrate, default to 115200!\n");
++ *baud_rate = BAUDRATE_115200;
++ break;
++ }
++ return -1;
++}
++
++int rome_get_tlv_file(char *file_path, unsigned char baud_rate)
++{
++ FILE * pFile;
++ long fileSize;
++ int readSize, nvm_length, nvm_index, i;
++ unsigned short nvm_tag_len;
++ tlv_patch_info *ptlv_header;
++ tlv_nvm_hdr *nvm_ptr;
++ unsigned char data_buf[PRINT_BUF_SIZE]={0,};
++ unsigned char *nvm_byte_ptr;
++ unsigned char bdaddr[6];
++ unsigned short pcm_value, ibs_value;
++ unsigned short deep_sleep_value;
++
++ pFile = fopen ( file_path , "r" );
++ if (pFile==NULL) {
++ fprintf(stderr, "%s File Open Fail\n", file_path);
++ return -1;
++ }
++
++ /* Get File Size */
++ fseek (pFile , 0 , SEEK_END);
++
++ if ((fileSize = ftell(pFile)) < 0) {
++ fprintf(stderr, "%s: fail to get current file position\n", file_path);
++ fclose(pFile);
++ return -1;
++ }
++
++ if (fileSize == 0) {
++ fprintf(stderr, "%s: no content in the file\n", file_path);
++ fclose(pFile);
++ return -1;
++ }
++
++ rewind (pFile);
++
++ pdata_buffer = (unsigned char*) malloc (sizeof(char)*fileSize);
++ if (pdata_buffer == NULL) {
++ fprintf(stderr, "Allocated Memory failed\n");
++ fclose (pFile);
++ return -1;
++ }
++
++ /* Copy file into allocated buffer */
++ readSize = fread (pdata_buffer,1,fileSize,pFile);
++
++ /* File Close */
++ fclose (pFile);
++
++ if (readSize != fileSize) {
++ fprintf(stderr, "Read file size(%d) not matched with actual file size (%ld bytes)\n",readSize,fileSize);
++ return -1;
++ }
++
++ ptlv_header = (tlv_patch_info *) pdata_buffer;
++
++ /* To handle different event between rampatch and NVM */
++ gTlv_type = ptlv_header->tlv_type;
++ gtlv_dwndcfg = ptlv_header->tlv.patch.dwnd_cfg;
++
++ if (ptlv_header->tlv_type == TLV_TYPE_PATCH) {
++ PR_INFO("====================================================\n");
++ PR_INFO("TLV Type : 0x%x\n", ptlv_header->tlv_type);
++ PR_INFO("Length : %d bytes\n", (ptlv_header->tlv_length1) |
++ (ptlv_header->tlv_length2 << 8) |
++ (ptlv_header->tlv_length3 << 16));
++ PR_INFO("Total Length : %d bytes\n", ptlv_header->tlv.patch.tlv_data_len);
++ PR_INFO("Patch Data Length : %d bytes\n",ptlv_header->tlv.patch.tlv_patch_data_len);
++ PR_INFO("Signing Format Version : 0x%x\n", ptlv_header->tlv.patch.sign_ver);
++ PR_INFO("Signature Algorithm : 0x%x\n", ptlv_header->tlv.patch.sign_algorithm);
++ PR_INFO("Event Handling : 0x%x\n", ptlv_header->tlv.patch.dwnd_cfg);
++ PR_INFO("Reserved : 0x%x\n", ptlv_header->tlv.patch.reserved1);
++ PR_INFO("Product ID : 0x%04x\n", ptlv_header->tlv.patch.prod_id);
++ PR_INFO("Rom Build Version : 0x%04x\n", ptlv_header->tlv.patch.build_ver);
++ PR_INFO("Patch Version : 0x%04x\n", ptlv_header->tlv.patch.patch_ver);
++ PR_INFO("Reserved : 0x%x\n", ptlv_header->tlv.patch.reserved2);
++ PR_INFO("Patch Entry Address : 0x%x\n", (ptlv_header->tlv.patch.patch_entry_addr));
++ PR_INFO("====================================================\n");
++
++ } else if (ptlv_header->tlv_type == TLV_TYPE_NVM) {
++ PR_INFO("====================================================\n");
++ PR_INFO("TLV Type : 0x%x\n", ptlv_header->tlv_type);
++ PR_INFO("Length : %d bytes\n", nvm_length =
++ (ptlv_header->tlv_length1) |
++ (ptlv_header->tlv_length2 << 8) |
++ (ptlv_header->tlv_length3 << 16));
++
++ if (nvm_length <= 0)
++ return readSize;
++
++ for(nvm_byte_ptr=(unsigned char *)(nvm_ptr = &(ptlv_header->tlv.nvm)), nvm_index=0;
++ nvm_index < nvm_length ; nvm_ptr = (tlv_nvm_hdr *) nvm_byte_ptr) {
++ PR_DBG("TAG ID\t\t\t : %d\n", nvm_ptr->tag_id);
++ PR_DBG("TAG Length\t\t\t : %d\n", nvm_tag_len = nvm_ptr->tag_len);
++ PR_DBG("TAG Pointer\t\t\t : %d\n", nvm_ptr->tag_ptr);
++ PR_DBG("TAG Extended Flag\t\t : %d\n", nvm_ptr->tag_ex_flag);
++
++ /* Increase nvm_index to NVM data */
++ nvm_index+=sizeof(tlv_nvm_hdr);
++ nvm_byte_ptr+=sizeof(tlv_nvm_hdr);
++
++#ifndef MODULE_HAS_MAC_ADDR
++ /* Write BD Address */
++ if (nvm_ptr->tag_id == TAG_NUM_2 && read_bd_address(bdaddr) == 0) {
++ memcpy(nvm_byte_ptr, bdaddr, 6);
++ PR_INFO("Overriding default BD ADDR with user"
++ " programmed BD Address: %02x:%02x:%02x:%02x:%02x:%02x\n",
++ *nvm_byte_ptr, *(nvm_byte_ptr+1), *(nvm_byte_ptr+2),
++ *(nvm_byte_ptr+3), *(nvm_byte_ptr+4), *(nvm_byte_ptr+5));
++ }
++#else
++ /* Remove it from NVM data */
++ if (nvm_ptr->tag_id == TAG_NUM_2) {
++ int nvm_size = nvm_ptr->tag_len + sizeof(tlv_nvm_hdr);
++ PR_INFO("Skip BD Address from NVM\n");
++ nvm_index += nvm_ptr->tag_len;
++ nvm_byte_ptr += nvm_ptr->tag_len;
++ memmove(nvm_ptr, nvm_byte_ptr, nvm_length - nvm_index);
++ nvm_length -= nvm_size;
++ nvm_byte_ptr -= nvm_size;
++ readSize -= nvm_size;
++ nvm_index -= nvm_size;
++ continue;
++ }
++#endif
++
++ if (nvm_ptr->tag_id == TAG_NUM_17) {
++ PR_DBG("Forcing IBS to be disabled\n");
++ nvm_byte_ptr[FWCONF_IBS_VAL_OFFSET] &=
++ (~(FWCONF_IBS_ENABLE << FWCONF_IBS_VAL_BIT));
++ if (baud_rate != nvm_byte_ptr[FWCONF_BAUD_VAL_OFFSET]) {
++ PR_INFO("Change Vendor Baud from 0x%02x to 0x%02x\n",
++ nvm_byte_ptr[FWCONF_BAUD_VAL_OFFSET], baud_rate);
++ nvm_byte_ptr[FWCONF_BAUD_VAL_OFFSET] = baud_rate;
++ }
++ }
++
++ if (nvm_ptr->tag_id == TAG_NUM_27) {
++ if ((deep_sleep_value =
++ get_value_from_config(FW_CONFIG_FILE_PATH, "DEEP_SLEEP")) >= 0) {
++ if (deep_sleep_value == FWCONF_DEEP_SLEEP_DISABLE) {
++ nvm_byte_ptr[FWCONF_DEEP_SLEEP_BYTE_OFFSET] &=
++ (~(1 << FWCONF_DEEP_SLEEP_BIT_OFFSET));
++ } else if (deep_sleep_value == FWCONF_DEEP_SLEEP_ENABLE) {
++ nvm_byte_ptr[FWCONF_DEEP_SLEEP_BYTE_OFFSET] |=
++ (1 << FWCONF_DEEP_SLEEP_BIT_OFFSET);
++ } else {
++ fprintf(stderr, "Ignoring invalid deep sleep config value\n");
++ }
++ }
++ }
++
++ /* Read from file and check what PCM Configuration is required:
++ * Master = 0 /Slave = 1 */
++ /* Override PCM configuration */
++ if (nvm_ptr->tag_id == TAG_NUM_44) {
++ if ((pcm_value =
++ get_value_from_config(FW_CONFIG_FILE_PATH, "PCM")) >= 0) {
++
++ if (pcm_value == FWCONF_PCM_SLAVE) {
++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] |=
++ (1 << FWCONF_PCM_ROLE_BIT_OFFSET);
++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] |=
++ (1 << FWCONF_PCM_ROLE_BIT_OFFSET);
++ } else if (pcm_value == FWCONF_PCM_MASTER) {
++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] &=
++ (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET));
++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] &=
++ (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET));
++ }
++ }
++ }
++
++ for(i =0;(i<nvm_ptr->tag_len && (i*3 + 2) < PRINT_BUF_SIZE);i++)
++ snprintf((char *) data_buf, PRINT_BUF_SIZE, "%s%.02x ",
++ (char *)data_buf, *(nvm_byte_ptr + i));
++
++ PR_DBG("TAG Data\t\t\t : %s\n", data_buf);
++
++ /* Clear buffer */
++ memset(data_buf, 0x0, PRINT_BUF_SIZE);
++
++ /* increased by tag_len */
++ nvm_index+=nvm_ptr->tag_len;
++ nvm_byte_ptr +=nvm_ptr->tag_len;
++ }
++
++ PR_INFO("====================================================\n");
++
++ } else {
++ fprintf(stderr, "TLV Header type is unknown (%d) \n", ptlv_header->tlv_type);
++ }
++
++ return readSize;
++}
++
++int rome_tlv_dnld_segment(int fd, int index, int seg_size, unsigned char wait_cc_evt)
++{
++ int size=0, err = -1;
++ unsigned char cmd[HCI_MAX_CMD_SIZE];
++ unsigned char rsp[HCI_MAX_EVENT_SIZE];
++
++ /* Frame the HCI CMD PKT to be sent to Controller*/
++ frame_hci_cmd_pkt(cmd, EDL_PATCH_TLV_REQ_CMD, 0, index, seg_size);
++
++ /* Total length of the packet to be sent to the Controller */
++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]);
++
++ /* Initialize the RSP packet everytime to 0 */
++ memset(rsp, 0x0, HCI_MAX_EVENT_SIZE);
++
++ /* Send HCI Command packet to Controller */
++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size);
++ if (err != size) {
++ fprintf(stderr, "Failed to send the patch payload to the Controller! 0x%x\n", err);
++ return err;
++ }
++
++ if (wait_cc_evt) {
++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE);
++ if (err < 0) {
++ fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n", __FUNCTION__, index);
++ return err;
++ }
++ }
++
++ return err;
++}
++
++int rome_tlv_dnld_req(int fd, int tlv_size)
++{
++ int total_segment, remain_size, i, err = -1;
++ unsigned char wait_cc_evt = FALSE;
++ unsigned int rom = rome_ver >> 16;
++
++ total_segment = tlv_size/MAX_SIZE_PER_TLV_SEGMENT;
++ remain_size = (tlv_size < MAX_SIZE_PER_TLV_SEGMENT)?\
++ tlv_size: (tlv_size%MAX_SIZE_PER_TLV_SEGMENT);
++
++ if (gTlv_type == TLV_TYPE_PATCH) {
++ /* Prior to Rome version 3.2(including inital few rampatch release of
++ * Rome 3.2), the event handling mechanism is ROME_SKIP_EVT_NONE. After
++ * few release of rampatch for Rome 3.2, the mechamism is changed to
++ * ROME_SKIP_EVT_VSE_CC. Rest of the mechanism is not used for now
++ */
++ switch (gtlv_dwndcfg)
++ {
++ case ROME_SKIP_EVT_NONE:
++ wait_vsc_evt = TRUE;
++ wait_cc_evt = TRUE;
++ PR_DBG("%s: Event handling type: ROME_SKIP_EVT_NONE", __func__);
++ break;
++ case ROME_SKIP_EVT_VSE_CC:
++ wait_vsc_evt = FALSE;
++ wait_cc_evt = FALSE;
++ PR_DBG("%s: Event handling type: ROME_SKIP_EVT_VSE_CC", __func__);
++ break;
++ /* Not handled for now */
++ case ROME_SKIP_EVT_VSE:
++ case ROME_SKIP_EVT_CC:
++ default:
++ fprintf(stderr, "%s: Unsupported Event handling: %d", __func__, gtlv_dwndcfg);
++ break;
++ }
++ } else {
++ wait_vsc_evt = TRUE;
++ wait_cc_evt = TRUE;
++ }
++
++ for(i = 0; i < total_segment; i++) {
++ if ((i+1) == total_segment) {
++ if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) &&
++ (gTlv_type == TLV_TYPE_PATCH)) {
++ /* If the Rome version is from 1.1 to 3.1
++ * 1. No CCE for the last command segment but all other segment
++ * 2. All the command segments get VSE including the last one
++ */
++ wait_cc_evt = !remain_size ? FALSE: TRUE;
++ } else if ((rom == ROME_PATCH_VER_0302) &&
++ (gTlv_type == TLV_TYPE_PATCH)) {
++ /* If the Rome version is 3.2
++ * 1. None of the command segments receive CCE
++ * 2. No command segments receive VSE except the last one
++ * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is
++ * same as Rome 2.1, 2.2, 3.0
++ */
++ if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) {
++ wait_cc_evt = !remain_size ? FALSE: TRUE;
++ } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) {
++ wait_vsc_evt = !remain_size ? TRUE: FALSE;
++ }
++ }
++ }
++
++ if ((err = rome_tlv_dnld_segment(fd, i, MAX_SIZE_PER_TLV_SEGMENT, wait_cc_evt )) < 0)
++ goto error;
++ }
++
++ if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) &&
++ (gTlv_type == TLV_TYPE_PATCH)) {
++ /* If the Rome version is from 1.1 to 3.1
++ * 1. No CCE for the last command segment but all other segment
++ * 2. All the command segments get VSE including the last one
++ */
++ wait_cc_evt = remain_size ? FALSE: TRUE;
++ } else if ((rom == ROME_PATCH_VER_0302) && (gTlv_type == TLV_TYPE_PATCH)) {
++ /* If the Rome version is 3.2
++ * 1. None of the command segments receive CCE
++ * 2. No command segments receive VSE except the last one
++ * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is
++ * same as Rome 2.1, 2.2, 3.0
++ */
++ if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) {
++ wait_cc_evt = remain_size ? FALSE: TRUE;
++ } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) {
++ wait_vsc_evt = remain_size ? TRUE: FALSE;
++ }
++ }
++
++ if (remain_size) err =rome_tlv_dnld_segment(fd, i, remain_size, wait_cc_evt);
++
++error:
++ return err;
++}
++
++int rome_download_tlv_file(int fd, unsigned char baud_rate)
++{
++ int tlv_size, err = -1;
++
++ /* Rampatch TLV file Downloading */
++ pdata_buffer = NULL;
++
++ if ((tlv_size = rome_get_tlv_file(rampatch_file_path, baud_rate)) < 0)
++ goto error;
++
++ if ((err = rome_tlv_dnld_req(fd, tlv_size)) < 0)
++ goto error;
++
++ if (pdata_buffer != NULL) {
++ free (pdata_buffer);
++ pdata_buffer = NULL;
++ }
++
++ /* NVM TLV file Downloading */
++ if ((tlv_size = rome_get_tlv_file(nvm_file_path, baud_rate)) < 0)
++ goto error;
++
++ if ((err = rome_tlv_dnld_req(fd, tlv_size)) < 0)
++ goto error;
++
++error:
++ if (pdata_buffer != NULL)
++ free (pdata_buffer);
++
++ return err;
++}
++
++int rome_1_0_nvm_tag_dnld(int fd)
++{
++ int i, size, err = 0;
++ unsigned char rsp[HCI_MAX_EVENT_SIZE];
++
++#if (NVM_VERSION >= ROME_1_0_100019)
++ unsigned char cmds[MAX_TAG_CMD][HCI_MAX_CMD_SIZE] =
++ {
++ /* Tag 2 */ /* BD Address */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 9,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 2,
++ /* Tag Len */ 6,
++ /* Tag Value */ 0x77,0x78,0x23,0x01,0x56,0x22
++ },
++ /* Tag 6 */ /* Bluetooth Support Features */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 11,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 6,
++ /* Tag Len */ 8,
++ /* Tag Value */ 0xFF,0xFE,0x8B,0xFE,0xD8,0x3F,0x5B,0x8B
++ },
++ /* Tag 17 */ /* HCI Transport Layer Setting */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 11,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 17,
++ /* Tag Len */ 8,
++ /* Tag Value */ 0x82,0x01,0x0E,0x08,0x04,0x32,0x0A,0x00
++ },
++ /* Tag 35 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 58,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 35,
++ /* Tag Len */ 55,
++ /* Tag Value */ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x58, 0x59,
++ 0x0E, 0x0E, 0x16, 0x16, 0x16, 0x1E, 0x26, 0x5F, 0x2F, 0x5F,
++ 0x0E, 0x0E, 0x16, 0x16, 0x16, 0x1E, 0x26, 0x5F, 0x2F, 0x5F,
++ 0x0C, 0x18, 0x14, 0x24, 0x40, 0x4C, 0x70, 0x80, 0x80, 0x80,
++ 0x0C, 0x18, 0x14, 0x24, 0x40, 0x4C, 0x70, 0x80, 0x80, 0x80,
++ 0x1B, 0x14, 0x01, 0x04, 0x48
++ },
++ /* Tag 36 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 15,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 36,
++ /* Tag Len */ 12,
++ /* Tag Value */ 0x0F,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x00
++ },
++ /* Tag 39 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 7,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 39,
++ /* Tag Len */ 4,
++ /* Tag Value */ 0x12,0x00,0x00,0x00
++ },
++ /* Tag 41 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 91,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 41,
++ /* Tag Len */ 88,
++ /* Tag Value */ 0x15, 0x00, 0x00, 0x00, 0xF6, 0x02, 0x00, 0x00, 0x76, 0x00,
++ 0x1E, 0x00, 0x29, 0x02, 0x1F, 0x00, 0x61, 0x00, 0x1A, 0x00,
++ 0x76, 0x00, 0x1E, 0x00, 0x7D, 0x00, 0x40, 0x00, 0x91, 0x00,
++ 0x06, 0x00, 0x92, 0x00, 0x03, 0x00, 0xA6, 0x01, 0x50, 0x00,
++ 0xAA, 0x01, 0x15, 0x00, 0xAB, 0x01, 0x0A, 0x00, 0xAC, 0x01,
++ 0x00, 0x00, 0xB0, 0x01, 0xC5, 0x00, 0xB3, 0x01, 0x03, 0x00,
++ 0xB4, 0x01, 0x13, 0x00, 0xB5, 0x01, 0x0C, 0x00, 0xC5, 0x01,
++ 0x0D, 0x00, 0xC6, 0x01, 0x10, 0x00, 0xCA, 0x01, 0x2B, 0x00,
++ 0xCB, 0x01, 0x5F, 0x00, 0xCC, 0x01, 0x48, 0x00
++ },
++ /* Tag 42 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 63,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 42,
++ /* Tag Len */ 60,
++ /* Tag Value */ 0xD7, 0xC0, 0x00, 0x00, 0x8F, 0x5C, 0x02, 0x00, 0x80, 0x47,
++ 0x60, 0x0C, 0x70, 0x4C, 0x00, 0x00, 0x00, 0x01, 0x1F, 0x01,
++ 0x42, 0x01, 0x69, 0x01, 0x95, 0x01, 0xC7, 0x01, 0xFE, 0x01,
++ 0x3D, 0x02, 0x83, 0x02, 0xD1, 0x02, 0x29, 0x03, 0x00, 0x0A,
++ 0x10, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0xFD, 0x00,
++ 0xF9, 0x01, 0xF1, 0x03, 0xDE, 0x07, 0x00, 0x00, 0x9A, 0x01
++ },
++ /* Tag 84 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 153,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 84,
++ /* Tag Len */ 150,
++ /* Tag Value */ 0x7C, 0x6A, 0x59, 0x47, 0x19, 0x36, 0x35, 0x25, 0x25, 0x28,
++ 0x2C, 0x2B, 0x2B, 0x28, 0x2C, 0x28, 0x29, 0x28, 0x29, 0x28,
++ 0x29, 0x29, 0x2C, 0x29, 0x2C, 0x29, 0x2C, 0x28, 0x29, 0x28,
++ 0x29, 0x28, 0x29, 0x2A, 0x00, 0x00, 0x2C, 0x2A, 0x2C, 0x18,
++ 0x98, 0x98, 0x98, 0x98, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
++ 0x1E, 0x13, 0x1E, 0x1E, 0x1E, 0x1E, 0x13, 0x13, 0x11, 0x13,
++ 0x1E, 0x1E, 0x13, 0x12, 0x12, 0x12, 0x11, 0x12, 0x1F, 0x12,
++ 0x12, 0x12, 0x10, 0x0C, 0x18, 0x0D, 0x01, 0x01, 0x01, 0x01,
++ 0x01, 0x01, 0x01, 0x0C, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x0D,
++ 0x0E, 0x0D, 0x01, 0x01, 0x0D, 0x0D, 0x0D, 0x0D, 0x0F, 0x0D,
++ 0x10, 0x0D, 0x0D, 0x0D, 0x0D, 0x10, 0x05, 0x10, 0x03, 0x00,
++ 0x7E, 0x7B, 0x7B, 0x72, 0x71, 0x50, 0x50, 0x50, 0x00, 0x40,
++ 0x60, 0x60, 0x30, 0x08, 0x02, 0x0F, 0x00, 0x01, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x16, 0x16, 0x08, 0x08, 0x00,
++ 0x00, 0x00, 0x1E, 0x34, 0x2B, 0x1B, 0x23, 0x2B, 0x15, 0x0D
++ },
++ /* Tag 85 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 119,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 85,
++ /* Tag Len */ 116,
++ /* Tag Value */ 0x03, 0x00, 0x38, 0x00, 0x45, 0x77, 0x00, 0xE8, 0x00, 0x59,
++ 0x01, 0xCA, 0x01, 0x3B, 0x02, 0xAC, 0x02, 0x1D, 0x03, 0x8E,
++ 0x03, 0x00, 0x89, 0x01, 0x0E, 0x02, 0x5C, 0x02, 0xD7, 0x02,
++ 0xF8, 0x08, 0x01, 0x00, 0x1F, 0x00, 0x0A, 0x02, 0x55, 0x02,
++ 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD7, 0x00, 0x00,
++ 0x00, 0x1E, 0xDE, 0x00, 0x00, 0x00, 0x14, 0x0F, 0x0A, 0x0F,
++ 0x0A, 0x0C, 0x0C, 0x0C, 0x0C, 0x04, 0x04, 0x04, 0x0C, 0x0C,
++ 0x0C, 0x0C, 0x06, 0x06, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02,
++ 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00,
++ 0x06, 0x0F, 0x14, 0x05, 0x47, 0xCF, 0x77, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0xAC, 0x7C, 0xFF, 0x40, 0x00, 0x00, 0x00,
++ 0x12, 0x04, 0x04, 0x01, 0x04, 0x03
++ },
++ {TAG_END}
++ };
++#elif (NVM_VERSION == ROME_1_0_6002)
++ unsigned char cmds[MAX_TAG_CMD][HCI_MAX_CMD_SIZE] =
++ {
++ /* Tag 2 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 9,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 2,
++ /* Tag Len */ 6,
++ /* Tag Value */ 0x77,0x78,0x23,0x01,0x56,0x22 /* BD Address */
++ },
++ /* Tag 6 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 11,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 6,
++ /* Tag Len */ 8,
++ /* Tag Value */ 0xFF,0xFE,0x8B,0xFE,0xD8,0x3F,0x5B,0x8B
++ },
++ /* Tag 17 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 11,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 17,
++ /* Tag Len */ 8,
++ /* Tag Value */ 0x82,0x01,0x0E,0x08,0x04,0x32,0x0A,0x00
++ },
++ /* Tag 36 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 15,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 36,
++ /* Tag Len */ 12,
++ /* Tag Value */ 0x0F,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x00
++ },
++
++ /* Tag 39 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 7,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 39,
++ /* Tag Len */ 4,
++ /* Tag Value */ 0x12,0x00,0x00,0x00
++ },
++
++ /* Tag 41 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 199,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 41,
++ /* Tag Len */ 196,
++ /* Tag Value */ 0x30,0x00,0x00,0x00,0xD5,0x00,0x0E,0x00,0xD6,0x00,0x0E,0x00,
++ 0xD7,0x00,0x16,0x00,0xD8,0x00,0x16,0x00,0xD9,0x00,0x16,0x00,
++ 0xDA,0x00,0x1E,0x00,0xDB,0x00,0x26,0x00,0xDC,0x00,0x5F,0x00,
++ 0xDD,0x00,0x2F,0x00,0xDE,0x00,0x5F,0x00,0xE0,0x00,0x0E,0x00,
++ 0xE1,0x00,0x0E,0x00,0xE2,0x00,0x16,0x00,0xE3,0x00,0x16,0x00,
++ 0xE4,0x00,0x16,0x00,0xE5,0x00,0x1E,0x00,0xE6,0x00,0x26,0x00,
++ 0xE7,0x00,0x5F,0x00,0xE8,0x00,0x2F,0x00,0xE9,0x00,0x5F,0x00,
++ 0xEC,0x00,0x0C,0x00,0xED,0x00,0x08,0x00,0xEE,0x00,0x14,0x00,
++ 0xEF,0x00,0x24,0x00,0xF0,0x00,0x40,0x00,0xF1,0x00,0x4C,0x00,
++ 0xF2,0x00,0x70,0x00,0xF3,0x00,0x80,0x00,0xF4,0x00,0x80,0x00,
++ 0xF5,0x00,0x80,0x00,0xF8,0x00,0x0C,0x00,0xF9,0x00,0x18,0x00,
++ 0xFA,0x00,0x14,0x00,0xFB,0x00,0x24,0x00,0xFC,0x00,0x40,0x00,
++ 0xFD,0x00,0x4C,0x00,0xFE,0x00,0x70,0x00,0xFF,0x00,0x80,0x00,
++ 0x00,0x01,0x80,0x00,0x01,0x01,0x80,0x00,0x04,0x01,0x1B,0x00,
++ 0x05,0x01,0x14,0x00,0x06,0x01,0x01,0x00,0x07,0x01,0x04,0x00,
++ 0x08,0x01,0x00,0x00,0x09,0x01,0x00,0x00,0x0A,0x01,0x03,0x00,
++ 0x0B,0x01,0x03,0x00
++ },
++
++ /* Tag 44 */
++ { /* Packet Type */HCI_COMMAND_PKT,
++ /* Opcode */ 0x0b,0xfc,
++ /* Total Len */ 44,
++ /* NVM CMD */ NVM_ACCESS_SET,
++ /* Tag Num */ 44,
++ /* Tag Len */ 41,
++ /* Tag Value */ 0x6F,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0xFF,0x10,0x02,0x02,
++ 0x01,0x00,0x14,0x01,0x06,0x28,0xA0,0x62,0x03,0x64,0x01,0x01,
++ 0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xFF,0x10,0x02,0x01,
++ 0x00,0x14,0x01,0x02,0x03
++ },
++ {TAG_END}
++ };
++#endif
++
++ for (i=0; (i < MAX_TAG_CMD) && (cmds[i][0] != TAG_END); i++) {
++ /* Write BD Address */
++ if (cmds[i][TAG_NUM_OFFSET] == TAG_NUM_2){
++ memcpy(&cmds[i][TAG_BDADDR_OFFSET], vnd_local_bd_addr, 6);
++ fprintf(stderr, "BD Address: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
++ cmds[i][TAG_BDADDR_OFFSET ], cmds[i][TAG_BDADDR_OFFSET + 1],
++ cmds[i][TAG_BDADDR_OFFSET + 2], cmds[i][TAG_BDADDR_OFFSET + 3],
++ cmds[i][TAG_BDADDR_OFFSET + 4], cmds[i][TAG_BDADDR_OFFSET + 5]);
++ }
++ size = cmds[i][3] + HCI_COMMAND_HDR_SIZE + 1;
++ /* Send HCI Command packet to Controller */
++ err = hci_send_vs_cmd(fd, (unsigned char *)&cmds[i][0], rsp, size);
++ if (err != size) {
++ fprintf(stderr, "Failed to attach the patch payload to the Controller!\n");
++ goto error;
++ }
++
++ /* Read Command Complete Event - This is extra routine for ROME 1.0. From ROM 2.0, it should be removed. */
++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE);
++ if (err < 0) {
++ fprintf(stderr, "%s: Failed to get patch version(s)\n", __FUNCTION__);
++ goto error;
++ }
++ }
++
++error:
++ return err;
++}
++
++
++
++int rome_patch_ver_req(int fd)
++{
++ int size, err = 0;
++ unsigned char cmd[HCI_MAX_CMD_SIZE];
++ unsigned char rsp[HCI_MAX_EVENT_SIZE];
++
++ /* Frame the HCI CMD to be sent to the Controller */
++ frame_hci_cmd_pkt(cmd, EDL_PATCH_VER_REQ_CMD, 0,
++ -1, EDL_PATCH_CMD_LEN);
++
++ /* Total length of the packet to be sent to the Controller */
++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN);
++
++ /* Send HCI Command packet to Controller */
++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size);
++ if (err != size) {
++ fprintf(stderr, "Failed to attach the patch payload to the Controller!\n");
++ goto error;
++ }
++
++ /* Read Command Complete Event - This is extra routine for ROME 1.0. From ROM 2.0, it should be removed. */
++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE);
++ if (err < 0) {
++ fprintf(stderr, "%s: Failed to get patch version(s)\n", __FUNCTION__);
++ goto error;
++ }
++error:
++ return err;
++
++}
++
++static void flow_control(int fd, int opt)
++{
++ struct termios c_opt;
++
++ ioctl(fd, TIOCMGET, &c_opt);
++ c_opt.c_cc[VTIME] = 0; /* inter-character timer unused */
++ c_opt.c_cc[VMIN] = 0; /* blocking read until 8 chars received */
++ c_opt.c_cflag &= ~CSIZE;
++ c_opt.c_cflag |= (CS8 | CLOCAL | CREAD);
++ if (opt == MSM_ENABLE_FLOW_CTRL)
++ c_opt.c_cflag |= CRTSCTS;
++ else if (opt == MSM_DISABLE_FLOW_CTRL)
++ c_opt.c_cflag &= ~CRTSCTS;
++ else {
++ fprintf(stderr, "%s: Incorrect option passed for TIOCMSET\n", __func__);
++ return;
++ }
++ c_opt.c_iflag = IGNPAR;
++ c_opt.c_oflag = 0;
++ c_opt.c_lflag = 0;
++ ioctl(fd, TIOCMSET, &c_opt);
++}
++
++
++int rome_set_baudrate_req(int fd, unsigned char baud_rate)
++{
++ int size, err = 0;
++ unsigned char cmd[HCI_MAX_CMD_SIZE];
++ unsigned char rsp[HCI_MAX_EVENT_SIZE];
++ hci_command_hdr *cmd_hdr;
++ int flags;
++
++ memset(cmd, 0x0, HCI_MAX_CMD_SIZE);
++
++ cmd_hdr = (void *) (cmd + 1);
++ cmd[0] = HCI_COMMAND_PKT;
++ cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, EDL_SET_BAUDRATE_CMD_OCF);
++ cmd_hdr->plen = VSC_SET_BAUDRATE_REQ_LEN;
++ cmd[4] = baud_rate;
++
++ /* Total length of the packet to be sent to the Controller */
++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_SET_BAUDRATE_REQ_LEN);
++
++ /* Flow off during baudrate change */
++ flow_control(fd, MSM_DISABLE_FLOW_CTRL);
++
++ /* Send the HCI command packet to UART for transmission */
++ err = write(fd, cmd, size);
++ if (err != size) {
++ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err);
++ goto error;
++ }
++ /* Change Local UART baudrate to high speed UART */
++ userial_vendor_set_baud(baud_rate);
++
++ /* Flow on after changing local uart baudrate */
++ flow_control(fd, MSM_ENABLE_FLOW_CTRL);
++
++ /* Check for response from the Controller */
++ if ((err = read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) {
++ fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__);
++ goto error;
++ }
++
++ /* Wait for command complete event */
++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE);
++ if (err < 0) {
++ fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__);
++ goto error;
++ }
++error:
++ return err;
++
++}
++
++
++int rome_hci_reset_req(int fd, char baud)
++{
++ int size, err = 0;
++ unsigned char cmd[HCI_MAX_CMD_SIZE];
++ unsigned char rsp[HCI_MAX_EVENT_SIZE];
++ hci_command_hdr *cmd_hdr;
++ int flags;
++
++ memset(cmd, 0x0, HCI_MAX_CMD_SIZE);
++
++ cmd_hdr = (void *) (cmd + 1);
++ cmd[0] = HCI_COMMAND_PKT;
++ cmd_hdr->opcode = HCI_RESET;
++ cmd_hdr->plen = 0;
++
++ /* Total length of the packet to be sent to the Controller */
++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE);
++
++ /* Flow off during baudrate change */
++ flow_control(fd, MSM_DISABLE_FLOW_CTRL);
++
++ /* Send the HCI command packet to UART for transmission */
++ err = write(fd, cmd, size);
++ if (err != size) {
++ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err);
++ goto error;
++ }
++
++ /* Change Local UART baudrate to high speed UART */
++ userial_vendor_set_baud(baud);
++
++ /* Flow on after changing local uart baudrate */
++ flow_control(fd, MSM_ENABLE_FLOW_CTRL);
++
++ /* Wait for command complete event */
++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE);
++ if (err < 0) {
++ fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__);
++ goto error;
++ }
++
++error:
++ return err;
++
++}
++
++int qca_soc_init(int fd, int speed, char *bdaddr)
++{
++ int err = -1;
++ int ret = 0;
++ int size;
++ unsigned char baud_rate = 0;
++
++ vnd_userial.fd = fd;
++
++ /* Get Rome version information */
++ if ((err = rome_patch_ver_req(fd)) < 0) {
++ fprintf(stderr, "%s: Fail to get Rome Version (0x%x)\n", __FUNCTION__, err);
++ ret = -1;
++ goto error;
++ }
++
++ fprintf(stderr, "%s: Rome Version (0x%08x)\n", __FUNCTION__, rome_ver);
++
++ switch (rome_ver){
++ case ROME_VER_1_0:
++ /* Set and Download the RAMPATCH */
++ fprintf(stderr, "%s: Setting Patch Header & Downloading Patches\n", __FUNCTION__);
++ err = rome_download_rampatch(fd);
++ if (err < 0) {
++ fprintf(stderr, "%s: DOWNLOAD RAMPATCH failed!\n", __FUNCTION__);
++ ret = -1;
++ goto error;
++ }
++
++ /* Attach the RAMPATCH */
++ fprintf(stderr, "%s: Attaching the patches\n", __FUNCTION__);
++ err = rome_attach_rampatch(fd);
++ if (err < 0) {
++ fprintf(stderr, "%s: ATTACH RAMPATCH failed!\n", __FUNCTION__);
++ ret = -1;
++ goto error;
++ }
++
++ /* Send Reset */
++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN);
++ err = rome_rampatch_reset(fd);
++ if (err < 0) {
++ fprintf(stderr, "Failed to RESET after RAMPATCH upgrade!\n");
++ ret = -1;
++ goto error;
++ }
++
++ /* NVM download */
++ fprintf(stderr, "%s: Downloading NVM\n", __FUNCTION__);
++ err = rome_1_0_nvm_tag_dnld(fd);
++ if (err < 0) {
++ fprintf(stderr, "Downloading NVM Failed !!\n");
++ ret = -1;
++ goto error;
++ }
++
++ /* Change baud rate 115.2 kbps to 3Mbps*/
++ err = rome_hci_reset_req(fd, baud_rate);
++ if (err < 0) {
++ fprintf(stderr, "HCI Reset Failed !!\n");
++ ret = -1;
++ goto error;
++ }
++ break;
++ case ROME_VER_1_1:
++ rampatch_file_path = ROME_RAMPATCH_TLV_PATH;
++ nvm_file_path = ROME_NVM_TLV_PATH;
++ goto download;
++ case ROME_VER_1_3:
++ rampatch_file_path = ROME_RAMPATCH_TLV_1_0_3_PATH;
++ nvm_file_path = ROME_NVM_TLV_1_0_3_PATH;
++ goto download;
++ case ROME_VER_2_1:
++ rampatch_file_path = ROME_RAMPATCH_TLV_2_0_1_PATH;
++ nvm_file_path = ROME_NVM_TLV_2_0_1_PATH;
++ goto download;
++ case ROME_VER_3_0:
++ rampatch_file_path = ROME_RAMPATCH_TLV_3_0_0_PATH;
++ nvm_file_path = ROME_NVM_TLV_3_0_0_PATH;
++ goto download;
++ case ROME_VER_3_2:
++ rampatch_file_path = ROME_RAMPATCH_TLV_3_0_2_PATH;
++ nvm_file_path = ROME_NVM_TLV_3_0_2_PATH;
++ goto download;
++ case TUFELLO_VER_1_0:
++ rampatch_file_path = TF_RAMPATCH_TLV_1_0_0_PATH;
++ nvm_file_path = TF_NVM_TLV_1_0_0_PATH;
++ goto download;
++ case TUFELLO_VER_1_1:
++ rampatch_file_path = TF_RAMPATCH_TLV_1_0_1_PATH;
++ nvm_file_path = TF_NVM_TLV_1_0_1_PATH;
++download:
++ isSpeedValid(speed, &baud_rate);
++ if (baud_rate < 0) {
++ ret = -1;
++ goto error;
++ }
++
++ /* Donwload TLV files (rampatch, NVM) */
++ err = rome_download_tlv_file(fd, baud_rate);
++ if (err < 0) {
++ fprintf(stderr, "%s: Download TLV file failed!\n", __FUNCTION__);
++ ret = -1;
++ goto error;
++ }
++
++ /*
++ * Overriding the baud rate value in NVM file with the user
++ * requested baud rate, since default baud rate in NVM file is 3M.
++ */
++ err = rome_set_baudrate_req(fd, baud_rate);
++ if (err < 0) {
++ fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__);
++ ret = -1;
++ goto error;
++ }
++
++ /* Perform HCI reset here*/
++ err = rome_hci_reset_req(fd, baud_rate);
++ if (err < 0) {
++ fprintf(stderr, "HCI Reset Failed !!!\n");
++ ret = -1;
++ goto error;
++ }
++
++ break;
++ case ROME_VER_UNKNOWN:
++ default:
++ fprintf(stderr, "%s: Detected unknown ROME version\n", __FUNCTION__);
++ ret = -1;
++ break;
++ }
++
++error:
++ return ret;
++}
+diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h
+new file mode 100644
+index 000000000..597743e0b
+--- /dev/null
++++ b/tools/hciattach_rome.h
+@@ -0,0 +1,388 @@
++/*
++ * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
++ * Not a Contribution.
++ * Copyright 2012 The Android Open Source Project
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#ifndef HW_ROME_H
++#define HW_ROME_H
++
++/******************************************************************************
++** Constants & Macros
++******************************************************************************/
++#define HCI_MAX_CMD_SIZE 260
++#define HCI_MAX_EVENT_SIZE 260
++#define PRINT_BUF_SIZE ((HCI_MAX_CMD_SIZE * 3) + 2)
++/* HCI Command/Event Opcode */
++#define HCI_RESET 0x0C03
++#define EVT_CMD_COMPLETE 0x0E
++/* HCI Packet types */
++#define HCI_COMMAND_PKT 0x01
++#define HCI_ACLDATA_PKT 0x02
++#define HCI_SCODATA_PKT 0x03
++#define HCI_EVENT_PKT 0x04
++#define HCI_VENDOR_PKT 0xff
++#define cmd_opcode_pack(ogf, ocf) (unsigned short)((ocf & 0x03ff)|(ogf << 10))
++
++#define NVITEM 0
++#define RDWR_PROT 1
++#define NVITEM_SIZE 2
++#define PERSIST_HEADER_LEN 3
++#define BD_ADDR_LEN 6
++#define MSM_DISABLE_FLOW_CTRL 0
++#define MSM_ENABLE_FLOW_CTRL 1
++
++#ifdef _PLATFORM_MDM_
++#define USERIAL_OP_CLK_ON 0x5441
++#define USERIAL_OP_CLK_OFF 0x5442
++#endif
++
++#define PR_INFO(fmt, arg...) printf(fmt, ## arg)
++#ifdef DEBUG
++ #define PR_DBG(fmt, arg...) printf(fmt, ## arg)
++#else
++ #define PR_DBG(fmt, arg...)
++#endif
++
++unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
++typedef enum {
++ USERIAL_OP_FLOW_ON,
++ USERIAL_OP_FLOW_OFF,
++ USERIAL_OP_NOP,
++} userial_vendor_ioctl_op_t;
++
++
++/* vendor serial control block */
++typedef struct
++{
++ int fd; /* fd to Bluetooth device */
++ struct termios termios; /* serial terminal of BT port */
++ char port_name[256];
++} vnd_userial_cb_t;
++
++/**** baud rates ****/
++#define USERIAL_BAUD_300 0
++#define USERIAL_BAUD_600 1
++#define USERIAL_BAUD_1200 2
++#define USERIAL_BAUD_2400 3
++#define USERIAL_BAUD_9600 4
++#define USERIAL_BAUD_19200 5
++#define USERIAL_BAUD_57600 6
++#define USERIAL_BAUD_115200 7
++#define USERIAL_BAUD_230400 8
++#define USERIAL_BAUD_460800 9
++#define USERIAL_BAUD_921600 10
++#define USERIAL_BAUD_1M 11
++#define USERIAL_BAUD_1_5M 12
++#define USERIAL_BAUD_2M 13
++#define USERIAL_BAUD_3M 14
++#define USERIAL_BAUD_4M 15
++#define USERIAL_BAUD_AUTO 16
++
++#ifndef FALSE
++#define FALSE 0
++#endif
++
++#ifndef TRUE
++#define TRUE (!FALSE)
++#endif
++
++#define HCI_CHG_BAUD_CMD_OCF 0x0C
++#define HCI_VENDOR_CMD_OGF 0x3F
++#define WRITE_BDADDR_CMD_LEN 14
++#define WRITE_BAUD_CMD_LEN 6
++#define MAX_CMD_LEN WRITE_BDADDR_CMD_LEN
++#define GET_VERSION_OCF 0x1E
++
++#define PS_HDR_LEN 4
++#define HCI_VENDOR_CMD_OGF 0x3F
++#define HCI_PS_CMD_OCF 0x0B
++
++#define HCI_COMMAND_HDR_SIZE 3
++#define EVT_CMD_COMPLETE_SIZE 3
++#define EVT_CMD_STATUS 0x0F
++#define EVT_CMD_STATUS_SIZE 4
++#define HCI_EVENT_HDR_SIZE 2
++#define HCI_EV_SUCCESS 0x00
++/* HCI Socket options */
++#define HCI_DATA_DIR 1
++#define HCI_FILTER 2
++#define HCI_TIME_STAMP 3
++
++#define P_ID_OFFSET (0)
++#define HCI_CMD_IND (1)
++#define EVENTCODE_OFFSET (1)
++#define EVT_PLEN (2)
++#define PLEN (3)
++#define CMD_RSP_OFFSET (3)
++#define RSP_TYPE_OFFSET (4)
++#define BAUDRATE_RSP_STATUS_OFFSET (4)
++#define CMD_STATUS_OFFSET (5)
++#define P_ROME_VER_OFFSET (4)
++#define P_BUILD_VER_OFFSET (6)
++#define P_BASE_ADDR_OFFSET (8)
++#define P_ENTRY_ADDR_OFFSET (12)
++#define P_LEN_OFFSET (16)
++#define P_CRC_OFFSET (20)
++#define P_CONTROL_OFFSET (24)
++#define PATCH_HDR_LEN (28)
++#define MAX_DATA_PER_SEGMENT (239)
++#define VSEVENT_CODE (0xFF)
++#define HC_VS_MAX_CMD_EVENT (0xFF)
++#define PATCH_PROD_ID_OFFSET (5)
++#define PATCH_PATCH_VER_OFFSET (9)
++#define PATCH_ROM_BUILD_VER_OFFSET (11)
++#define PATCH_SOC_VER_OFFSET (13)
++#define MAX_SIZE_PER_TLV_SEGMENT (243)
++
++/* VS Opcode */
++#define HCI_PATCH_CMD_OCF (0)
++#define EDL_SET_BAUDRATE_CMD_OCF (0x48)
++
++/* VS Commands */
++#define VSC_SET_BAUDRATE_REQ_LEN (1)
++#define EDL_PATCH_CMD_LEN (1)
++#define EDL_PATCH_CMD_REQ_LEN (1)
++#define EDL_PATCH_DLD_REQ_CMD (0x01)
++#define EDL_PATCH_RST_REQ_CMD (0x05)
++#define EDL_PATCH_SET_REQ_CMD (0x16)
++#define EDL_PATCH_ATCH_REQ_CMD (0x17)
++#define EDL_PATCH_VER_REQ_CMD (0x19)
++#define EDL_PATCH_TLV_REQ_CMD (0x1E)
++#define VSC_DISABLE_IBS_LEN (0x04)
++
++/* VS Event */
++#define EDL_CMD_REQ_RES_EVT (0x00)
++#define EDL_CMD_EXE_STATUS_EVT (0x00)
++#define EDL_SET_BAUDRATE_RSP_EVT (0x92)
++#define EDL_PATCH_VER_RES_EVT (0x19)
++#define EDL_TVL_DNLD_RES_EVT (0x04)
++#define EDL_APP_VER_RES_EVT (0x02)
++
++/* Status Codes of HCI CMD execution*/
++#define HCI_CMD_SUCCESS (0x0)
++#define PATCH_LEN_ERROR (0x1)
++#define PATCH_VER_ERROR (0x2)
++#define PATCH_CRC_ERROR (0x3)
++#define PATCH_NOT_FOUND (0x4)
++#define TLV_TYPE_ERROR (0x10)
++#define NVM_ACCESS_CODE (0x0B)
++#define BAUDRATE_CHANGE_SUCCESS (1)
++
++/* TLV_TYPE */
++#define TLV_TYPE_PATCH (1)
++#define TLV_TYPE_NVM (2)
++
++/* NVM */
++#define MAX_TAG_CMD 30
++#define TAG_END 0xFF
++#define NVM_ACCESS_SET 0x01
++#define TAG_NUM_OFFSET 5
++#define TAG_NUM_2 2
++#define TAG_NUM_17 (17)
++#define TAG_NUM_27 27
++#define TAG_NUM_44 44
++#define TAG_BDADDR_OFFSET 7
++
++/* FW PCM Configuration */
++#define FWCONF_PCM_MS_OFFSET_1 9
++#define FWCONF_PCM_MS_OFFSET_2 33
++#define FWCONF_PCM_SLAVE 1
++#define FWCONF_PCM_MASTER 0
++#define FWCONF_PCM_ROLE_BIT_OFFSET 4
++
++/* FW HCI Transport Layer Configuration */
++#define FWCONF_IBS_DISABLE (0)
++#define FWCONF_IBS_ENABLE (1)
++#define FWCONF_IBS_VAL_BIT (7)
++#define FWCONF_IBS_VAL_OFFSET (0)
++#define FWCONF_BAUD_VAL_OFFSET (2)
++
++/* FW DEEP SLEEP Configuration */
++#define FWCONF_DEEP_SLEEP_DISABLE 0
++#define FWCONF_DEEP_SLEEP_ENABLE 1
++#define FWCONF_DEEP_SLEEP_BYTE_OFFSET 0
++#define FWCONF_DEEP_SLEEP_BIT_OFFSET 0
++
++#define MAX_RETRY_CNT 1
++#define SELECT_TIMEOUT 3
++
++/* NVM Tags specifically used for ROME 1.0 */
++#define ROME_1_0_100022_1 0x101000221
++#define ROME_1_0_100019 0x101000190
++#define ROME_1_0_6002 0x100600200
++
++/* Default NVM Version setting for ROME 1.0 */
++#define NVM_VERSION ROME_1_0_100022_1
++
++
++#define LSH(val, n) ((unsigned int)(val) << (n))
++#define EXTRACT_BYTE(val, pos) (char) (((val) >> (8 * (pos))) & 0xFF)
++#define CALC_SEG_SIZE(len, max) ((plen) % (max))?((plen/max)+1) : ((plen) / (max))
++
++#define ROME_FW_PATH "/lib/firmware/rampatch.img"
++#define ROME_RAMPATCH_TLV_PATH "/lib/firmware/rampatch_tlv.img"
++#define ROME_NVM_TLV_PATH "/lib/firmware/nvm_tlv.bin"
++#define ROME_RAMPATCH_TLV_1_0_3_PATH "/lib/firmware/rampatch_tlv_1.3.tlv"
++#define ROME_NVM_TLV_1_0_3_PATH "/lib/firmware/nvm_tlv_1.3.bin"
++#define ROME_RAMPATCH_TLV_2_0_1_PATH "/lib/firmware/rampatch_tlv_2.1.tlv"
++#define ROME_NVM_TLV_2_0_1_PATH "/lib/firmware/nvm_tlv_2.1.bin"
++#define ROME_RAMPATCH_TLV_3_0_0_PATH "/lib/firmware/rampatch_tlv_3.0.tlv"
++#define ROME_NVM_TLV_3_0_0_PATH "/lib/firmware/nvm_tlv_3.0.bin"
++#define ROME_RAMPATCH_TLV_3_0_2_PATH "/lib/firmware/btfw32.tlv"
++#define ROME_NVM_TLV_3_0_2_PATH "/lib/firmware/btnv32.bin"
++#ifdef _PLATFORM_MDM_
++#define TF_RAMPATCH_TLV_1_0_0_PATH "/lib/firmware/rampatch_tlv_tf_1.0.tlv"
++#define TF_NVM_TLV_1_0_0_PATH "/lib/firmware/nvm_tlv_tf_1.0.bin"
++#define TF_RAMPATCH_TLV_1_0_1_PATH "/lib/firmware/tfbtfw11.tlv"
++#define TF_NVM_TLV_1_0_1_PATH "/lib/firmware/tfbtnv11.bin"
++#else
++#define TF_RAMPATCH_TLV_1_0_0_PATH "/lib/firmware/qca/rampatch_tlv_tf_1.0.tlv"
++#define TF_NVM_TLV_1_0_0_PATH "/lib/firmware/qca/nvm_tlv_tf_1.0.bin"
++#define TF_RAMPATCH_TLV_1_0_1_PATH "/lib/firmware/qca/tfbtfw11.tlv"
++#define TF_NVM_TLV_1_0_1_PATH "/lib/firmware/qca/tfbtnv11.bin"
++#endif
++
++/* This header value in rampatch file decides event handling mechanism in the HOST */
++#define ROME_SKIP_EVT_NONE 0x00
++#define ROME_SKIP_EVT_VSE 0x01
++#define ROME_SKIP_EVT_CC 0x02
++#define ROME_SKIP_EVT_VSE_CC 0x03
++
++#define FW_CONFIG_FILE_PATH "/etc/bluetooth/firmware.conf"
++/******************************************************************************
++** Local type definitions
++******************************************************************************/
++
++typedef struct {
++ unsigned char ncmd;
++ unsigned short opcode;
++} __attribute__ ((packed)) evt_cmd_complete;
++
++typedef struct {
++ unsigned char status;
++ unsigned char ncmd;
++ unsigned short opcode;
++} __attribute__ ((packed)) evt_cmd_status;
++
++typedef struct {
++ unsigned short opcode;
++ unsigned char plen;
++} __attribute__ ((packed)) hci_command_hdr;
++
++typedef struct {
++ unsigned char evt;
++ unsigned char plen;
++} __attribute__ ((packed)) hci_event_hdr;
++typedef struct {
++ unsigned short rom_version;
++ unsigned short build_version;
++} __attribute__ ((packed)) patch_version;
++
++typedef struct {
++ unsigned int patch_id;
++ patch_version patch_ver;
++ unsigned int patch_base_addr;
++ unsigned int patch_entry_addr;
++ unsigned short patch_length;
++ int patch_crc;
++ unsigned short patch_ctrl;
++} __attribute__ ((packed)) patch_info;
++
++typedef struct {
++ unsigned int tlv_data_len;
++ unsigned int tlv_patch_data_len;
++ unsigned char sign_ver;
++ unsigned char sign_algorithm;
++ unsigned char dwnd_cfg;
++ unsigned char reserved1;
++ unsigned short prod_id;
++ unsigned short build_ver;
++ unsigned short patch_ver;
++ unsigned short reserved2;
++ unsigned int patch_entry_addr;
++} __attribute__ ((packed)) tlv_patch_hdr;
++
++typedef struct {
++ unsigned short tag_id;
++ unsigned short tag_len;
++ unsigned int tag_ptr;
++ unsigned int tag_ex_flag;
++} __attribute__ ((packed)) tlv_nvm_hdr;
++
++typedef struct {
++ unsigned char tlv_type;
++ unsigned char tlv_length1;
++ unsigned char tlv_length2;
++ unsigned char tlv_length3;
++
++ union{
++ tlv_patch_hdr patch;
++ tlv_nvm_hdr nvm;
++ }tlv;
++} __attribute__ ((packed)) tlv_patch_info;
++
++enum{
++ BAUDRATE_115200 = 0x00,
++ BAUDRATE_57600 = 0x01,
++ BAUDRATE_38400 = 0x02,
++ BAUDRATE_19200 = 0x03,
++ BAUDRATE_9600 = 0x04,
++ BAUDRATE_230400 = 0x05,
++ BAUDRATE_250000 = 0x06,
++ BAUDRATE_460800 = 0x07,
++ BAUDRATE_500000 = 0x08,
++ BAUDRATE_720000 = 0x09,
++ BAUDRATE_921600 = 0x0A,
++ BAUDRATE_1000000 = 0x0B,
++ BAUDRATE_1250000 = 0x0C,
++ BAUDRATE_2000000 = 0x0D,
++ BAUDRATE_3000000 = 0x0E,
++ BAUDRATE_4000000 = 0x0F,
++ BAUDRATE_1600000 = 0x10,
++ BAUDRATE_3200000 = 0x11,
++ BAUDRATE_3500000 = 0x12,
++ BAUDRATE_AUTO = 0xFE,
++ BAUDRATE_Reserved = 0xFF
++};
++
++enum{
++ ROME_PATCH_VER_0100 = 0x0100,
++ ROME_PATCH_VER_0101 = 0x0101,
++ ROME_PATCH_VER_0200 = 0x0200,
++ ROME_PATCH_VER_0300 = 0x0300,
++ ROME_PATCH_VER_0302 = 0x0302
++ };
++
++enum{
++ ROME_SOC_ID_00 = 0x00000000,
++ ROME_SOC_ID_11 = 0x00000011,
++ ROME_SOC_ID_13 = 0x00000013,
++ ROME_SOC_ID_22 = 0x00000022,
++ ROME_SOC_ID_23 = 0x00000023,
++ ROME_SOC_ID_44 = 0x00000044
++};
++
++enum{
++ ROME_VER_UNKNOWN = 0,
++ ROME_VER_1_0 = ((ROME_PATCH_VER_0100 << 16 ) | ROME_SOC_ID_00 ),
++ ROME_VER_1_1 = ((ROME_PATCH_VER_0101 << 16 ) | ROME_SOC_ID_00 ),
++ ROME_VER_1_3 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_00 ),
++ ROME_VER_2_1 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_11 ),
++ ROME_VER_3_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_22 ),
++ ROME_VER_3_2 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_44 ),
++ TUFELLO_VER_1_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_13 ),
++ TUFELLO_VER_1_1 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_23 )
++};
++#endif /* HW_ROME_H */
+--
+2.15.0
+
diff --git a/bsp/meta-boundary/recipes-connectivity/bluez5/bluez5_%.bbappend b/bsp/meta-boundary/recipes-connectivity/bluez5/bluez5_%.bbappend
new file mode 100644
index 00000000..9eff7c03
--- /dev/null
+++ b/bsp/meta-boundary/recipes-connectivity/bluez5/bluez5_%.bbappend
@@ -0,0 +1,12 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
+PATCHES = " file://0001-hciattach-add-QCA9377-Tuffello-support.patch \
+"
+
+SRC_URI_append_mx6 = "${PATCHES}"
+SRC_URI_append_mx7 = "${PATCHES}"
+SRC_URI_append_mx8 = "${PATCHES}"
+
+PACKAGE_ARCH_mx6 = "${MACHINE_SOCARCH}"
+PACKAGE_ARCH_mx7 = "${MACHINE_SOCARCH}"
+PACKAGE_ARCH_mx8 = "${MACHINE_SOCARCH}"
diff --git a/bsp/meta-boundary/recipes-core/busybox/busybox/custom-ash.cfg b/bsp/meta-boundary/recipes-core/busybox/busybox/custom-ash.cfg
new file mode 100644
index 00000000..8cb6d799
--- /dev/null
+++ b/bsp/meta-boundary/recipes-core/busybox/busybox/custom-ash.cfg
@@ -0,0 +1,3 @@
+CONFIG_FEATURE_EDITING_HISTORY=999
+CONFIG_FEATURE_EDITING_VI=y
+CONFIG_FEATURE_REVERSE_SEARCH=y
diff --git a/bsp/meta-boundary/recipes-core/busybox/busybox_%.bbappend b/bsp/meta-boundary/recipes-core/busybox/busybox_%.bbappend
new file mode 100644
index 00000000..984c5a48
--- /dev/null
+++ b/bsp/meta-boundary/recipes-core/busybox/busybox_%.bbappend
@@ -0,0 +1,8 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
+SRC_URI += " \
+ file://custom-ash.cfg \
+"
+
+SRC_URI[custom-ash.cfg.md5sum] = "13d2bc68c91b5c2679ecc652f66832b3"
+SRC_URI[custom-ash.cfg.sha256sum] = "7001872f5021b48d010597ce1a614dd35982bdd0045387170408d5946a5c0c7e"
diff --git a/bsp/meta-boundary/recipes-core/init-ifupdown/boundary/interfaces b/bsp/meta-boundary/recipes-core/init-ifupdown/boundary/interfaces
new file mode 100644
index 00000000..ac9a7da8
--- /dev/null
+++ b/bsp/meta-boundary/recipes-core/init-ifupdown/boundary/interfaces
@@ -0,0 +1,27 @@
+# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
+
+# The loopback interface
+auto lo
+iface lo inet loopback
+
+# Wired or wireless interfaces
+auto eth0
+iface eth0 inet dhcp
+ hostname `/bin/hostname`
+
+# Ethernet/RNDIS gadget (g_ether)
+# ... or on host side, usbnet and random hwaddr
+auto usb0
+iface usb0 inet static
+ pre-up modprobe g_ether
+ address 10.0.0.2
+ netmask 255.255.255.0
+ network 10.0.0.0
+
+# Wireless interfaces
+auto wlan0
+iface wlan0 inet dhcp
+ wireless_mode managed
+ wireless_essid any
+ wpa-driver nl80211
+ wpa-conf /etc/wpa_supplicant.conf
diff --git a/bsp/meta-boundary/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend b/bsp/meta-boundary/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend
new file mode 100644
index 00000000..41e996f5
--- /dev/null
+++ b/bsp/meta-boundary/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend
@@ -0,0 +1,3 @@
+FILESEXTRAPATHS_prepend_mx6 := "${THISDIR}/boundary:"
+FILESEXTRAPATHS_prepend_mx7 := "${THISDIR}/boundary:"
+FILESEXTRAPATHS_prepend_mx8 := "${THISDIR}/boundary:"
diff --git a/bsp/meta-boundary/recipes-core/microcom/microcom_git.bb b/bsp/meta-boundary/recipes-core/microcom/microcom_git.bb
new file mode 100644
index 00000000..68dfa5e1
--- /dev/null
+++ b/bsp/meta-boundary/recipes-core/microcom/microcom_git.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "microcom is a small minicom-like serial terminal emulator with scripting support."
+LICENSE = "GPLv3"
+LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
+
+SRCREV = "5ea09fd573a56efeba3c2cc07e41537d52d3de48"
+SRC_URI = "git://github.com/Oliviers-OSS/microcom;branch=master"
+
+S = "${WORKDIR}/git"
+
+do_install () {
+ install -d ${D}${bindir}
+ install -m 0755 microcom ${D}${bindir}
+}
+
+inherit autotools
diff --git a/bsp/meta-boundary/recipes-core/psplash/files/boundary-logo-img.h b/bsp/meta-boundary/recipes-core/psplash/files/boundary-logo-img.h
new file mode 100644
index 00000000..02d278a7
--- /dev/null
+++ b/bsp/meta-boundary/recipes-core/psplash/files/boundary-logo-img.h
@@ -0,0 +1,1776 @@
+/* Generated with make-image-header script from psplash project */
+/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */
+
+#define POKY_IMG_ROWSTRIDE (1176)
+#define POKY_IMG_WIDTH (294)
+#define POKY_IMG_HEIGHT (380)
+#define POKY_IMG_BYTES_PER_PIXEL (4) /* 3:RGB, 4:RGBA */
+#define POKY_IMG_RLE_PIXEL_DATA ((uint8*) \
+ "\377\377\377\377\0\377\377\377\377\0\377\377\377\377\0\377\377\377\377" \
+ "\0\377\377\377\377\0\377\377\377\377\0\377\377\377\377\0\377\377\377" \
+ "\377\0\377\377\377\377\0\377\377\377\377\0\377\377\377\377\0\372\377" \
+ "\377\377\0\5\375\375\375\210\334\337\345\377\324\330\337\377\316\322" \
+ "\333\377\302\310\322\377\377\303\310\322\377\336\303\310\322\377\1\276" \
+ "\304\317\377\213\271\277\314\377\1\272\300\314\377\262\377\377\377\0" \
+ "\4\323\327\337\377\224\236\261\377Sb\200\377!4[\377\377\26*S\377\360" \
+ "\26*S\377\1\31,U\377\255\377\377\377\0\10\347\351\355\377\234\245\266" \
+ "\377_m\211\3779Jm\377\30,T\377\15\"L\377\20%O\377\23'Q\377\377\26*S\377" \
+ "\361\26*S\377\1\31,U\377\252\377\377\377\0\5\344\347\353\377\242\251" \
+ "\272\3773Eh\377\11\36I\377\21&P\377\377\26*S\377\367\26*S\377\1\31,U" \
+ "\377\250\377\377\377\0\5\237\247\270\3771Cg\377\34""0W\377\24(R\377\25" \
+ ")S\377\377\26*S\377\371\26*S\377\1\31,U\377\245\377\377\377\0\4\343\345" \
+ "\352\377\204\217\244\377!3[\377\16#M\377\377\26*S\377\375\26*S\377\1" \
+ "\31,U\377\244\377\377\377\0\2ly\223\377\16\"M\377\377\26*S\377\377\26" \
+ "*S\377\2\26*S\377\31,U\377\242\377\377\377\0\3o|\225\377\37""2Y\377\22" \
+ "&P\377\227\26*S\377\10\23'P\377\17#N\377\13\40K\377\7\34H\377\21&O\377" \
+ "$6]\3776Hk\377FVw\377\377IXx\377\260IXx\377\1@Pq\377\2126Hk\377\2""5" \
+ "Fj\377\37""2Z\377\211\35""0Y\377\2\36""1Y\377\14!L\377\212\5\32F\377" \
+ "\1\6\33G\377\206\7\34H\377\1\17#N\377\210\26*S\377\1\31,U\377\240\377" \
+ "\377\377\0\3\264\273\310\377\26*S\377\23'Q\377\223\26*S\377\12\25)S\377" \
+ "\23'Q\377\20$O\377\35""0X\3778Il\377L[{\377w\203\233\377\240\250\271" \
+ "\377\317\323\333\377\367\370\371\377\377\377\377\377\377\327\377\377" \
+ "\377\377\1\366\367\371\377\205\367\370\371\377\1\203\216\244\377\210" \
+ "\26*S\377\1\31,U\377\237\377\377\377\0\1;Ln\377\225\26*S\377\6\21&P\377" \
+ "\40""3[\377r~\226\377\310\314\326\377\367\370\371\377\373\373\374\377" \
+ "\377\377\377\377\377\342\377\377\377\377\1\210\222\247\377\210\26*S\377" \
+ "\1\31,U\377\235\377\377\377\0\3\242\252\272\377\27+T\377\24(Q\377\221" \
+ "\26*S\377\5\23'Q\377\13\40K\377<Mo\377\207\221\247\377\320\325\335\377" \
+ "\377\377\377\377\377\347\377\377\377\377\1\210\222\247\377\210\26*S\377" \
+ "\1\31,U\377\234\377\377\377\0\2[j\206\377\17$N\377\221\26*S\377\4\25" \
+ ")R\377\37""2Y\377[h\205\377\340\343\350\377\377\377\377\377\377\352\377" \
+ "\377\377\377\1\210\222\247\377\210\26*S\377\1\31,U\377\232\377\377\377" \
+ "\0\3\346\350\354\377/Af\377\24(R\377\220\26*S\377\4\22&P\377\22'P\377" \
+ "\227\237\262\377\350\351\356\377\377\377\377\377\377\354\377\377\377" \
+ "\377\1\210\222\247\377\210\26*S\377\1\31,U\377\231\377\377\377\0\2\316" \
+ "\322\333\377$7^\377\220\26*S\377\3\22'P\377%7^\377\212\224\251\377\377" \
+ "\377\377\377\377\357\377\377\377\377\1\210\222\247\377\210\26*S\377\1" \
+ "\31,U\377\230\377\377\377\0\2\306\313\325\377\30,U\377\220\26*S\377\3" \
+ "\22&P\377iu\220\377\372\373\374\377\377\377\377\377\377\360\377\377\377" \
+ "\377\1\210\222\247\377\210\26*S\377\1\31,U\377\227\377\377\377\0\2\242" \
+ "\252\273\377\27+T\377\217\26*S\377\3\21%O\377Tb\201\377\325\330\340\377" \
+ "\377\377\377\377\377\362\377\377\377\377\1\207\221\246\377\210\26*S\377" \
+ "\1\31,U\377\226\377\377\377\0\2\314\321\331\377\30,T\377\217\26*S\377" \
+ "\2\32.V\377~\211\240\377\224\377\377\377\377\7\371\372\373\377\356\360" \
+ "\363\377\345\347\354\377\335\337\346\377\301\306\321\377\250\257\277" \
+ "\377\227\240\263\377\377\213\226\252\377\256\213\226\252\377\2\214\226" \
+ "\252\377\244\254\274\377\212\250\257\277\377\2\255\264\303\377\276\304" \
+ "\317\377\211\275\303\316\377\2\276\304\317\377\327\333\342\377\212\331" \
+ "\334\343\377\210\377\377\377\377\2\222\234\257\377\25)R\377\207\26*S" \
+ "\377\1\31,U\377\225\377\377\377\0\2\303\310\322\377\27+T\377\216\26*" \
+ "S\377\3\24(Q\377\"5\\\377\337\342\347\377\222\377\377\377\377\11\352" \
+ "\354\357\377\221\232\256\377EUv\377,>c\377$7]\377\35""0X\377\25)R\377" \
+ "\23(Q\377\24(Q\377\377\24(R\377\260\24(R\377\214\24(Q\377\213\23(Q\377" \
+ "\213\23'Q\377\210\377\377\377\377\2\232\242\264\377\25)R\377\207\26*" \
+ "S\377\1\31,U\377\224\377\377\377\0\2\340\343\350\377\"5\\\377\216\26" \
+ "*S\377\2\14!L\377gt\217\377\220\377\377\377\377\7\365\366\370\377\270" \
+ "\276\312\377n{\224\377%7^\377\10\35H\377\17$N\377\25)R\377\377\26*S\377" \
+ "\330\26*S\377\210\377\377\377\377\2\231\242\264\377\25)R\377\207\26*" \
+ "S\377\1\31,U\377\224\377\377\377\0\1$7]\377\216\26*S\377\2\27+T\377\222" \
+ "\233\257\377\216\377\377\377\377\5\376\376\376\377\352\354\360\377fs" \
+ "\216\377\24(R\377\25)R\377\377\26*S\377\335\26*S\377\210\377\377\377" \
+ "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\223\377\377\377" \
+ "\0\2Sb\177\377\25)R\377\215\26*S\377\2\23'P\377\267\275\312\377\216\377" \
+ "\377\377\377\4\275\302\316\377L\\{\377\27+T\377\23'Q\377\377\26*S\377" \
+ "\337\26*S\377\210\377\377\377\377\2\231\242\264\377\25)R\377\207\26*" \
+ "S\377\1\31,U\377\222\377\377\377\0\2\216\230\254\377\16#N\377\215\26" \
+ "*S\377\2\27+T\377\277\304\320\377\215\377\377\377\377\3\324\330\340\377" \
+ "AQs\377\13\40K\377\377\26*S\377\342\26*S\377\210\377\377\377\377\2\231" \
+ "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\222\377\377\377\0\1\30" \
+ ",U\377\215\26*S\377\2\30,U\377\324\327\337\377\214\377\377\377\377\4" \
+ "\374\374\374\377Ve\202\377\31,U\377\25*S\377\377\26*S\377\343\26*S\377" \
+ "\210\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \
+ "\221\377\377\377\0\2""5Fj\377\24(R\377\214\26*S\377\2\20%O\377\271\277" \
+ "\313\377\214\377\377\377\377\3\241\251\271\377\32.V\377\22'P\377\377" \
+ "\26*S\377\345\26*S\377\210\377\377\377\377\2\231\242\264\377\25)R\377" \
+ "\207\26*S\377\1\31,U\377\220\377\377\377\0\1\236\247\270\377\216\26*" \
+ "S\377\1\267\275\312\377\213\377\377\377\377\3\366\367\371\377Zh\205\377" \
+ "\22&P\377\377\26*S\377\347\26*S\377\210\377\377\377\377\2\231\242\264" \
+ "\377\25)R\377\207\26*S\377\1\31,U\377\220\377\377\377\0\1\36""2Y\377" \
+ "\214\26*S\377\2\15!L\377\230\241\263\377\213\377\377\377\377\3\331\334" \
+ "\343\377+=c\377\23'Q\377\377\26*S\377\350\26*S\377\1\375\375\375\377" \
+ "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \
+ "\217\377\377\377\0\2fs\215\377\22&P\377\213\26*S\377\2\24(Q\377Yg\204" \
+ "\377\213\377\377\377\377\2\277\305\320\377\22&P\377\377\26*S\377\352" \
+ "\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25" \
+ ")R\377\207\26*S\377\1\31,U\377\216\377\377\377\0\2\375\375\375\314\40" \
+ "3Z\377\214\26*S\377\1\40""3[\377\213\377\377\377\377\2\245\255\274\377" \
+ "\25)R\377\377\26*S\377\353\26*S\377\1\375\375\376\377\207\377\377\377" \
+ "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\216\377\377\377" \
+ "\0\2\207\221\247\377\24(Q\377\213\26*S\377\2\32-V\377\336\341\346\377" \
+ "\212\377\377\377\377\2\226\237\261\377\15\"M\377\377\26*S\377\354\26" \
+ "*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \
+ "\207\26*S\377\1\31,U\377\216\377\377\377\0\1\12\37J\377\213\26*S\377" \
+ "\2\21%O\377t\200\230\377\212\377\377\377\377\2\261\267\305\377\12\37" \
+ "J\377\377\26*S\377\355\26*S\377\1\375\375\376\377\207\377\377\377\377" \
+ "\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\215\377\377\377\0" \
+ "\2\220\232\255\377\23'Q\377\213\26*S\377\1=Mo\377\212\377\377\377\377" \
+ "\2\277\305\320\377\27+T\377\377\26*S\377\356\26*S\377\1\375\375\376\377" \
+ "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \
+ "\215\377\377\377\0\1EUv\377\213\26*S\377\2\20$N\377\311\316\327\377\211" \
+ "\377\377\377\377\2\332\335\343\377\22&P\377\377\26*S\377\357\26*S\377" \
+ "\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207" \
+ "\26*S\377\1\31,U\377\215\377\377\377\0\1\20$N\377\212\26*S\377\2\23'" \
+ "Q\377]j\207\377\211\377\377\377\377\2\372\372\373\3772Dh\377\377\26*" \
+ "S\377\360\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264" \
+ "\377\25)R\377\207\26*S\377\1\31,U\377\214\377\377\377\0\2\203\215\243" \
+ "\377\21%O\377\212\26*S\377\2\33/W\377\360\361\364\377\211\377\377\377" \
+ "\377\2Q`\177\377\23'P\377\377\26*S\377\360\26*S\377\1\375\375\376\377" \
+ "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \
+ "\214\377\377\377\0\1\37""3Z\377\212\26*S\377\2\24)R\377cq\214\377\211" \
+ "\377\377\377\377\2\261\267\305\377\23'Q\377\377\26*S\377\361\26*S\377" \
+ "\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207" \
+ "\26*S\377\1\31,U\377\213\377\377\377\0\2\337\342\350\377\27+T\377\212" \
+ "\26*S\377\2\10\36I\377\361\361\364\377\211\377\377\377\377\1!4[\377\377" \
+ "\26*S\377\362\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242" \
+ "\264\377\25)R\377\207\26*S\377\1\31,U\377\213\377\377\377\0\1\273\301" \
+ "\315\377\212\26*S\377\2\25)R\377q~\227\377\211\377\377\377\377\2]k\207" \
+ "\377\22&P\377\377\26*S\377\362\26*S\377\1\375\375\376\377\207\377\377" \
+ "\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\213\377\377" \
+ "\377\0\1\207\222\246\377\212\26*S\377\2\30,U\377\325\331\340\377\210" \
+ "\377\377\377\377\2\344\346\353\377\35""1X\377\377\26*S\377\363\26*S\377" \
+ "\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207" \
+ "\26*S\377\1\31,U\377\213\377\377\377\0\1P_~\377\212\26*S\377\2!4[\377" \
+ "\373\373\374\377\210\377\377\377\377\2q|\226\377\24)R\377\377\26*S\377" \
+ "\363\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377" \
+ "\25)R\377\207\26*S\377\1\31,U\377\213\377\377\377\0\1\36""1Y\377\211" \
+ "\26*S\377\2\17$N\377\210\222\247\377\210\377\377\377\377\2\342\344\352" \
+ "\377\10\35H\377\377\26*S\377\364\26*S\377\1\375\375\376\377\207\377\377" \
+ "\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\213\377\377" \
+ "\377\0\1\6\34G\377\211\26*S\377\1\22&P\377\211\377\377\377\377\2my\223" \
+ "\377\25)R\377\377\26*S\377\364\26*S\377\1\375\375\376\377\207\377\377" \
+ "\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377" \
+ "\377\0\2\325\330\340\377\12\37J\377\211\26*S\377\1HXx\377\211\377\377" \
+ "\377\377\1-\77d\377\377\26*S\377\365\26*S\377\1\375\375\376\377\207\377" \
+ "\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\275\303\317\377\14!K\377\211\26*S\377\1\177\212\241\377" \
+ "\210\377\377\377\377\2\312\316\327\377\15!L\377\377\26*S\377\365\26*" \
+ "S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\234\244\266\377\17#N\377" \
+ "\210\26*S\377\2\22&P\377\273\300\315\377\210\377\377\377\377\2@Pr\377" \
+ "\24(R\377\377\26*S\377\365\26*S\377\1\375\375\376\377\207\377\377\377" \
+ "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\216\227\253\377\20$N\377\210\26*S\377\2\15\"L\377\365\366\367\377" \
+ "\207\377\377\377\377\2\361\362\364\377\24(Q\377\377\26*S\377\366\26*" \
+ "S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2\25)R\3771Cg\377\210\377\377\377\377\1\307\313\325\377" \
+ "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231" \
+ "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2\24(Q\377ht\217\377\210\377\377\377" \
+ "\377\1\220\232\255\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207" \
+ "\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2\22&P\377\251" \
+ "\261\300\377\210\377\377\377\377\1_l\210\377\377\26*S\377\367\26*S\377" \
+ "\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207" \
+ "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \
+ "\26*S\377\2\20%O\377\335\340\346\377\210\377\377\377\377\1""2Ch\377\377" \
+ "\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242" \
+ "\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \
+ "\254\377\20$N\377\207\26*S\377\2\34/W\377\361\362\365\377\210\377\377" \
+ "\377\377\1\13\40K\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207" \
+ "\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2\"5\\\377\363" \
+ "\364\366\377\207\377\377\377\377\2\337\342\347\377\11\36I\377\377\26" \
+ "*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264" \
+ "\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2*<b\377\365\366\370\377\207\377\377\377\377" \
+ "\2\301\307\322\377\13\40K\377\377\26*S\377\367\26*S\377\1\375\375\376" \
+ "\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""0" \
+ "Af\377\367\370\371\377\207\377\377\377\377\2\243\253\273\377\16#M\377" \
+ "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231" \
+ "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\226\252\377\20$N\377\377\26*S\377\367\26*S\377\1\375" \
+ "\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377" \
+ "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \
+ "S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377" \
+ "\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377" \
+ "\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377" \
+ "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264" \
+ "\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376" \
+ "\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231" \
+ "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375" \
+ "\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377" \
+ "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \
+ "S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377" \
+ "\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377" \
+ "\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377" \
+ "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264" \
+ "\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376" \
+ "\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231" \
+ "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375" \
+ "\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377" \
+ "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \
+ "S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377" \
+ "\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377" \
+ "\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377" \
+ "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264" \
+ "\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376" \
+ "\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231" \
+ "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375" \
+ "\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377" \
+ "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \
+ "S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377" \
+ "\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377" \
+ "\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377" \
+ "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264" \
+ "\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376" \
+ "\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231" \
+ "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375" \
+ "\375\376\377\207\377\377\377\377\2\232\242\264\377\25)R\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377" \
+ "\377\2\251\261\300\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \
+ "S\377\1\375\375\376\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377" \
+ "\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\253\263\301\377" \
+ "\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377" \
+ "\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\253\263\301" \
+ "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376" \
+ "\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\253" \
+ "\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\363" \
+ "\364\366\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\367\26*S\377\1\364\364\367\377\207\377\377\377" \
+ "\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \
+ "S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\364\364\367\377\207\377" \
+ "\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\367\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377" \
+ "\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\364\364\367\377" \
+ "\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301" \
+ "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\364\364\367" \
+ "\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\277\26*S\377\3\25)R\3773Dh\377\223\235\260\377\241\217" \
+ "\230\254\377\3\220\232\255\377cq\214\377\22'P\377\221\26*S\377\1\364" \
+ "\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\277\26*S\377\2\24(Q\377M]|\377\243\377\377\377" \
+ "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377" \
+ "\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\277\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377" \
+ "\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263" \
+ "\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \
+ "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \
+ "\377\377\2\214\225\251\377\20$N\377\377\26*S\377\277\26*S\377\2\24(Q" \
+ "\377M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \
+ "\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207" \
+ "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \
+ "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \
+ "\377\20$N\377\377\26*S\377\277\26*S\377\2\24(Q\377M]|\377\243\377\377" \
+ "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207" \
+ "\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \
+ "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S" \
+ "\377\277\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302" \
+ "\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253" \
+ "\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\277\26*S\377\2\24" \
+ "(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*" \
+ "S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\277\26*S\377\2\24(Q\377M]|\377\243\377" \
+ "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377" \
+ "\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\222\26" \
+ "*S\377\262'9_\377\3\34""0X\377\30,U\377\31,U\377\202\12\37J\377\7\13" \
+ "\40K\377\14!L\377\16#M\377\17$N\377\21%O\377\23'Q\377\25)R\377\356\26" \
+ "*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377" \
+ "\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377" \
+ "\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\266\377\377\377\377" \
+ "\14\372\373\373\377\345\350\354\377\321\324\335\377\260\267\305\377\233" \
+ "\244\265\377y\205\235\377Zh\205\3771Cg\377\33/W\377\32.V\377\31-U\377" \
+ "\30+T\377\352\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263" \
+ "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \
+ "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\277" \
+ "\377\377\377\377\12\362\363\366\377\342\344\352\377\321\324\335\377\272" \
+ "\300\314\377\226\237\262\377ao\213\377.@e\377\7\35H\377\14!L\377\22'" \
+ "P\377\343\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302" \
+ "\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253" \
+ "\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\306\377" \
+ "\377\377\377\7\375\375\375\377\271\277\314\377t\200\231\377@Qr\377&9" \
+ "_\377\22&P\377\23'Q\377\337\26*S\377\2\24(Q\377M]|\377\243\377\377\377" \
+ "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377" \
+ "\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \
+ "\1\30,U\377\311\377\377\377\377\6\375\375\375\377\366\366\370\377\336" \
+ "\340\347\377y\204\234\377\25*R\377\21&P\377\335\26*S\377\2\24(Q\377M" \
+ "]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1" \
+ "\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26" \
+ "*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26" \
+ "*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\221\26*S\377\1\30,U\377\316\377\377\377\377\4\303\307\322\377" \
+ "|\207\236\377*=b\377\13\40K\377\332\26*S\377\2\24(Q\377M]|\377\243\377" \
+ "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377" \
+ "\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26" \
+ "*S\377\1\30,U\377\321\377\377\377\377\4\265\273\310\377,>c\377\30,U\377" \
+ "\25)R\377\327\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263" \
+ "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \
+ "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\322" \
+ "\377\377\377\377\4\376\376\377\377\330\333\342\377JYy\377\15\"L\377\326" \
+ "\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377\17" \
+ "#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301" \
+ "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\325\377\377\377" \
+ "\377\3\273\301\314\377=Np\377\16#M\377\324\26*S\377\2\24(Q\377M]|\377" \
+ "\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364" \
+ "\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377" \
+ "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\221\26*S\377\1\30,U\377\327\377\377\377\377\2\241\251\272\377" \
+ "\25)S\377\323\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263" \
+ "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \
+ "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\330" \
+ "\377\377\377\377\3\330\333\342\3779Jm\377\24(Q\377\321\26*S\377\2\24" \
+ "(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*" \
+ "S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\221\26*S\377\1\30,U\377\332\377\377\377\377\2IYy\377" \
+ "\25)R\377\320\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263" \
+ "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \
+ "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\333" \
+ "\377\377\377\377\2r\177\227\377\16#M\377\317\26*S\377\2\24(Q\377M]|\377" \
+ "\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364" \
+ "\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377" \
+ "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\221\26*S\377\1\30,U\377\334\377\377\377\377\2y\205\234\377\24" \
+ "(Q\377\316\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302" \
+ "\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253" \
+ "\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\335\377" \
+ "\377\377\377\2Ud\201\377\23'Q\377\315\26*S\377\2\24(Q\377M]|\377\243" \
+ "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367" \
+ "\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\221\26*S\377\1\30,U\377\336\377\377\377\377\1JYy\377\315\26*S\377\2" \
+ "\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \
+ "*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\221\26*S\377\1\30,U\377\336\377\377\377\377\1\346\350" \
+ "\354\377\315\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263" \
+ "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \
+ "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\337" \
+ "\377\377\377\377\2\274\302\316\377\24(R\377\313\26*S\377\2\24(Q\377M" \
+ "]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1" \
+ "\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26" \
+ "*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26" \
+ "*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\221\26*S\377\1\30,U\377\337\377\377\377\377\3\375\375\376\377" \
+ ";Lo\377\25)R\377\312\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2" \
+ "\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377" \
+ "\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377" \
+ "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \
+ "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \
+ ",U\377\340\377\377\377\377\2\324\330\337\377\14\40K\377\312\26*S\377" \
+ "\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221" \
+ "\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23" \
+ "'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \
+ "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \
+ "\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\341\377\377\377\377" \
+ "\1\\j\206\377\312\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253" \
+ "\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377" \
+ "\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377" \
+ "\341\377\377\377\377\2\275\303\317\377\25*S\377\311\26*S\377\2\24(Q\377" \
+ "M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1" \
+ "\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26" \
+ "*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26" \
+ "*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\221\26*S\377\1\30,U\377\341\377\377\377\377\2\375\375\376\377" \
+ "\23'Q\377\311\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263" \
+ "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \
+ "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\342" \
+ "\377\377\377\377\2u\200\231\377\22&P\377\310\26*S\377\2\24(Q\377N]}\377" \
+ "\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364" \
+ "\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377" \
+ "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\221\26*S\377\1\30,U\377\342\377\377\377\377\2\346\350\354\377" \
+ "\16#M\377\310\26*S\377\2\24(R\377>Oq\377\243\377\377\377\377\2\253\263" \
+ "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \
+ "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\342" \
+ "\377\377\377\377\2\376\376\376\377(:`\377\310\26*S\377\2\25)R\377.@e" \
+ "\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364" \
+ "\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\221\26*S\377\1\30,U\377\342\377\377\377\377\2\376\376\376\377" \
+ "JYy\377\310\26*S\377\2\25)R\377);a\377\243\377\377\377\377\2\253\263" \
+ "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \
+ "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244" \
+ "\377\377\377\377\214\376\376\377\377\263\377\377\377\377\2iv\221\377" \
+ "\25)S\377\310\26*S\377\1\20$N\377\243\377\377\377\377\2\253\263\302\377" \
+ "\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263" \
+ "\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \
+ "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \
+ "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377" \
+ "\377\377\1KZz\377\213O^}\377\6Tc\201\377_m\211\377s\177\227\377\227\240" \
+ "\263\377\301\307\321\377\370\371\372\377\255\377\377\377\377\2\224\234" \
+ "\260\377\22&P\377\250\26*S\377\5\23'Q\377\20$N\377\14!K\377\11\36J\377" \
+ "\7\35H\377\203\7\34H\377\5\7\35H\377\11\36I\377\13\40K\377\16#M\377\22" \
+ "&P\377\223\26*S\377\1\20%O\377\243\377\377\377\377\2\253\263\302\377" \
+ "\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263" \
+ "\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \
+ "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \
+ "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377" \
+ "\377\377\1\20$N\377\215\26*S\377\7\25)R\377\21&O\377\15\"L\377\7\34H" \
+ "\3778Jm\377\235\246\267\377\342\345\352\377\252\377\377\377\377\2\270" \
+ "\276\312\377\16#M\377\243\26*S\377\12\25)R\377\22&P\377\31-U\377/Ae\377" \
+ ">Np\377gt\217\377\221\233\256\377\275\303\316\377\334\336\345\377\361" \
+ "\363\365\377\203\364\366\367\377\12\363\364\366\377\342\344\352\377\306" \
+ "\313\325\377\236\246\267\377u\201\231\377EUv\3772Ch\377\35""1X\377\21" \
+ "&O\377\24(R\377\216\26*S\377\2\21%O\377\372\373\374\377\242\377\377\377" \
+ "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377" \
+ "\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \
+ "\1\30,U\377\244\377\377\377\377\1\20$N\377\222\26*S\377\4\24(R\377\33" \
+ ".V\377;Lo\377\353\355\360\377\250\377\377\377\377\2\322\326\336\377\14" \
+ "!K\377\241\26*S\377\7\25)R\377\13\40K\377>Op\377\262\272\306\377\356" \
+ "\357\362\377\367\370\371\377\376\376\376\377\216\377\377\377\377\6\370" \
+ "\371\372\377\361\362\365\377\304\311\323\377O^}\377\11\36I\377\24)R\377" \
+ "\214\26*S\377\2\21&O\377\362\362\365\377\242\377\377\377\377\2\253\263" \
+ "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \
+ "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244" \
+ "\377\377\377\377\1\20$N\377\224\26*S\377\3\25)R\377\22'P\377\230\241" \
+ "\263\377\247\377\377\377\377\2\355\356\362\377\11\36I\377\236\26*S\377" \
+ "\5\25)S\377\13\40K\377;Lo\377\223\234\257\377\351\353\357\377\227\377" \
+ "\377\377\377\4\357\360\363\377\230\240\263\377<Mo\377\13\40K\377\212" \
+ "\26*S\377\2\22&P\377\346\350\354\377\242\377\377\377\377\2\253\263\302" \
+ "\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253" \
+ "\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377" \
+ "\377\377\377\1\20$N\377\226\26*S\377\2\25)R\377\210\222\247\377\246\377" \
+ "\377\377\377\2\372\372\373\377\10\35I\377\236\26*S\377\2+=b\377\300\306" \
+ "\320\377\235\377\377\377\377\2\273\301\314\377&9_\377\211\26*S\377\2" \
+ "\22'P\377\331\335\343\377\242\377\377\377\377\2\253\263\302\377\17#N" \
+ "\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301" \
+ "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377" \
+ "\377\1\20$N\377\227\26*S\377\2\17$N\377\236\247\270\377\245\377\377\377" \
+ "\377\2\371\372\373\377\10\35I\377\233\26*S\377\4\23(Q\377\26+S\377\264" \
+ "\272\307\377\373\373\374\377\237\377\377\377\377\3\367\367\371\377\230" \
+ "\241\263\377\11\36I\377\207\26*S\377\2\23(Q\377\307\314\326\377\242\377" \
+ "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377" \
+ "\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26" \
+ "*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\230\26*S\377\2,>c\377" \
+ "\376\376\376\377\244\377\377\377\377\2\371\372\373\377\10\35I\377\232" \
+ "\26*S\377\2\21%O\377`m\211\377\244\377\377\377\377\3\331\333\342\377" \
+ "3Dh\377\22'P\377\205\26*S\377\2\24(R\377\270\276\313\377\242\377\377" \
+ "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207" \
+ "\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \
+ "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \
+ "\377\1\30,U\377\244\377\377\377\377\1\20$N\377\230\26*S\377\2\17$N\377" \
+ "\263\272\310\377\244\377\377\377\377\2\371\372\373\377\10\35I\377\231" \
+ "\26*S\377\2\27+T\377\300\305\321\377\247\377\377\377\377\2Uc\201\377" \
+ "\25)R\377\204\26*S\377\2\25)R\377\251\261\300\377\242\377\377\377\377" \
+ "\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377" \
+ "\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377" \
+ "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \
+ "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \
+ ",U\377\244\377\377\377\377\1\20$N\377\230\26*S\377\2\24(R\377;Ln\377" \
+ "\244\377\377\377\377\2\356\357\362\377\11\36I\377\230\26*S\377\2-@d\377" \
+ "\325\331\340\377\251\377\377\377\377\2p}\226\377\14!L\377\204\26*S\377" \
+ "\1\225\236\261\377\242\377\377\377\377\2\253\263\302\377\17#N\377\221" \
+ "\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23" \
+ "'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \
+ "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \
+ "\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377" \
+ "\1\20$N\377\231\26*S\377\2\23'Q\377\376\376\377\377\243\377\377\377\377" \
+ "\2\332\335\343\377\13\40K\377\226\26*S\377\3\25)R\377':`\377\361\362" \
+ "\365\377\253\377\377\377\377\2v\202\232\377\24(Q\377\203\26*S\377\1\201" \
+ "\214\242\377\242\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S" \
+ "\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \
+ "\377\231\26*S\377\2\24)R\377\351\353\357\377\243\377\377\377\377\2\277" \
+ "\304\317\377\15\"M\377\226\26*S\377\2""8Il\377\362\363\366\377\255\377" \
+ "\377\377\377\2my\224\377\21%O\377\202\26*S\377\1iv\221\377\242\377\377" \
+ "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207" \
+ "\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \
+ "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \
+ "\377\1\30,U\377\244\377\377\377\377\1\20$N\377\231\26*S\377\2\25)R\377" \
+ "\345\347\354\377\243\377\377\377\377\2\233\243\265\377\21%O\377\224\26" \
+ "*S\377\3\25)S\3774Ei\377\357\361\363\377\257\377\377\377\377\4L\\{\377" \
+ "\23'Q\377\26*S\377M\\|\377\242\377\377\377\377\2\253\263\302\377\17#" \
+ "N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301" \
+ "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377" \
+ "\377\1\20$N\377\231\26*S\377\2\24)R\377\354\356\361\377\243\377\377\377" \
+ "\377\2o|\225\377\25)R\377\224\26*S\377\2\35""1Y\377\347\351\355\377\261" \
+ "\377\377\377\377\3(:`\377\26*S\3772Dh\377\242\377\377\377\377\2\253\263" \
+ "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \
+ "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244" \
+ "\377\377\377\377\1\20$N\377\231\26*S\377\2\23'Q\377\375\375\376\377\243" \
+ "\377\377\377\377\1R`\177\377\224\26*S\377\2\23(Q\377\322\327\336\377" \
+ "\262\377\377\377\377\3\332\336\344\377\22'P\377\24)R\377\242\377\377" \
+ "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207" \
+ "\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \
+ "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \
+ "\377\1\30,U\377\244\377\377\377\377\1\20$N\377\230\26*S\377\2\25)R\377" \
+ ".@d\377\243\377\377\377\377\2\376\376\376\3773Dh\377\223\26*S\377\2\22" \
+ "'P\377\227\241\262\377\264\377\377\377\377\3\241\251\272\377\1\27D\377" \
+ "\371\371\373\377\241\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \
+ "*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \
+ "\377\230\26*S\377\2\21%O\377\222\233\256\377\243\377\377\377\377\2\371" \
+ "\371\372\377\21%O\377\222\26*S\377\2\24(Q\377R`~\377\266\377\377\377" \
+ "\377\2O_}\377\310\314\326\377\241\377\377\377\377\2\253\263\302\377\17" \
+ "#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301" \
+ "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377" \
+ "\377\1\20$N\377\230\26*S\377\2\30,T\377\370\370\372\377\243\377\377\377" \
+ "\377\2\235\245\266\377\20$O\377\222\26*S\377\2!4[\377\364\365\367\377" \
+ "\266\377\377\377\377\2\363\364\366\377\361\362\365\377\241\377\377\377" \
+ "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377" \
+ "\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \
+ "\1\30,U\377\244\377\377\377\377\1\20$N\377\227\26*S\377\2\25)S\377]k" \
+ "\207\377\244\377\377\377\377\2+=c\377\25)R\377\221\26*S\377\2\20$N\377" \
+ "\226\237\262\377\332\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \
+ "*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \
+ "\377\227\26*S\377\2\22&P\377\361\362\364\377\243\377\377\377\377\2\330" \
+ "\333\342\377\24(R\377\222\26*S\377\1FVw\377\333\377\377\377\377\2\253" \
+ "\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377" \
+ "\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377" \
+ "\244\377\377\377\377\1\20$N\377\226\26*S\377\2\30,T\377\322\326\336\377" \
+ "\244\377\377\377\377\1\214\225\252\377\223\26*S\377\1\321\325\335\377" \
+ "\333\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364" \
+ "\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377" \
+ "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\225\26" \
+ "*S\377\2\27*S\377\333\336\345\377\245\377\377\377\377\1\34/W\377\221" \
+ "\26*S\377\2\24(R\377@Pr\377\334\377\377\377\377\2\253\263\302\377\17" \
+ "#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301" \
+ "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377" \
+ "\377\1\20$N\377\222\26*S\377\4\23'P\377\20$N\377lx\222\377\352\354\360" \
+ "\377\245\377\377\377\377\2\204\217\245\377\17$N\377\221\26*S\377\2\23" \
+ "'P\377\350\353\356\377\334\377\377\377\377\2\253\263\302\377\17#N\377" \
+ "\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\257\265\304\377" \
+ "\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377" \
+ "\1\20$N\377\215\26*S\377\202\25)R\377\5\24(R\377\30,T\377%8^\377`n\211" \
+ "\377\344\346\353\377\246\377\377\377\377\2\360\361\364\377$7]\377\222" \
+ "\26*S\377\1Ve\203\377\335\377\377\377\377\2\253\263\302\377\17#N\377" \
+ "\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\271\277\313\377" \
+ "\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377" \
+ "\1\0\25B\377\213\6\33G\377\7\12\40J\377\"5\\\377CRt\377r~\227\377\251" \
+ "\260\300\377\336\341\347\377\363\364\366\377\250\377\377\377\377\2y\204" \
+ "\234\377\24(R\377\221\26*S\377\2\17$N\377\273\301\315\377\335\377\377" \
+ "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207" \
+ "\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \
+ "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \
+ "\377\1\30,U\377\243\377\377\377\377\1\376\376\376\377\272\377\377\377" \
+ "\377\2\307\314\326\377\10\35I\377\221\26*S\377\2\25*S\377'9`\377\336" \
+ "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367" \
+ "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\221\26*S\377\1\30,U\377\336\377\377\377\377\1""1Cg\377\222\26*S\377" \
+ "\2\23'Q\377\254\264\302\377\336\377\377\377\377\2\253\263\302\377\17" \
+ "#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\271\277\313" \
+ "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\335\377\377\377" \
+ "\377\2JZy\377\22&P\377\222\26*S\377\2!4[\377\356\360\363\377\336\377" \
+ "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377" \
+ "\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26" \
+ "*S\377\1\30,U\377\334\377\377\377\377\1\206\220\245\377\223\26*S\377" \
+ "\2\25*S\377>Oq\377\337\377\377\377\377\2\253\263\302\377\17#N\377\221" \
+ "\26*S\377\1\364\364\367\377\207\377\377\377\377\2\271\277\313\377\22" \
+ "&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \
+ "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \
+ "\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\333\377\377\377\377" \
+ "\2v\202\232\377\22'P\377\223\26*S\377\2\16#M\377\235\245\267\377\337" \
+ "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367" \
+ "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\221\26*S\377\1\30,U\377\332\377\377\377\377\2\200\212\241\377\23'Q\377" \
+ "\224\26*S\377\1\20$N\377\255\377\377\377\377\6\350\352\356\377\317\323" \
+ "\333\377\303\310\322\377\315\322\332\377\330\334\343\377\364\365\367" \
+ "\377\255\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\357" \
+ "\360\363\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\221\26*S\377\1\30,U\377\330\377\377\377\377\3\375\375\376\377" \
+ "^l\210\377\25)R\377\225\26*S\377\1P_~\377\251\377\377\377\377\16\376" \
+ "\376\377\377\362\363\365\377{\206\235\377\23'Q\377\21%O\377\23'Q\377" \
+ "\23(Q\377\23'Q\377\22&P\377\20%O\377\37""2Z\377u\201\232\377\341\344" \
+ "\351\377\374\374\374\377\251\377\377\377\377\2\253\263\302\377\17#N\377" \
+ "\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377" \
+ "\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\327\377\377\377\377" \
+ "\3\324\327\337\3772Cg\377\21&P\377\226\26*S\377\1\226\237\262\377\250" \
+ "\377\377\377\377\4\371\372\373\377We\203\377\27+T\377\22&P\377\207\26" \
+ "*S\377\5\25)S\377\22'P\377\23'Q\3778Hl\377\250\257\277\377\250\377\377" \
+ "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207" \
+ "\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \
+ "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \
+ "\377\1\30,U\377\325\377\377\377\377\3\354\355\361\377}\210\236\377\7" \
+ "\35H\377\227\26*S\377\2\25)R\377\311\315\327\377\247\377\377\377\377" \
+ "\3\332\335\344\377\37""3Z\377\25)R\377\215\26*S\377\3\15\"M\377Uc\201" \
+ "\377\356\360\363\377\246\377\377\377\377\2\253\263\302\377\17#N\377\221" \
+ "\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22" \
+ "&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \
+ "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \
+ "\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\324\377\377\377\377" \
+ "\2\200\213\241\377\34""0X\377\231\26*S\377\2\24(R\377\357\361\363\377" \
+ "\246\377\377\377\377\2\310\314\326\377\30,T\377\220\26*S\377\3\25)R\377" \
+ "$7^\377\354\356\361\377\245\377\377\377\377\2\253\263\302\377\17#N\377" \
+ "\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377" \
+ "\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\320\377\377\377\377" \
+ "\5\376\376\376\377\272\300\314\377gt\217\377\34""0W\377\17$N\377\231" \
+ "\26*S\377\2\25)R\377-@d\377\246\377\377\377\377\2\360\361\364\377&9_" \
+ "\377\222\26*S\377\3\25)R\377+=c\377\364\365\367\377\244\377\377\377\377" \
+ "\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377" \
+ "\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377" \
+ "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \
+ "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \
+ ",U\377\317\377\377\377\377\3t\177\230\377\12\37J\377\21&O\377\234\26" \
+ "*S\377\2\22&P\377{\207\236\377\245\377\377\377\377\3\375\375\376\377" \
+ "3Eh\377\25)R\377\224\26*S\377\2N]}\377\376\376\377\377\243\377\377\377" \
+ "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377" \
+ "\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \
+ "\1\30,U\377\317\377\377\377\377\4\321\325\335\377r~\227\377\24)R\377" \
+ "\16\"M\377\233\26*S\377\2\16#M\377\307\314\326\377\245\377\377\377\377" \
+ "\2\262\271\306\377\25)R\377\225\26*S\377\2\22&P\377\310\314\326\377\243" \
+ "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355" \
+ "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\221\26*S\377\1\30,U\377\322\377\377\377\377\4\276\303\317\377_m\211" \
+ "\377(:`\377\17$N\377\230\26*S\377\2\22'P\377\375\375\375\377\245\377" \
+ "\377\377\377\1!4[\377\226\26*S\377\2\25)S\377$6\\\377\243\377\377\377" \
+ "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377" \
+ "\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \
+ "\1\30,U\377\325\377\377\377\377\2\255\265\302\377\37""2Z\377\227\26*" \
+ "S\377\2(:`\377\375\375\376\377\244\377\377\377\377\2\231\242\263\377" \
+ "\21%O\377\227\26*S\377\2\24(R\377\275\302\316\377\242\377\377\377\377" \
+ "\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377" \
+ "\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377" \
+ "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \
+ "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \
+ ",U\377\326\377\377\377\377\4\376\376\376\377\266\274\311\3775Fj\377\15" \
+ "\"L\377\224\26*S\377\2@Qr\377\376\376\376\377\243\377\377\377\377\2\376" \
+ "\376\376\377BRs\377\231\26*S\377\1lx\222\377\242\377\377\377\377\2\253" \
+ "\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377" \
+ "\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377" \
+ "\331\377\377\377\377\3\221\233\256\377!4[\377\24)R\377\222\26*S\377\1" \
+ "Tb\201\377\244\377\377\377\377\2\366\367\370\377\23'Q\377\231\26*S\377" \
+ "\1\37""3Z\377\242\377\377\377\377\2\253\263\302\377\17#N\377\221\26*" \
+ "S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\221\26*S\377\1\30,U\377\332\377\377\377\377\3\353\355" \
+ "\361\377HXx\377\21%O\377\220\26*S\377\2\25)S\377jw\221\377\244\377\377" \
+ "\377\377\2\220\232\255\377\21%O\377\231\26*S\377\2\12\37J\377\324\327" \
+ "\337\377\241\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \
+ "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \
+ "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \
+ "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \
+ "\377\20$N\377\221\26*S\377\1\30,U\377\334\377\377\377\377\2\215\227\253" \
+ "\377\20%O\377\217\26*S\377\2\22'P\377\214\226\252\377\244\377\377\377" \
+ "\377\2)<a\377\25)R\377\231\26*S\377\2\21%O\377x\204\234\377\241\377\377" \
+ "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207" \
+ "\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \
+ "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \
+ "\377\1\30,U\377\335\377\377\377\377\2\310\314\326\377\25)S\377\216\26" \
+ "*S\377\2\20$O\377\245\254\274\377\243\377\377\377\377\2\353\354\360\377" \
+ "\24)R\377\233\26*S\377\1""3Eh\377\241\377\377\377\377\2\253\263\302\377" \
+ "\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277" \
+ "\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \
+ "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \
+ "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\336\377\377" \
+ "\377\377\2\304\312\324\377\13\40K\377\215\26*S\377\2\15\"L\377\306\313" \
+ "\325\377\243\377\377\377\377\2\304\311\324\377\25)R\377\233\26*S\377" \
+ "\2);a\377\367\367\371\377\240\377\377\377\377\2\253\263\302\377\17#N" \
+ "\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313" \
+ "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\337\377\377\377" \
+ "\377\2\313\317\331\377\27+T\377\214\26*S\377\2\12\40K\377\336\340\346" \
+ "\377\243\377\377\377\377\1\247\257\276\377\234\26*S\377\2\40""3Z\377" \
+ "\351\353\357\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \
+ "*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\221\26*S\377\1\30,U\377\340\377\377\377\377\2\234\245" \
+ "\266\377\15!L\377\213\26*S\377\2\11\36I\377\360\361\364\377\243\377\377" \
+ "\377\377\1}\210\237\377\234\26*S\377\2\33.V\377\341\343\351\377\240\377" \
+ "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377" \
+ "\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26" \
+ "*S\377\1\30,U\377\341\377\377\377\377\1dq\215\377\213\26*S\377\1\7\34" \
+ "H\377\244\377\377\377\377\1[j\206\377\234\26*S\377\2\25)R\377\332\335" \
+ "\344\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \
+ "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \
+ "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \
+ "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \
+ "\377\20$N\377\221\26*S\377\1\30,U\377\341\377\377\377\377\2\351\353\357" \
+ "\377\30,U\377\212\26*S\377\1\7\34H\377\244\377\377\377\377\1;Ln\377\234" \
+ "\26*S\377\2\24(Q\377\270\276\313\377\240\377\377\377\377\2\253\263\302" \
+ "\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271" \
+ "\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\342\377" \
+ "\377\377\377\2\251\261\300\377\16\"M\377\211\26*S\377\1\36""1Y\377\244" \
+ "\377\377\377\377\1\37""2Z\377\234\26*S\377\2\24(Q\377\251\260\277\377" \
+ "\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \
+ "\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377" \
+ "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1Xf\203\377\213\\" \
+ "j\207\377\7dq\214\377s\177\230\377\203\215\244\377\226\237\262\377\266" \
+ "\274\311\377\314\320\331\377\350\352\356\377\254\377\377\377\377\1""7" \
+ "Hk\377\211\26*S\377\1#6]\377\244\377\377\377\377\1\22&P\377\234\26*S" \
+ "\377\2\24(R\377\222\234\257\377\240\377\377\377\377\2\253\263\302\377" \
+ "\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277" \
+ "\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \
+ "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \
+ "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377" \
+ "\377\377\1\20$N\377\220\26*S\377\5\27+T\377\30,T\377\"5\\\377\213\226" \
+ "\252\377\373\373\374\377\251\377\377\377\377\2\234\244\266\377\21%O\377" \
+ "\207\26*S\377\2\25*S\377<Mo\377\244\377\377\377\377\1\6\33G\377\234\26" \
+ "*S\377\2\24)R\377\200\212\241\377\240\377\377\377\377\2\253\263\302\377" \
+ "\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277" \
+ "\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \
+ "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \
+ "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377" \
+ "\377\377\1\20$N\377\223\26*S\377\4\20$N\377\26*S\377\\j\207\377\326\331" \
+ "\340\377\250\377\377\377\377\1\26)S\377\207\26*S\377\2\25*S\377<Mo\377" \
+ "\243\377\377\377\377\2\361\362\364\377\10\35H\377\234\26*S\377\2\25)" \
+ "R\377nz\223\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \
+ "*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \
+ "\377\226\26*S\377\3\17$N\377\227\240\262\377\374\374\375\377\246\377" \
+ "\377\377\377\2\214\225\252\377\25)R\377\206\26*S\377\2\25*S\377<Mo\377" \
+ "\243\377\377\377\377\2\357\361\363\377\10\35H\377\234\26*S\377\2\25)" \
+ "R\377o{\224\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \
+ "*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \
+ "\377\227\26*S\377\2\23(Q\377Ra\177\377\246\377\377\377\377\2\333\336" \
+ "\344\377\31-U\377\206\26*S\377\2\25*S\377<Mo\377\243\377\377\377\377" \
+ "\2\335\340\346\377\11\36J\377\234\26*S\377\2\25)R\377o{\224\377\240\377" \
+ "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377" \
+ "\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26" \
+ "*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\230\26*S\377\2\20$N" \
+ "\377\\j\206\377\245\377\377\377\377\2\366\367\370\377$7]\377\206\26*" \
+ "S\377\2\25*S\377<Mo\377\243\377\377\377\377\2\334\337\345\377\11\36J" \
+ "\377\234\26*S\377\2\25)R\377o{\224\377\240\377\377\377\377\2\253\263" \
+ "\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377" \
+ "\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244" \
+ "\377\377\377\377\1\20$N\377\232\26*S\377\1\236\246\267\377\245\377\377" \
+ "\377\377\2Tb\200\377\23(Q\377\205\26*S\377\2\25*S\377<Mo\377\243\377" \
+ "\377\377\377\2\353\355\360\377\10\35I\377\234\26*S\377\2\25)R\377o{\224" \
+ "\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347" \
+ "\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\232" \
+ "\26*S\377\1\27+T\377\245\377\377\377\377\2\247\257\276\377\16\"M\377" \
+ "\205\26*S\377\2\25)S\377>Oq\377\243\377\377\377\377\2\361\363\365\377" \
+ "\10\35H\377\234\26*S\377\2\25)R\377o{\224\377\240\377\377\377\377\2\253" \
+ "\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377" \
+ "\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377" \
+ "\244\377\377\377\377\1\20$N\377\232\26*S\377\2\21&O\377t\200\231\377" \
+ "\244\377\377\377\377\2\365\366\367\377\11\36J\377\206\26*S\377\1\37""2" \
+ "Z\377\244\377\377\377\377\1\6\33G\377\234\26*S\377\2\25)R\377nz\224\377" \
+ "\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \
+ "\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377" \
+ "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\233\26" \
+ "*S\377\2/Ae\377\370\370\371\377\244\377\377\377\377\1\"5\\\377\206\26" \
+ "*S\377\1\33/W\377\244\377\377\377\377\1\16#M\377\234\26*S\377\2\24)R" \
+ "\377\204\217\244\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221" \
+ "\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22" \
+ "&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \
+ "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \
+ "\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377" \
+ "\1\20$N\377\233\26*S\377\2\36""1Y\377\351\353\357\377\244\377\377\377" \
+ "\377\1EUv\377\206\26*S\377\1\4\32F\377\244\377\377\377\377\1!4[\377\234" \
+ "\26*S\377\2\24(R\377\224\235\260\377\240\377\377\377\377\2\253\263\302" \
+ "\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271" \
+ "\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377" \
+ "\377\377\377\1\20$N\377\233\26*S\377\2\22&P\377\331\334\343\377\244\377" \
+ "\377\377\377\1dq\215\377\206\26*S\377\2\10\35H\377\373\373\374\377\243" \
+ "\377\377\377\377\1:Kn\377\234\26*S\377\2\24(Q\377\253\262\301\377\240" \
+ "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355" \
+ "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\233\26*S\377" \
+ "\2\23'Q\377\261\267\305\377\244\377\377\377\377\1y\205\234\377\206\26" \
+ "*S\377\2\11\36I\377\357\360\363\377\243\377\377\377\377\1[i\205\377\234" \
+ "\26*S\377\2\23(Q\377\315\321\332\377\240\377\377\377\377\2\253\263\302" \
+ "\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271" \
+ "\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377" \
+ "\377\377\377\1\20$N\377\233\26*S\377\2\23(Q\377\231\242\263\377\244\377" \
+ "\377\377\377\1\216\227\253\377\206\26*S\377\2\13\40K\377\333\336\344" \
+ "\377\243\377\377\377\377\1~\211\240\377\234\26*S\377\2\27+T\377\334\337" \
+ "\345\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \
+ "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \
+ "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \
+ "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \
+ "\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377" \
+ "\233\26*S\377\2\24(Q\377\223\234\260\377\244\377\377\377\377\2\237\247" \
+ "\270\377\25)R\377\205\26*S\377\2\16\"M\377\273\301\315\377\243\377\377" \
+ "\377\377\1\251\261\300\377\234\26*S\377\2\36""1Y\377\346\350\354\377" \
+ "\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \
+ "\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377" \
+ "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\233\26" \
+ "*S\377\2\23'Q\377\257\266\304\377\244\377\377\377\377\2\244\253\274\377" \
+ "\25)R\377\205\26*S\377\2\20%O\377\241\251\272\377\243\377\377\377\377" \
+ "\2\310\314\326\377\25)R\377\233\26*S\377\2&9_\377\362\363\366\377\240" \
+ "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355" \
+ "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\233\26*S\377" \
+ "\2\23'P\377\317\323\333\377\244\377\377\377\377\2\244\253\274\377\25" \
+ ")R\377\205\26*S\377\2\23'Q\377\210\222\247\377\243\377\377\377\377\2" \
+ "\361\362\365\377\24(Q\377\233\26*S\377\1""0Bf\377\241\377\377\377\377" \
+ "\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377" \
+ "\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377" \
+ "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \
+ "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \
+ ",U\377\244\377\377\377\377\1\20$N\377\233\26*S\377\2\31-U\377\346\350" \
+ "\354\377\244\377\377\377\377\2\244\253\274\377\25)R\377\206\26*S\377" \
+ "\1cp\214\377\244\377\377\377\377\2""7Hk\377\25)R\377\231\26*S\377\2\22" \
+ "'P\377er\214\377\241\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \
+ "*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \
+ "\377\233\26*S\377\2&9_\377\361\363\365\377\244\377\377\377\377\2\244" \
+ "\254\274\377\25)R\377\206\26*S\377\2O^}\377\376\376\377\377\243\377\377" \
+ "\377\377\2\245\255\275\377\17$N\377\231\26*S\377\2\12\37J\377\306\313" \
+ "\325\377\241\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \
+ "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \
+ "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \
+ "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \
+ "\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377" \
+ "\232\26*S\377\2\25)S\377AQs\377\245\377\377\377\377\1\233\244\265\377" \
+ "\207\26*S\377\2<Mo\377\376\376\376\377\243\377\377\377\377\2\376\376" \
+ "\376\377\32.V\377\231\26*S\377\1\30,U\377\242\377\377\377\377\2\253\263" \
+ "\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377" \
+ "\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244" \
+ "\377\377\377\377\1\20$N\377\232\26*S\377\2\11\36I\377\277\304\320\377" \
+ "\245\377\377\377\377\1\212\224\251\377\207\26*S\377\2$7^\377\375\375" \
+ "\376\377\244\377\377\377\377\1Tb\201\377\231\26*S\377\1iv\220\377\242" \
+ "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355" \
+ "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\232\26*S\377" \
+ "\1BSt\377\246\377\377\377\377\1y\204\234\377\207\26*S\377\2\16\"M\377" \
+ "\364\365\367\377\244\377\377\377\377\2\277\304\320\377\14!L\377\227\26" \
+ "*S\377\2\24(Q\377\272\300\314\377\242\377\377\377\377\2\253\263\302\377" \
+ "\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277" \
+ "\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \
+ "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \
+ "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377" \
+ "\377\377\1\20$N\377\231\26*S\377\2\22&P\377\315\321\332\377\246\377\377" \
+ "\377\377\1]k\210\377\207\26*S\377\2\17$N\377\267\275\312\377\245\377" \
+ "\377\377\377\2O^}\377\25)R\377\225\26*S\377\2\25)S\377\40""3Z\377\243" \
+ "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355" \
+ "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\230\26*S\377" \
+ "\2\23(Q\377\245\255\275\377\247\377\377\377\377\1>Nq\377\207\26*S\377" \
+ "\2\22'P\377gt\217\377\245\377\377\377\377\2\340\342\350\377\27+T\377" \
+ "\225\26*S\377\2\22&P\377\313\317\330\377\243\377\377\377\377\2\253\263" \
+ "\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377" \
+ "\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244" \
+ "\377\377\377\377\1\20$N\377\227\26*S\377\2\27+T\377\230\240\263\377\250" \
+ "\377\377\377\377\1\33/W\377\210\26*S\377\1\35""0X\377\246\377\377\377" \
+ "\377\2\207\221\247\377\21&O\377\223\26*S\377\3\25)R\377Tc\201\377\376" \
+ "\376\376\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S" \
+ "\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \
+ "\377\225\26*S\377\3\14!L\3778Jl\377\327\332\341\377\250\377\377\377\377" \
+ "\2\347\352\355\377\10\36I\377\210\26*S\377\2\24(R\377\345\350\354\377" \
+ "\246\377\377\377\377\2t\200\230\377\23'Q\377\221\26*S\377\3\25)R\377" \
+ "\77Oq\377\373\373\374\377\244\377\377\377\377\2\253\263\302\377\17#N" \
+ "\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313" \
+ "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377" \
+ "\377\1\20$N\377\220\26*S\377\6\25)R\377\23'Q\377\17#N\377\35""0X\377" \
+ "GWx\377\254\264\302\377\252\377\377\377\377\2\221\232\256\377\17$N\377" \
+ "\210\26*S\377\2\25*S\377\276\304\317\377\247\377\377\377\377\2iv\220" \
+ "\377\22'P\377\217\26*S\377\4\21%O\377DTu\377\366\367\371\377\376\376" \
+ "\376\377\244\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \
+ "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \
+ "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \
+ "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \
+ "\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\15\"L\377" \
+ "\214\23(Q\377\202\23'Q\377\7\22&P\377\21%O\377+=c\377fs\216\377\277\305" \
+ "\320\377\375\375\375\377\376\376\376\377\253\377\377\377\377\2=Np\377" \
+ "\25)R\377\211\26*S\377\1\207\221\246\377\250\377\377\377\377\2\263\272" \
+ "\307\377\17#N\377\215\26*S\377\3\20$N\377\220\231\255\377\376\376\376" \
+ "\377\246\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347" \
+ "\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\323\327\337\377" \
+ "\214\324\330\337\377\4\330\334\342\377\342\345\352\377\360\361\364\377" \
+ "\375\375\376\377\257\377\377\377\377\2\357\360\363\377\"5\\\377\212\26" \
+ "*S\377\1=Np\377\251\377\377\377\377\17\360\361\364\377\220\231\255\377" \
+ "5Fj\377\7\34H\377\15\"M\377\21&O\377\23'Q\377\22'P\377\22&P\377\17#N" \
+ "\377\13\40K\377\14!L\377DTu\377\226\237\262\377\353\355\360\377\250\377" \
+ "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377" \
+ "\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26" \
+ "*S\377\1\30,U\377\344\377\377\377\377\2\322\326\336\377\27+T\377\212" \
+ "\26*S\377\2\7\35H\377\374\374\375\377\253\377\377\377\377\10\350\352" \
+ "\356\377\247\257\276\377v\202\232\377\\j\207\377dr\215\377q}\226\377" \
+ "\225\235\260\377\307\314\326\377\254\377\377\377\377\2\253\263\302\377" \
+ "\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277" \
+ "\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \
+ "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \
+ "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\344\377\377" \
+ "\377\377\2jw\221\377\25)R\377\212\26*S\377\2\17$N\377\223\234\257\377" \
+ "\337\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \
+ "\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377" \
+ "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\221\26*S\377\1\30,U\377\343\377\377\377\377\2\370\371\372\377" \
+ "\15\"M\377\214\26*S\377\2""7Il\377\376\376\376\377\336\377\377\377\377" \
+ "\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377" \
+ "\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377" \
+ "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \
+ "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \
+ ",U\377\343\377\377\377\377\2\203\215\243\377\23'Q\377\214\26*S\377\2" \
+ "\37""2Z\377\353\354\360\377\336\377\377\377\377\2\253\263\302\377\17" \
+ "#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313" \
+ "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\343\377\377\377" \
+ "\377\1""0Bf\377\215\26*S\377\2\23'Q\377\247\256\276\377\336\377\377\377" \
+ "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377" \
+ "\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \
+ "\1\30,U\377\342\377\377\377\377\2\245\255\275\377\16#M\377\216\26*S\377" \
+ "\1\"4[\377\336\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \
+ "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \
+ "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \
+ "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \
+ "\377\20$N\377\221\26*S\377\1\30,U\377\341\377\377\377\377\2\352\354\360" \
+ "\377\30,T\377\217\26*S\377\2\20$N\377\267\275\312\377\335\377\377\377" \
+ "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377" \
+ "\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \
+ "\1\30,U\377\341\377\377\377\377\1v\202\231\377\221\26*S\377\1Ud\202\377" \
+ "\335\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \
+ "\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377" \
+ "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\221\26*S\377\1\30,U\377\340\377\377\377\377\2\305\312\324\377" \
+ "\11\36I\377\221\26*S\377\2\20$N\377\356\357\363\377\334\377\377\377\377" \
+ "\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377" \
+ "\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377" \
+ "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \
+ "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \
+ ",U\377\336\377\377\377\377\3\376\376\377\377\367\370\371\377':`\377\222" \
+ "\26*S\377\2\23(Q\377IYy\377\334\377\377\377\377\2\253\263\302\377\17" \
+ "#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313" \
+ "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\337\377\377\377" \
+ "\377\2N]}\377\24(Q\377\224\26*S\377\1\320\324\335\377\333\377\377\377" \
+ "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377" \
+ "\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \
+ "\1\30,U\377\336\377\377\377\377\2mz\223\377\25)R\377\225\26*S\377\1T" \
+ "c\201\377\333\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \
+ "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \
+ "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \
+ "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \
+ "\377\20$N\377\221\26*S\377\1\30,U\377\335\377\377\377\377\2\200\213\241" \
+ "\377\21%O\377\226\26*S\377\2\12\37J\377\264\272\307\377\332\377\377\377" \
+ "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377" \
+ "\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \
+ "\1\30,U\377\334\377\377\377\377\2\233\244\265\377\25)R\377\230\26*S\377" \
+ "\2+=c\377\366\367\370\377\265\377\377\377\377\2\373\373\374\377\355\356" \
+ "\361\377\242\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \
+ "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \
+ "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \
+ "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \
+ "\377\20$N\377\221\26*S\377\1\30,U\377\333\377\377\377\377\2o|\225\377" \
+ "\23'Q\377\231\26*S\377\2\23(Q\377p}\226\377\265\377\377\377\377\3We\203" \
+ "\377\30,T\377\245\255\275\377\241\377\377\377\377\2\253\263\302\377\17" \
+ "#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313" \
+ "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\331\377\377\377" \
+ "\377\3\370\370\372\377ly\222\377\21%O\377\233\26*S\377\2\15!L\377\264" \
+ "\272\310\377\263\377\377\377\377\5\300\305\320\377\25*S\377\26*S\377" \
+ "\"5\\\377\366\366\370\377\240\377\377\377\377\2\253\263\302\377\17#N" \
+ "\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\276\313" \
+ "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\330\377\377\377" \
+ "\377\2\371\371\372\3774Ei\377\236\26*S\377\2\35""1Y\377\373\373\374\377" \
+ "\261\377\377\377\377\2\367\370\371\377\25*R\377\202\26*S\377\2\24(R\377" \
+ "\214\226\252\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \
+ "*S\377\1\347\351\355\377\207\377\377\377\377\2\304\311\323\377\21%O\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\221\26*S\377\1\30,U\377\327\377\377\377\377\3\241\252" \
+ "\272\377\34""0X\377\24(Q\377\236\26*S\377\4\24(Q\3776Gk\377\370\371\372" \
+ "\377\376\377\377\377\257\377\377\377\377\2DTu\377\24(R\377\203\26*S\377" \
+ "\2\20%O\377\333\337\345\377\237\377\377\377\377\2\253\263\302\377\17" \
+ "#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\313\320\331" \
+ "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\325\377\377\377" \
+ "\377\3\347\351\355\377Q`~\377\15\"M\377\241\26*S\377\2\25)R\377Zh\205" \
+ "\377\257\377\377\377\377\2r~\227\377\21%O\377\205\26*S\377\1Tb\201\377" \
+ "\237\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \
+ "\355\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377" \
+ "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\221\26*S\377\1\30,U\377\324\377\377\377\377\3\202\215\243\377" \
+ "\37""2Y\377\25)R\377\243\26*S\377\2\24(Q\377Tc\201\377\255\377\377\377" \
+ "\377\2\205\217\245\377\24(R\377\206\26*S\377\2\20%O\377\317\322\333\377" \
+ "\236\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \
+ "\355\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377" \
+ "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\221\26*S\377\1\30,U\377\321\377\377\377\377\4\375\375\375\377" \
+ "\244\254\274\377.Ae\377\16#M\377\246\26*S\377\3\20%O\377`n\212\377\375" \
+ "\375\375\377\252\377\377\377\377\2\207\221\246\377\15!L\377\210\26*S" \
+ "\377\2\40""3Z\377\370\371\372\377\235\377\377\377\377\2\253\263\302\377" \
+ "\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\313\317" \
+ "\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \
+ "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \
+ "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\317\377\377" \
+ "\377\377\4\374\374\375\377\252\262\300\377\37""2Z\377\25)R\377\252\26" \
+ "*S\377\1GWw\377\251\377\377\377\377\2z\206\235\377\25)R\377\212\26*S" \
+ "\377\1\232\243\264\377\235\377\377\377\377\2\253\263\302\377\17#N\377" \
+ "\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\313\317\330\377" \
+ "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\315\377\377\377\377" \
+ "\5\335\340\346\377fs\216\377*<b\377\21%O\377\25*S\377\253\26*S\377\3" \
+ "\23'P\377/@e\377\331\334\343\377\245\377\377\377\377\3\374\374\375\377" \
+ "HXx\377\20%O\377\213\26*S\377\2\25)R\377\365\366\370\377\234\377\377" \
+ "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207" \
+ "\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \
+ "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \
+ "\377\1\30,U\377\311\377\377\377\377\6\373\374\375\377\334\337\345\377" \
+ "\247\257\276\377:Km\377\10\35I\377\24(R\377\260\26*S\377\3\11\36I\377" \
+ "\224\235\260\377\374\374\375\377\242\377\377\377\377\3\300\305\320\377" \
+ "\32.V\377\24(R\377\214\26*S\377\2\24(R\377Sb\200\377\234\377\377\377" \
+ "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\356\377\207\377" \
+ "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \
+ "\1\30,U\377\307\377\377\377\377\4\316\322\333\377gt\216\377\"5\\\377" \
+ "\32-V\377\266\26*S\377\2#6\\\377\321\325\335\377\237\377\377\377\377" \
+ "\2\372\373\373\377HXx\377\220\26*S\377\2\27+T\377\335\340\346\377\233" \
+ "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\333\336\344" \
+ "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\221\26*S\377\1\30,U\377\301\377\377\377\377\10\351\353\357\377\276\304" \
+ "\317\377\230\241\263\377mz\223\377DTu\377\33.W\377\13\40K\377\22&P\377" \
+ "\271\26*S\377\3\15\"M\377\\j\207\377\305\312\324\377\233\377\377\377" \
+ "\377\4\342\345\351\377{\206\236\377\33.V\377\23(Q\377\220\26*S\377\2" \
+ "\25)R\3770Bf\377\233\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \
+ "*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\221\26*S\377\2\30,T\377\362\363\365\377\264\360\361" \
+ "\364\377\17\356\357\362\377\355\357\362\377\355\356\362\377\351\353\357" \
+ "\377\350\352\356\377\334\337\345\377\306\313\324\377\253\261\300\377" \
+ "\203\217\244\377[h\205\3770Bf\377\10\35I\377\14!L\377\20%O\377\24(Q\377" \
+ "\300\26*S\377\4\17$N\3779Jl\377\304\311\324\377\364\365\367\377\225\377" \
+ "\377\377\377\5\365\366\370\377\336\341\347\377^l\211\377\15\"M\377\25" \
+ ")R\377\223\26*S\377\2\23'Q\377\222\234\257\377\231\360\361\364\377\3" \
+ "\363\364\366\377\242\252\272\377\17$N\377\221\26*S\377\1\332\336\344" \
+ "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\222\26*S\377\265#6\\\377\1\37""2Z\377\202\36""1Y\377\10\27+T\377\26" \
+ "*S\377\21&O\377\22&P\377\22'P\377\23(Q\377\24(R\377\25)R\377\305\26*" \
+ "S\377\6\25)R\377\22'P\377'9_\377EUv\377\233\243\265\377\362\363\365\377" \
+ "\217\377\377\377\377\4\373\373\374\377\250\260\277\377Sb\200\377,>c\377" \
+ "\202\24(R\377\226\26*S\377\1\32-V\377\232#6\\\377\1\36""2Y\377\222\26" \
+ "*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\233\26*S\377\11\25)S\377\17#N\377\6\33" \
+ "G\377&9_\377Xf\204\377\201\214\242\377\236\246\267\377\265\274\311\377" \
+ "\274\301\315\377\203\305\312\324\377\11\274\302\316\377\262\271\306\377" \
+ "\236\246\267\377\200\213\242\377Yg\205\377,>c\377\4\32F\377\15\"M\377" \
+ "\24)R\377\307\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317" \
+ "\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \
+ "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \
+ "\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336" \
+ "\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377" \
+ "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377" \
+ "\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377" \
+ "\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207" \
+ "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \
+ "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \
+ "\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377" \
+ "\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377" \
+ "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \
+ "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367" \
+ "\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20" \
+ "%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \
+ "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \
+ "\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \
+ "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330" \
+ "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \
+ "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313" \
+ "\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \
+ "\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \
+ "\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \
+ "S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377" \
+ "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377" \
+ "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \
+ "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330" \
+ "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \
+ "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313" \
+ "\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \
+ "\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \
+ "\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \
+ "S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377" \
+ "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377" \
+ "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \
+ "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330" \
+ "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \
+ "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313" \
+ "\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \
+ "\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \
+ "\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \
+ "S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377" \
+ "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377" \
+ "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \
+ "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330" \
+ "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \
+ "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313" \
+ "\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \
+ "\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \
+ "\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \
+ "S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377" \
+ "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377" \
+ "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \
+ "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330" \
+ "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \
+ "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313" \
+ "\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \
+ "\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \
+ "\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \
+ "S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377" \
+ "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377" \
+ "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \
+ "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330" \
+ "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \
+ "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313" \
+ "\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \
+ "\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \
+ "\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \
+ "S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377" \
+ "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377" \
+ "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \
+ "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\312\317\330" \
+ "\377\21%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \
+ "\377\207\377\377\377\377\2\333\336\344\377\17$N\377\207\26*S\377\1\31" \
+ ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\334" \
+ "\340\346\377\17$N\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \
+ "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \
+ "\336\344\377\207\377\377\377\377\2\334\340\346\377\17$N\377\207\26*S" \
+ "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \
+ "\377\2\334\340\346\377\17$N\377\207\26*S\377\1\31,U\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \
+ "S\377\1\333\336\344\377\207\377\377\377\377\2\334\340\346\377\17$N\377" \
+ "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\321\325\335\377\207\377" \
+ "\377\377\377\2\334\340\346\377\17$N\377\207\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\367\26*S\377\1\333\336\344\377\207\377\377\377\377\2\330\334\342\377" \
+ "\17$N\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\345\347\354\377" \
+ "\207\377\377\377\377\2\306\313\324\377\21%O\377\207\26*S\377\1\31,U\377" \
+ "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\367\26*S\377\1\356\360\363\377\207\377\377\377\377\2\265\273\310" \
+ "\377\22'P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\210\377\377" \
+ "\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377" \
+ "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \
+ "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\365" \
+ "\26*S\377\2\24)R\3779Jm\377\210\377\377\377\377\2\220\231\255\377\25" \
+ ")S\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \
+ "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \
+ "\214\225\251\377\20$N\377\377\26*S\377\365\26*S\377\2\22&P\377u\201\231" \
+ "\377\210\377\377\377\377\1ly\223\377\210\26*S\377\1\31,U\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\365\26*S\377\2\17#N\377\263\272\307\377\210\377\377\377\377\1O_}\377" \
+ "\210\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \
+ "\251\377\20$N\377\377\26*S\377\365\26*S\377\2\23'Q\377\366\367\370\377" \
+ "\210\377\377\377\377\1*<a\377\210\26*S\377\1\27+T\377\212\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\365\26*" \
+ "S\377\1:Jm\377\211\377\377\377\377\1\15\"M\377\207\26*S\377\2\25)R\377" \
+ "-\77d\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2" \
+ "4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\365\26*S\377\1cp\214\377\210\377\377\377\377\2\262\271" \
+ "\307\377\15\"L\377\207\26*S\377\2\25)R\3777Hk\377\212\377\377\377\0\2" \
+ "\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \
+ "\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\364\26*S\377" \
+ "\2\17$N\377\253\262\301\377\210\377\377\377\377\2O^}\377\23(Q\377\207" \
+ "\26*S\377\2\24(Q\377JYy\377\212\377\377\377\0\2\217\230\254\377\20$N" \
+ "\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214" \
+ "\225\251\377\20$N\377\377\26*S\377\364\26*S\377\1\22&P\377\210\377\377" \
+ "\377\377\2\366\367\370\377!4[\377\210\26*S\377\2\22&P\377my\222\377\212" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \
+ "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S" \
+ "\377\363\26*S\377\2\24(R\377\207\222\247\377\210\377\377\377\377\2\334" \
+ "\337\345\377\32.V\377\210\26*S\377\2\20%O\377\217\231\254\377\212\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\363\26*S\377\2\32.V\377\343\345\352\377\210\377\377\377\377\2\244\253" \
+ "\273\377\25)R\377\210\26*S\377\2\16\"M\377\300\306\320\377\212\377\377" \
+ "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \
+ "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\362" \
+ "\26*S\377\2\25)R\377BRt\377\211\377\377\377\377\1);a\377\211\26*S\377" \
+ "\1\13\40K\377\213\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\377\26*S\377\362\26*S\377\2\16#M\377\336\341\347\377\210\377\377" \
+ "\377\377\2\303\310\322\377\13\40K\377\211\26*S\377\1#6]\377\213\377\377" \
+ "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \
+ "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\362" \
+ "\26*S\377\1cq\214\377\211\377\377\377\377\2Yg\205\377\25)S\377\211\26" \
+ "*S\377\1DTu\377\213\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \
+ "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\361\26*S\377\2\14!L\377\327\333\342\377\210\377" \
+ "\377\377\377\2\375\374\375\377#6]\377\212\26*S\377\1jw\221\377\213\377" \
+ "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \
+ "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \
+ "\360\26*S\377\2\22'P\377\205\217\244\377\211\377\377\377\377\2\210\223" \
+ "\250\377\21%O\377\211\26*S\377\2\21%O\377\246\255\275\377\213\377\377" \
+ "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \
+ "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\360" \
+ "\26*S\377\2""7Hk\377\373\374\374\377\210\377\377\377\377\2\351\354\357" \
+ "\377\24(R\377\212\26*S\377\1\10\35I\377\214\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\214\225\251\377\20$N\377\377\26*S\377\357\26*S\377\2\17$N\377" \
+ "\312\317\330\377\211\377\377\377\377\1\202\215\243\377\212\26*S\377\2" \
+ "\25)R\377DTu\377\214\377\377\377\0\2\217\230\254\377\20$N\377\207\26" \
+ "*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \
+ "\20$N\377\377\26*S\377\357\26*S\377\1\255\265\303\377\212\377\377\377" \
+ "\377\1\23'Q\377\212\26*S\377\2\24(Q\377\264\272\307\377\214\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\355\26*" \
+ "S\377\2\20$N\377fs\215\377\212\377\377\377\377\2JZy\377\24(Q\377\212" \
+ "\26*S\377\2!4[\377\377\377\377f\214\377\377\377\0\2\217\230\254\377\20" \
+ "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \
+ "\214\225\251\377\20$N\377\377\26*S\377\354\26*S\377\2\24(Q\377FVv\377" \
+ "\212\377\377\377\377\1\303\310\322\377\213\26*S\377\2\25)R\377GWw\377" \
+ "\215\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \
+ "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \
+ "*S\377\353\26*S\377\2\25)R\3778Jl\377\213\377\377\377\377\1\24(R\377" \
+ "\213\26*S\377\2\11\36I\377\330\334\343\377\215\377\377\377\0\2\217\230" \
+ "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \
+ "\377\377\2\214\225\251\377\20$N\377\377\26*S\377\352\26*S\377\3\23'Q" \
+ "\3776Gk\377\370\370\372\377\212\377\377\377\377\2cq\214\377\24)R\377" \
+ "\213\26*S\377\1IYy\377\216\377\377\377\0\2\217\230\254\377\20$N\377\207" \
+ "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \
+ "\377\20$N\377\377\26*S\377\351\26*S\377\2\25)R\377@Qr\377\213\377\377" \
+ "\377\377\2\257\265\303\377\16#M\377\213\26*S\377\2\25)R\377\274\302\315" \
+ "\377\216\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4F" \
+ "i\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\350\26*S\377\3\15\"L\377ly\223\377\375\375\375\377\212" \
+ "\377\377\377\377\1\316\322\332\377\214\26*S\377\2\25)R\377.Ae\377\217" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \
+ "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S" \
+ "\377\346\26*S\377\202\25)R\377\1\213\225\251\377\213\377\377\377\377" \
+ "\2\362\363\366\377(:a\377\214\26*S\377\2\25)R\377\336\340\346\377\217" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \
+ "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S" \
+ "\377\346\26*S\377\2#6\\\377\342\344\351\377\213\377\377\377\377\2\370" \
+ "\371\372\3774Fi\377\214\26*S\377\2\25*S\377Yg\205\377\220\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\343\26*" \
+ "S\377\4\25)R\377\11\36I\377y\204\234\377\365\366\370\377\213\377\377" \
+ "\377\377\3\374\374\374\377\77Pq\377\24(Q\377\215\26*S\377\221\377\377" \
+ "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \
+ "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\342" \
+ "\26*S\377\3\24(R\377=Np\377\333\337\345\377\214\377\377\377\377\2\373" \
+ "\374\374\377Q`\177\377\216\26*S\377\1\270\276\312\377\221\377\377\377" \
+ "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \
+ "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\340\26*" \
+ "S\377\4\20%O\377\40""3Z\377\306\313\325\377\374\374\375\377\214\377\377" \
+ "\377\377\3\374\374\375\377=Np\377\24(Q\377\214\26*S\377\2\23'Q\377M]" \
+ "|\377\222\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \
+ "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \
+ "\377\26*S\377\335\26*S\377\4\22&P\377\17#M\377P_~\377\260\266\304\377" \
+ "\216\377\377\377\377\3\347\351\355\377\77Oq\377\25)R\377\215\26*S\377" \
+ "\1""2Dh\377\223\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \
+ "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \
+ "$N\377\377\26*S\377\333\26*S\377\4\27+T\377\35""0X\377dr\215\377\346" \
+ "\351\355\377\217\377\377\377\377\2\343\345\352\377\40""4[\377\216\26" \
+ "*S\377\2\23(Q\377\322\326\336\377\223\377\377\377\0\2\217\230\254\377" \
+ "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \
+ "\2\214\225\251\377\20$N\377\377\26*S\377\326\26*S\377\7\23'Q\377\15\"" \
+ "M\377\6\33G\3777Hk\377\201\214\242\377\312\317\330\377\365\366\370\377" \
+ "\220\377\377\377\377\3\246\256\276\377\33.V\377\25)R\377\215\26*S\377" \
+ "\2\25)R\377\277\305\320\377\224\377\377\377\0\2\217\230\254\377\20$N" \
+ "\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\210" \
+ "\222\247\377\11\36I\377\377\17$N\377\320\17$N\377\11\24(Q\377\32-V\377" \
+ "\40""3Z\377-\77d\377<Mo\377IYy\377n{\224\377\260\267\305\377\375\375" \
+ "\375\377\222\377\377\377\377\3\362\363\365\377iu\220\377\11\36J\377\216" \
+ "\26*S\377\2\21%O\377\212\223\250\377\225\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \
+ "\377\2\370\370\372\377\360\362\364\377\377\361\362\364\377\320\361\362" \
+ "\364\377\5\362\363\365\377\363\364\366\377\365\366\367\377\370\370\372" \
+ "\377\374\374\374\377\225\377\377\377\377\2\315\322\332\377\35""0X\377" \
+ "\217\26*S\377\2\25)S\377\234\244\266\377\226\377\377\377\0\2\217\230" \
+ "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\377\377\377" \
+ "\377\377\361\377\377\377\377\3\353\355\361\377p|\225\377\22'P\377\217" \
+ "\26*S\377\2\17$N\377\216\230\254\377\227\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\377\377\377\377" \
+ "\377\357\377\377\377\377\3\371\371\372\377\240\250\271\377\16#M\377\221" \
+ "\26*S\377\1\212\224\250\377\230\377\377\377\0\2\217\230\254\377\20$N" \
+ "\377\207\26*S\377\2""4Fi\377\371\372\373\377\377\377\377\377\377\356" \
+ "\377\377\377\377\3\234\244\266\377.@e\377\23'Q\377\220\26*S\377\2\24" \
+ "(Q\377\272\300\314\377\231\377\377\377\0\2\217\230\254\377\20$N\377\207" \
+ "\26*S\377\2""4Fi\377\371\372\373\377\377\377\377\377\377\353\377\377" \
+ "\377\377\4\351\353\357\377\236\246\267\377#5]\377\15\"M\377\220\26*S" \
+ "\377\3\25)R\377);a\377\300\305\321\377\232\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\377\377\377\377" \
+ "\377\351\377\377\377\377\3\344\346\353\377_l\210\377\30,T\377\222\26" \
+ "*S\377\2\24)R\377.Ae\377\234\377\377\377\0\2\217\230\254\377\20$N\377" \
+ "\207\26*S\377\2""4Fi\377\371\372\373\377\377\377\377\377\377\346\377" \
+ "\377\377\377\5\305\312\324\377u\201\231\3774Fi\377\16#M\377\23'P\377" \
+ "\221\26*S\377\3\25)S\377\12\37J\377\220\232\255\377\235\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\377" \
+ "\377\377\377\377\340\377\377\377\377\10\372\372\373\377\360\361\364\377" \
+ "\340\343\350\377\251\260\277\377Wf\203\377\15!L\377\16\"M\377\25)R\377" \
+ "\223\26*S\377\3\24(Q\3775Fj\377\334\340\345\377\236\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\207\26*S\377\1""6Gk\377\377\377\377\377\377\333" \
+ "\377\377\377\377\13\362\363\365\377\334\336\345\377\313\320\331\377\236" \
+ "\247\270\377my\223\377:Kn\377.@d\377%8^\377\30,U\377\24(Q\377\25)R\377" \
+ "\224\26*S\377\3\25)R\377\14!L\377\243\253\273\377\240\377\377\377\0\2" \
+ "\217\230\254\377\20$N\377\207\26*S\377\2\24(Q\377\6\34G\377\377\6\33" \
+ "G\377\332\6\33G\377\5\10\35I\377\12\37J\377\13\40K\377\16#M\377\22&P" \
+ "\377\230\26*S\377\3\23'Q\377\25)R\377o{\224\377\242\377\377\377\0\2\217" \
+ "\230\254\377\20$N\377\377\26*S\377\377\26*S\377\2\26*S\377P_}\377\244" \
+ "\377\377\377\0\2\217\230\254\377\20$N\377\377\26*S\377\374\26*S\377\4" \
+ "\16#M\377\27+T\377\214\226\252\377\341\343\351\377\245\377\377\377\0" \
+ "\2\217\230\254\377\20$N\377\377\26*S\377\370\26*S\377\5\25)R\377\21%" \
+ "O\377\36""1Y\377BSt\377\237\247\270\377\250\377\377\377\0\2\217\230\254" \
+ "\377\20$N\377\377\26*S\377\366\26*S\377\4\23'Q\377\14\40K\377>Np\377" \
+ "\261\271\306\377\253\377\377\377\0\2\217\230\254\377\20$N\377\377\26" \
+ "*S\377\356\26*S\377\11\25)R\377\23'Q\377\20$N\377\14!L\377\11\36J\377" \
+ "&8^\377We\203\377\202\215\243\377\267\275\311\377\256\377\377\377\0\2" \
+ "\224\235\260\377\33/W\377\377!4[\377\353!4[\377\7\"5\\\377$7]\377&9_" \
+ "\3776Gk\377Zh\205\377\212\224\251\377\304\311\323\377\377\377\377\377" \
+ "\0\377\377\377\377\0\377\377\377\377\0\377\377\377\377\0\377\377\377" \
+ "\377\0\377\377\377\377\0\377\377\377\377\0\377\377\377\377\0\377\377" \
+ "\377\377\0\377\377\377\377\0\377\377\377\377\0\370\377\377\377\0")
+
+
diff --git a/bsp/meta-boundary/recipes-core/psplash/psplash_git.bbappend b/bsp/meta-boundary/recipes-core/psplash/psplash_git.bbappend
new file mode 100644
index 00000000..80f4f74a
--- /dev/null
+++ b/bsp/meta-boundary/recipes-core/psplash/psplash_git.bbappend
@@ -0,0 +1,3 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+SPLASH_IMAGES = "file://boundary-logo-img.h;outsuffix=default"
diff --git a/bsp/meta-boundary/recipes-graphics/xinput-calibrator/xinput-calibrator_git.bbappend b/bsp/meta-boundary/recipes-graphics/xinput-calibrator/xinput-calibrator_git.bbappend
new file mode 100644
index 00000000..46fbab94
--- /dev/null
+++ b/bsp/meta-boundary/recipes-graphics/xinput-calibrator/xinput-calibrator_git.bbappend
@@ -0,0 +1,8 @@
+# Remove xinput_calibrator autostart. Our displays are already calibrated.
+# Leaves binary in place in case they want to run it anyway manually
+
+do_install_append(){
+ rm -rf ${D}${sysconfdir}/
+}
+
+FILES_${PN}_remove += "${sysconfdir}/xdg/autostart"
diff --git a/bsp/meta-boundary/recipes-kernel/kernel-iio/kernel-iio.bb b/bsp/meta-boundary/recipes-kernel/kernel-iio/kernel-iio.bb
new file mode 100644
index 00000000..9124f1cb
--- /dev/null
+++ b/bsp/meta-boundary/recipes-kernel/kernel-iio/kernel-iio.bb
@@ -0,0 +1,51 @@
+SUMMARY = "IIO tools for Linux"
+DESCRIPTION = "Tools to monitor and list Industrial I/O (IIO) devices."
+
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://COPYING;md5=d7810fab7487fb0aad327b76f1be7cd7"
+
+inherit linux-kernel-base kernel-arch kernelsrc
+
+do_configure[depends] += "virtual/kernel:do_shared_workdir"
+do_populate_lic[depends] += "virtual/kernel:do_patch"
+
+B = "${WORKDIR}/${BPN}-${PV}"
+SPDX_S = "${S}/tools/iio"
+
+EXTRA_OEMAKE = '\
+ -C ${S}/tools/iio \
+ O=${B} \
+ CROSS_COMPILE=${TARGET_PREFIX} \
+ ARCH=${ARCH} \
+ CC="${CC}" \
+ AR="${AR}" \
+ LD="${LD}" \
+ EXTRA_CFLAGS="-idirafter ${S}/include" \
+'
+
+EXTRA_OEMAKE += "\
+ 'INSTALL_ROOT=${D}' \
+ 'BINDIR=${bindir}' \
+"
+
+do_compile() {
+ # Linux kernel build system is expected to do the right thing
+ unset CFLAGS
+ oe_runmake all
+}
+
+do_install() {
+ # Linux kernel build system is expected to do the right thing
+ unset CFLAGS
+ oe_runmake install
+}
+
+do_configure_prepend () {
+ # Fix for rebuilding
+ rm -rf ${B}/
+ mkdir -p ${B}/
+}
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+FILES_${PN} += "${bindir}"
diff --git a/bsp/meta-boundary/recipes-kernel/kernel-modules/kernel-module-qcacld_git.bb b/bsp/meta-boundary/recipes-kernel/kernel-modules/kernel-module-qcacld_git.bb
new file mode 100644
index 00000000..add8e8a0
--- /dev/null
+++ b/bsp/meta-boundary/recipes-kernel/kernel-modules/kernel-module-qcacld_git.bb
@@ -0,0 +1,18 @@
+# Copyright (C) 2016 Boundary Devices
+SUMMARY = "QCACLD driver for QCA9377-based BD-SDMAC module"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://${S}/CORE/HDD/src/wlan_hdd_main.c;beginline=1;endline=20;md5=c191a07d6df8a17ee5b865137f729304"
+
+inherit module
+
+SRCREV = "${AUTOREV}"
+
+SRC_URI = "git://github.com/boundarydevices/qcacld-2.0.git;branch=${SRCBRANCH} \
+"
+SRCBRANCH = "boundary-LNX.LEH.4.2.2.2"
+
+S = "${WORKDIR}/git"
+
+EXTRA_OEMAKE_append = " CONFIG_CLD_HL_SDIO_CORE=y"
+
+COMPATIBLE_MACHINE = "mx6|mx7|mx8"
diff --git a/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-bdsdmac_git.bb b/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-bdsdmac_git.bb
new file mode 100644
index 00000000..07956080
--- /dev/null
+++ b/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-bdsdmac_git.bb
@@ -0,0 +1,35 @@
+SUMMARY = "WiFi and BT firmware files for BD-SDMAC module"
+SECTION = "kernel"
+
+LICENSE = "Firmware-qca"
+
+LIC_FILES_CHKSUM = "\
+ file://LICENSE.qca_firmware;md5=e8b1e9e8ce377ca5b2c1098e5690f470 \
+"
+
+SRCREV = "5e4b71211ecbb79e7693d2ee07361847f5a0cb40"
+
+SRC_URI = "git://github.com/boundarydevices/qca-firmware.git;branch=${SRCBRANCH}"
+SRCBRANCH = "bd-sdmac-qcacld"
+
+S = "${WORKDIR}/git"
+
+# 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-qca] = "LICENSE.qca_firmware"
+
+inherit allarch
+
+CLEANBROKEN = "1"
+
+do_compile() {
+ :
+}
+
+do_install() {
+ DESTDIR=${D} make install
+}
+
+FILES_${PN} += "/lib/firmware/* /lib/firmware/*/*"
+
+RDEPENDS_${PN} += "crda"
diff --git a/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-gslx680_1.0.bb b/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-gslx680_1.0.bb
new file mode 100644
index 00000000..219ac32d
--- /dev/null
+++ b/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-gslx680_1.0.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Firmware files for GSLx680 touch controllers"
+SECTION = "kernel"
+
+LICENSE = "\
+ GPLv2+ \
+"
+
+LIC_FILES_CHKSUM = "\
+ file://${WORKDIR}/LICENSE.GPLv2+.txt;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
+"
+
+SRC_URI_append = "\
+ http://linode.boundarydevices.com/gsl1680.fw;name=gsl1680 \
+ http://linode.boundarydevices.com/LICENSE.GPLv2+.txt;name=license \
+"
+
+SRC_URI[gsl1680.sha256sum] = "d0e85f5b601e58ef04dd016f99de89aebdc5e16c7b0173f45196f9593d43e854"
+SRC_URI[license.sha256sum] = "8177f97513213526df2cf6184d8ff986c675afb514d4e68a404010521b880643"
+
+inherit allarch update-alternatives
+
+CLEANBROKEN = "1"
+
+do_install() {
+ mkdir -p ${D}/lib/firmware/
+ install -m 0644 ${WORKDIR}/gsl1680.fw ${D}/lib/firmware/
+}
+
+FILES_${PN} += "/lib/firmware/*"
diff --git a/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware_git.bbappend b/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware_git.bbappend
new file mode 100644
index 00000000..fdb63989
--- /dev/null
+++ b/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware_git.bbappend
@@ -0,0 +1,16 @@
+# Support additional firmware for TiWi-BLE module
+# TIInit_7.6.15.bts is required for bluetooth support but this particular
+# version is not available in the linux-firmware repository.
+#
+SRC_URI_append = "\
+ https://git.ti.com/ti-bt/service-packs/blobs/raw/54f5c151dacc608b19ab2ce4c30e27a3983048b2/initscripts/TIInit_7.6.15.bts;name=TIInit_7.6.15 \
+"
+SRC_URI[TIInit_7.6.15.md5sum] = "3f84f0d782376363d0028fc4b2402ccb"
+SRC_URI[TIInit_7.6.15.sha256sum] = "e78156ad81446fdeb46da661290f763f3fe97d111526b2d19cd764a634268888"
+
+do_install_append() {
+ cp ${WORKDIR}/TIInit_7.6.15.bts ${D}/lib/firmware/ti-connectivity/
+}
+
+PACKAGE_ARCH_mx7 = "${MACHINE_ARCH}"
+PACKAGE_ARCH_mx6 = "${MACHINE_ARCH}"
diff --git a/bsp/meta-boundary/recipes-kernel/linux/files/arm64/defconfig b/bsp/meta-boundary/recipes-kernel/linux/files/arm64/defconfig
new file mode 100644
index 00000000..261e0cb1
--- /dev/null
+++ b/bsp/meta-boundary/recipes-kernel/linux/files/arm64/defconfig
@@ -0,0 +1,591 @@
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_NO_HZ_IDLE=y
+CONFIG_HIGH_RES_TIMERS=y
+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_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_MEMCG=y
+CONFIG_MEMCG_SWAP=y
+CONFIG_BLK_CGROUP=y
+CONFIG_CGROUP_PIDS=y
+CONFIG_CGROUP_HUGETLB=y
+CONFIG_CPUSETS=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_CGROUP_PERF=y
+CONFIG_USER_NS=y
+CONFIG_SCHED_AUTOGROUP=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_KALLSYMS_ALL=y
+# CONFIG_COMPAT_BRK is not set
+CONFIG_PROFILING=y
+CONFIG_JUMP_LABEL=y
+CONFIG_CC_STACKPROTECTOR_STRONG=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_IOSCHED_DEADLINE is not set
+CONFIG_ARCH_FSL_IMX8QM=y
+CONFIG_ARCH_FSL_IMX8QP=y
+CONFIG_ARCH_FSL_IMX8QXP=y
+CONFIG_ARCH_FSL_IMX8MQ=y
+CONFIG_ARCH_FSL_IMX8MM=y
+CONFIG_PCI=y
+CONFIG_PCI_IOV=y
+CONFIG_PCI_IMX6=y
+CONFIG_PCI_HOST_GENERIC=y
+CONFIG_PCI_HISI=y
+CONFIG_ARM64_VA_BITS_48=y
+CONFIG_SCHED_MC=y
+CONFIG_PREEMPT=y
+CONFIG_KSM=y
+CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
+CONFIG_TRANSPARENT_HUGEPAGE=y
+CONFIG_CMA=y
+CONFIG_SECCOMP=y
+CONFIG_KEXEC=y
+CONFIG_XEN=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_COMPAT=y
+CONFIG_PM_DEBUG=y
+CONFIG_PM_TEST_SUSPEND=y
+CONFIG_ARM_CPUIDLE=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
+CONFIG_CPU_FREQ_GOV_INTERACTIVE=y
+CONFIG_CPUFREQ_DT=y
+CONFIG_ARM_BIG_LITTLE_CPUFREQ=y
+CONFIG_ARM_IMX8_CPUFREQ=y
+CONFIG_ARM_IMX8MQ_CPUFREQ=y
+CONFIG_ARM_SCPI_CPUFREQ=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_SYN_COOKIES=y
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+CONFIG_IPV6_SIT=m
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_EVENTS=y
+CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
+CONFIG_NETFILTER_XT_TARGET_LOG=m
+CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+CONFIG_NETFILTER_XT_MATCH_IPVS=m
+CONFIG_IP_VS=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_NF_CONNTRACK_IPV6=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_IP6_NF_NAT=m
+CONFIG_IP6_NF_TARGET_MASQUERADE=m
+CONFIG_BRIDGE=m
+CONFIG_BRIDGE_VLAN_FILTERING=y
+CONFIG_VLAN_8021Q=m
+CONFIG_VLAN_8021Q_GVRP=y
+CONFIG_VLAN_8021Q_MVRP=y
+CONFIG_LLC2=y
+CONFIG_NET_SWITCHDEV=y
+CONFIG_BPF_JIT=y
+CONFIG_CAN=y
+CONFIG_CAN_FLEXCAN=y
+CONFIG_CAN_MCP251X=m
+CONFIG_BT=y
+CONFIG_BT_RFCOMM=y
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=y
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=y
+CONFIG_BT_LEDS=y
+CONFIG_BT_HCIUART=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_BCM=y
+CONFIG_BT_HCIUART_QCA=y
+CONFIG_BT_HCIVHCI=y
+CONFIG_CFG80211=y
+CONFIG_CFG80211_WEXT=y
+CONFIG_MAC80211=y
+CONFIG_MAC80211_LEDS=y
+CONFIG_RFKILL=y
+CONFIG_RFKILL_GPIO=y
+CONFIG_NET_9P=y
+CONFIG_NET_9P_VIRTIO=y
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set
+CONFIG_DMA_CMA=y
+CONFIG_CMA_SIZE_MBYTES=320
+CONFIG_VEXPRESS_CONFIG=y
+CONFIG_MTD=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_RAM=y
+CONFIG_MTD_DATAFLASH=y
+CONFIG_MTD_M25P80=y
+CONFIG_MTD_SLRAM=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_GPMI_NAND=y
+CONFIG_MTD_SPI_NOR=y
+# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set
+CONFIG_SPI_FSL_FLEXSPI=y
+CONFIG_MTD_UBI=y
+CONFIG_OF_OVERLAY=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=65536
+CONFIG_XEN_BLKDEV_BACKEND=m
+CONFIG_VIRTIO_BLK=y
+CONFIG_BLK_DEV_NVME=m
+CONFIG_SENSORS_FXOS8700=y
+CONFIG_SENSORS_FXAS2100X=y
+CONFIG_SRAM=y
+CONFIG_EEPROM_AT24=m
+# CONFIG_SCSI_PROC_FS is not set
+CONFIG_BLK_DEV_SD=y
+CONFIG_SCSI_SAS_ATA=y
+CONFIG_SCSI_HISI_SAS=y
+CONFIG_ATA=y
+CONFIG_SATA_AHCI=y
+CONFIG_SATA_AHCI_PLATFORM=y
+CONFIG_AHCI_IMX=y
+CONFIG_AHCI_CEVA=y
+CONFIG_AHCI_XGENE=y
+CONFIG_AHCI_QORIQ=y
+CONFIG_SATA_SIL24=y
+CONFIG_PATA_PLATFORM=y
+CONFIG_PATA_OF_PLATFORM=y
+CONFIG_NETDEVICES=y
+CONFIG_MACVLAN=m
+CONFIG_MACVTAP=m
+CONFIG_TUN=y
+CONFIG_VETH=m
+CONFIG_VIRTIO_NET=y
+CONFIG_AMD_XGBE=y
+CONFIG_MACB=y
+CONFIG_HNS_DSAF=y
+CONFIG_HNS_ENET=y
+CONFIG_E1000E=y
+CONFIG_IGB=y
+CONFIG_IGBVF=y
+CONFIG_SKY2=y
+CONFIG_SMC91X=y
+CONFIG_SMSC911X=y
+CONFIG_STMMAC_ETH=m
+CONFIG_MDIO_BITBANG=y
+CONFIG_AT803X_PHY=y
+CONFIG_MICREL_PHY=y
+CONFIG_REALTEK_PHY=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_RTL8152=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_NET_DM9601=m
+CONFIG_USB_NET_SR9800=m
+CONFIG_USB_NET_SMSC75XX=m
+CONFIG_USB_NET_SMSC95XX=m
+CONFIG_USB_NET_PLUSB=m
+CONFIG_USB_NET_MCS7830=m
+CONFIG_ATH10K=y
+CONFIG_ATH10K_PCI=y
+CONFIG_ATH10K_AHB=y
+CONFIG_ATH10K_DEBUGFS=y
+CONFIG_BCMDHD_1363=y
+CONFIG_BCMDHD_PCIE=y
+CONFIG_RTL_CARDS=m
+# CONFIG_WLAN_VENDOR_TI is not set
+CONFIG_INPUT_POLLDEV=y
+CONFIG_INPUT_EVDEV=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_IMX_SC_PWRKEY=y
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_FT5X06=m
+CONFIG_TOUCHSCREEN_GOODIX=m
+CONFIG_TOUCHSCREEN_SITRONIX_I2C_TOUCH=m
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=y
+CONFIG_INPUT_MPL3115=y
+CONFIG_INPUT_ISL29023=y
+# CONFIG_SERIO_SERPORT is not set
+CONFIG_SERIO_AMBAKMI=y
+CONFIG_LEGACY_PTY_COUNT=16
+# CONFIG_DEVKMEM is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_DW=y
+CONFIG_SERIAL_OF_PLATFORM=y
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+CONFIG_SERIAL_IMX_CONSOLE=y
+CONFIG_SERIAL_XILINX_PS_UART=y
+CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y
+CONFIG_SERIAL_FSL_LPUART=y
+CONFIG_SERIAL_FSL_LPUART_CONSOLE=y
+CONFIG_FSL_OTP=y
+CONFIG_VIRTIO_CONSOLE=y
+CONFIG_HW_RANDOM=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_MUX_PCA954x=y
+CONFIG_I2C_DESIGNWARE_PLATFORM=y
+CONFIG_I2C_IMX=y
+CONFIG_I2C_IMX_LPI2C=y
+CONFIG_I2C_CROS_EC_TUNNEL=y
+CONFIG_I2C_SLAVE=y
+CONFIG_SPI=y
+CONFIG_SPI_IMX=y
+CONFIG_SPI_FSL_LPSPI=y
+CONFIG_SPI_PL022=y
+CONFIG_SPI_SPIDEV=m
+CONFIG_SPMI=y
+CONFIG_PINCTRL_SINGLE=y
+CONFIG_PINCTRL_MAX77620=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_DWAPB=y
+CONFIG_GPIO_PL061=y
+CONFIG_GPIO_XGENE=y
+CONFIG_GPIO_MAX732X=y
+CONFIG_GPIO_PCA953X=y
+CONFIG_GPIO_PCA953X_IRQ=y
+CONFIG_GPIO_MAX77620=y
+CONFIG_POWER_RESET_SNVS=y
+CONFIG_POWER_RESET_VEXPRESS=y
+CONFIG_POWER_RESET_XGENE=y
+CONFIG_POWER_RESET_SYSCON=y
+CONFIG_BATTERY_BQ27XXX=y
+CONFIG_SENSORS_ARM_SCPI=y
+CONFIG_SENSORS_LM90=m
+CONFIG_SENSORS_INA2XX=m
+# CONFIG_MXC_MMA8451 is not set
+CONFIG_THERMAL_WRITABLE_TRIPS=y
+CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y
+CONFIG_CPU_THERMAL=y
+CONFIG_THERMAL_EMULATION=y
+CONFIG_IMX8M_THERMAL=y
+CONFIG_IMX_SC_THERMAL=y
+CONFIG_DEVICE_THERMAL=y
+CONFIG_WATCHDOG=y
+CONFIG_IMX2_WDT=y
+CONFIG_IMX8_WDT=y
+CONFIG_MFD_CROS_EC=y
+CONFIG_MFD_CROS_EC_I2C=y
+CONFIG_MFD_MAX77620=y
+CONFIG_MFD_SEC_CORE=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_REGULATOR_GPIO=y
+CONFIG_REGULATOR_MAX77620=y
+CONFIG_REGULATOR_PF8X00=y
+CONFIG_REGULATOR_PFUZE100=y
+CONFIG_REGULATOR_PWM=y
+CONFIG_REGULATOR_QCOM_SPMI=y
+CONFIG_REGULATOR_S2MPS11=y
+CONFIG_MEDIA_SUPPORT=y
+CONFIG_MEDIA_CAMERA_SUPPORT=y
+CONFIG_MEDIA_CONTROLLER=y
+CONFIG_VIDEO_V4L2_SUBDEV_API=y
+CONFIG_MEDIA_USB_SUPPORT=y
+CONFIG_USB_VIDEO_CLASS=m
+CONFIG_V4L_PLATFORM_DRIVERS=y
+CONFIG_VIDEO_MXC_CAPTURE=y
+CONFIG_VIDEO_MX8_CAPTURE=y
+CONFIG_GMSL_MAX9286=y
+CONFIG_VIDEO_MXC_CSI_CAMERA=y
+CONFIG_MXC_MIPI_CSI=y
+CONFIG_MXC_CAMERA_OV5640_MIPI_V2=m
+CONFIG_V4L_MEM2MEM_DRIVERS=y
+CONFIG_IMX_DPU_CORE=y
+CONFIG_IMX_DCSS_CORE=y
+CONFIG_IMX_LCDIF_CORE=y
+CONFIG_DRM=y
+CONFIG_DRM_LOAD_EDID_FIRMWARE=y
+CONFIG_DRM_I2C_CH7006=m
+CONFIG_DRM_I2C_SIL164=m
+CONFIG_DRM_VIVANTE=m
+CONFIG_DRM_PANEL_SIMPLE=y
+CONFIG_DRM_PANEL_RAYDIUM_RM67191=y
+CONFIG_DRM_SEC_MIPI_DSIM=y
+CONFIG_DRM_I2C_ADV7511=y
+CONFIG_DRM_ITE_IT6263=y
+CONFIG_DRM_IMX_PARALLEL_DISPLAY=y
+CONFIG_DRM_IMX_TVE=y
+CONFIG_DRM_IMX_LDB=y
+CONFIG_DRM_IMX_HDMI=y
+CONFIG_DRM_IMX_NWL_DSI=y
+CONFIG_DRM_IMX_SEC_DSIM=m
+CONFIG_DRM_IMX_HDP=y
+CONFIG_IMX_HDP_CEC=y
+CONFIG_DRM_MXSFB=y
+CONFIG_FB_IMX64=y
+CONFIG_FB_IMX64_DEBUG=y
+CONFIG_FB_ARMCLCD=y
+CONFIG_FB_MXC_DISP_FRAMEWORK=y
+CONFIG_BACKLIGHT_GENERIC=m
+CONFIG_BACKLIGHT_PWM=y
+CONFIG_BACKLIGHT_LP855X=m
+CONFIG_SN65DSI83=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_SOUND=y
+CONFIG_SND=y
+CONFIG_SND_USB_AUDIO=m
+CONFIG_SND_SOC=y
+CONFIG_SND_SOC_FSL_ACM=y
+CONFIG_SND_IMX_SOC=y
+CONFIG_SND_SOC_IMX_AK4458=y
+CONFIG_SND_SOC_IMX_AK5558=y
+CONFIG_SND_SOC_IMX_AK4497=y
+CONFIG_SND_SOC_IMX_WM8960=y
+CONFIG_SND_SOC_IMX_WM8524=y
+CONFIG_SND_SOC_IMX_CS42888=y
+CONFIG_SND_SOC_IMX_WM8962=y
+CONFIG_SND_SOC_IMX_MQS=y
+CONFIG_SND_SOC_IMX_SPDIF=y
+CONFIG_SND_SOC_IMX_AMIX=y
+CONFIG_SND_SOC_IMX_CDNHDMI=y
+CONFIG_SND_SOC_AK4613=y
+CONFIG_SND_SIMPLE_CARD=y
+CONFIG_HID_MULTITOUCH=y
+CONFIG_USB=y
+CONFIG_USB_OTG=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_HCD_PLATFORM=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_HCD_PLATFORM=y
+CONFIG_USB_ACM=m
+CONFIG_USB_STORAGE=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_DWC2=y
+CONFIG_USB_CHIPIDEA=y
+CONFIG_USB_CHIPIDEA_UDC=y
+CONFIG_USB_CHIPIDEA_HOST=y
+CONFIG_USB_ISP1760=y
+CONFIG_USB_ISP1760_HOST_ROLE=y
+CONFIG_USB_CDNS3=y
+CONFIG_USB_CDNS3_GADGET=y
+CONFIG_USB_CDNS3_HOST=y
+CONFIG_USB_TEST=m
+CONFIG_USB_EHSET_TEST_FIXTURE=y
+CONFIG_USB_HSIC_USB3503=y
+CONFIG_NOP_USB_XCEIV=y
+CONFIG_USB_GPIO_VBUS=y
+CONFIG_USB_MXS_PHY=y
+CONFIG_USB_ULPI=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_CONFIGFS=y
+CONFIG_USB_CONFIGFS_SERIAL=y
+CONFIG_USB_CONFIGFS_ACM=y
+CONFIG_USB_CONFIGFS_OBEX=y
+CONFIG_USB_CONFIGFS_NCM=y
+CONFIG_USB_CONFIGFS_ECM=y
+CONFIG_USB_CONFIGFS_ECM_SUBSET=y
+CONFIG_USB_CONFIGFS_RNDIS=y
+CONFIG_USB_CONFIGFS_EEM=y
+CONFIG_USB_CONFIGFS_MASS_STORAGE=y
+CONFIG_FSL_UTP=y
+CONFIG_USB_CONFIGFS_F_LB_SS=y
+CONFIG_USB_CONFIGFS_F_FS=y
+CONFIG_USB_CONFIGFS_F_UAC1=y
+CONFIG_USB_CONFIGFS_F_UAC2=y
+CONFIG_USB_CONFIGFS_F_MIDI=y
+CONFIG_USB_CONFIGFS_F_HID=y
+CONFIG_USB_ZERO=m
+CONFIG_USB_AUDIO=m
+CONFIG_GADGET_UAC1=y
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_EEM=y
+CONFIG_USB_G_NCM=m
+CONFIG_USB_FUNCTIONFS=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_MMC=y
+CONFIG_MMC_BLOCK_MINORS=32
+CONFIG_MMC_ARMMMCI=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_ACPI=y
+CONFIG_MMC_SDHCI_PLTFM=y
+CONFIG_MMC_SDHCI_ESDHC_IMX=y
+CONFIG_MMC_SPI=y
+# CONFIG_MXC_GPU_VIV is not set
+CONFIG_MXC_SIM=y
+CONFIG_MXC_EMVSIM=y
+CONFIG_MXC_MLB150=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_PWM=y
+CONFIG_LEDS_SYSCON=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_CPU=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_MAX77686=y
+CONFIG_RTC_DRV_M41T80=y
+CONFIG_RTC_DRV_M41T80_WDT=y
+CONFIG_RTC_DRV_S5M=y
+CONFIG_RTC_DRV_DS3232=y
+CONFIG_RTC_DRV_EFI=y
+CONFIG_RTC_DRV_PL031=y
+CONFIG_RTC_DRV_SNVS=y
+CONFIG_RTC_DRV_IMX_SC=y
+CONFIG_DMADEVICES=y
+CONFIG_FSL_EDMA_V3=y
+CONFIG_IMX_SDMA=y
+CONFIG_MXS_DMA=y
+CONFIG_PL330_DMA=y
+CONFIG_QCOM_HIDMA_MGMT=y
+CONFIG_QCOM_HIDMA=y
+CONFIG_SYNC_FILE=y
+CONFIG_VIRTIO_PCI=y
+CONFIG_VIRTIO_BALLOON=y
+CONFIG_VIRTIO_MMIO=y
+CONFIG_XEN_GNTDEV=y
+CONFIG_XEN_GRANT_DEV_ALLOC=y
+CONFIG_STAGING=y
+CONFIG_STAGING_MEDIA=y
+CONFIG_MEDIA_CEC=y
+CONFIG_ION=y
+CONFIG_ION_MXC=y
+CONFIG_TYPEC_TCPM=y
+CONFIG_TYPEC_TCPCI=y
+CONFIG_COMMON_CLK_VERSATILE=y
+CONFIG_CLK_SP810=y
+CONFIG_COMMON_CLK_SCPI=y
+CONFIG_CLK_QORIQ=y
+# CONFIG_COMMON_CLK_XGENE is not set
+CONFIG_COMMON_CLK_PWM=y
+CONFIG_ARM_TIMER_SP804=y
+CONFIG_CLKSRC_IMX_SYS_CNT=y
+CONFIG_MAILBOX=y
+CONFIG_ARM_MHU=y
+CONFIG_BCM_PDC_MBOX=y
+CONFIG_ARM_SMMU=y
+CONFIG_ARCH_MXC_ARM64=y
+CONFIG_EXTCON_PTN5150=y
+CONFIG_IIO=y
+CONFIG_PWM=y
+CONFIG_PWM_IMX=y
+CONFIG_PHY_SAMSUNG_USB2=y
+CONFIG_PHY_XGENE=y
+CONFIG_IMX8_DDR_PERF=y
+CONFIG_NVMEM=y
+CONFIG_NVMEM_IMX_OCOTP=y
+CONFIG_NVMEM_IMX_SCU_OCOTP=y
+CONFIG_TEE=y
+CONFIG_OPTEE=y
+CONFIG_ARM_SCPI_PROTOCOL=y
+CONFIG_ACPI=y
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_BTRFS_FS=m
+CONFIG_BTRFS_FS_POSIX_ACL=y
+CONFIG_FANOTIFY=y
+CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
+CONFIG_QUOTA=y
+CONFIG_AUTOFS4_FS=y
+CONFIG_FUSE_FS=y
+CONFIG_CUSE=m
+CONFIG_OVERLAY_FS=m
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_HUGETLBFS=y
+CONFIG_EFIVAR_FS=y
+CONFIG_ECRYPT_FS=y
+CONFIG_ECRYPT_FS_MESSAGING=y
+CONFIG_JFFS2_FS=y
+CONFIG_UBIFS_FS=y
+CONFIG_SQUASHFS=y
+CONFIG_SQUASHFS_XZ=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_V4_1=y
+CONFIG_NFS_V4_2=y
+CONFIG_ROOT_NFS=y
+CONFIG_9P_FS=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_KVM=y
+CONFIG_PRINTK_TIME=y
+CONFIG_DEBUG_FS=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOCKUP_DETECTOR=y
+# CONFIG_SCHED_DEBUG is not set
+# CONFIG_DEBUG_PREEMPT is not set
+# CONFIG_FTRACE is not set
+CONFIG_MEMTEST=y
+CONFIG_STRICT_DEVMEM=y
+CONFIG_SECURITY=y
+CONFIG_LSM_MMAP_MIN_ADDR=0
+CONFIG_SECURITY_SELINUX=y
+CONFIG_SECURITY_SMACK=y
+CONFIG_SECURITY_APPARMOR=y
+CONFIG_DEFAULT_SECURITY_APPARMOR=y
+CONFIG_CRYPTO_RSA=y
+CONFIG_CRYPTO_AUTHENC=y
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_CHACHA20POLY1305=y
+CONFIG_CRYPTO_ECHAINIV=y
+CONFIG_CRYPTO_CTS=y
+CONFIG_CRYPTO_LRW=y
+CONFIG_CRYPTO_XTS=y
+CONFIG_CRYPTO_MD4=y
+CONFIG_CRYPTO_RMD128=y
+CONFIG_CRYPTO_RMD160=y
+CONFIG_CRYPTO_RMD256=y
+CONFIG_CRYPTO_RMD320=y
+CONFIG_CRYPTO_SHA512=y
+CONFIG_CRYPTO_SHA3=y
+CONFIG_CRYPTO_TGR192=y
+CONFIG_CRYPTO_WP512=y
+CONFIG_CRYPTO_BLOWFISH=y
+CONFIG_CRYPTO_CAMELLIA=y
+CONFIG_CRYPTO_CAST5=y
+CONFIG_CRYPTO_CAST6=y
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_SERPENT=y
+CONFIG_CRYPTO_TWOFISH=y
+CONFIG_CRYPTO_ANSI_CPRNG=y
+CONFIG_CRYPTO_DEV_FSL_CAAM_SM=y
+CONFIG_ARM64_CRYPTO=y
+CONFIG_CRYPTO_SHA1_ARM64_CE=y
+CONFIG_CRYPTO_SHA2_ARM64_CE=y
+CONFIG_CRYPTO_GHASH_ARM64_CE=y
+CONFIG_CRYPTO_AES_ARM64_CE_CCM=y
+CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
+CONFIG_CRYPTO_CRC32_ARM64=y
+
diff --git a/bsp/meta-boundary/recipes-kernel/linux/linux-boundary_%.bbappend b/bsp/meta-boundary/recipes-kernel/linux/linux-boundary_%.bbappend
new file mode 100644
index 00000000..b92300e6
--- /dev/null
+++ b/bsp/meta-boundary/recipes-kernel/linux/linux-boundary_%.bbappend
@@ -0,0 +1,10 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/files/arm64:"
+
+SRC_URI = "git://github.com/boundarydevices/linux-imx6.git;branch=${SRCBRANCH} \
+ file://defconfig \
+"
+
+LOCALVERSION = "-1.0.0-ga+yocto"
+SRCBRANCH = "boundary-imx_4.14.x_1.0.0_ga"
+SRCREV = "${AUTOREV}"
+COMPATIBLE_MACHINE = "(nitrogen6x|nitrogen6x-lite|nitrogen6sx|nitrogen7|nitrogen8m|nitrogen8mm)"
diff --git a/bsp/meta-boundary/recipes-sato/images/boundary-eval-image.bb b/bsp/meta-boundary/recipes-sato/images/boundary-eval-image.bb
new file mode 100644
index 00000000..1e7ec2f4
--- /dev/null
+++ b/bsp/meta-boundary/recipes-sato/images/boundary-eval-image.bb
@@ -0,0 +1,48 @@
+# Basically core-image-sato-dev + extra packages in IMAGE_INSTALL below
+
+DESCRIPTION = "Image with Sato for development work. It includes everything \
+within core-image-sato plus a native toolchain, application development and \
+testing libraries, profiling and debug symbols. \
+Also includes many other packages for a generic Boundary Devices Evaluation Image"
+
+IMAGE_FEATURES += "splash package-management x11-base x11-sato ssh-server-dropbear hwcodecs dev-pkgs"
+
+LICENSE = "MIT"
+
+inherit core-image distro_features_check
+
+REQUIRED_DISTRO_FEATURES = "x11"
+CONFLICT_DISTRO_FEATURES = "wayland"
+
+CORE_IMAGE_BASE_INSTALL += "\
+ packagegroup-core-x11-sato-games \
+ nodejs \
+ packagegroup-fsl-gstreamer1.0-full \
+ \
+ flex \
+ gcc \
+ git \
+ m4 \
+ make \
+ iperf3 \
+ libtool \
+ nano \
+ python-compiler \
+ strace \
+ screen \
+ minicom \
+ openssl \
+ cryptodev-module \
+"
+
+# For silex module support uncomment the line below and register your ssh key on our webserver to get access.
+# Silex requires some terms and conditions to be accepted before you can build
+# Please fill out the form located here for access: https://boundarydevices.com/private-git-access/
+#CORE_IMAGE_BASE_INSTALL += "kernel-module-silex linux-firmware-silex"
+
+# Video input demos only on nitrogen6x/sx/7 platform
+# Chromium not on nitrogen7
+CORE_IMAGE_BASE_INSTALL_append_nitrogen6x += "video-input-icon chromium firefox qt5everywheredemo cinematicexperience"
+CORE_IMAGE_BASE_INSTALL_append_nitrogen6x-lite += "chromium firefox"
+CORE_IMAGE_BASE_INSTALL_append_nitrogen6sx += "video-input-icon chromium firefox"
+CORE_IMAGE_BASE_INSTALL_append_nitrogen7 += "video-input-icon"
diff --git a/bsp/meta-boundary/recipes-sato/packagegroups/packagegroup-core-x11-sato.bbappend b/bsp/meta-boundary/recipes-sato/packagegroups/packagegroup-core-x11-sato.bbappend
new file mode 100644
index 00000000..98970335
--- /dev/null
+++ b/bsp/meta-boundary/recipes-sato/packagegroups/packagegroup-core-x11-sato.bbappend
@@ -0,0 +1,2 @@
+# Get rid of connman
+NETWORK_MANAGER = "networkmanager"